狠狠撸

狠狠撸Share a Scribd company logo
2013/1/23



          第3回 FIC + FCS勉強会
                                           本多裕幸



facebook - hiroyuki.honta
twitter    - @p_takichi
自己紹介用サイト -
http://pontakichirooms.appspot.com/indexmobile.html
ファイルとフォルダの一覧!
ファイルとフォルダの一覧!
概要

ファイル?フォルダを取得する



 出力内容を編集する



    出力する
ポイント

ファイル?フォルダ名を取得する
     → 再帰処理



 階層構造のデータの保持
→デザインパターンComposit
クラス図
                                 GoF – Composit パターン
                                  IComposit
FileFolderListComposit
                                  // データ編集
                         生成?使用    + printNames()
       + Main()
                                  //配下のファイル?フォルダを追加
    - getFileList ()
                                  + addChild()
     - printTree()
                                  //配下のファイル?フォルダ一覧返却
                                  +getChildren()
                                  + removeChild()



                                                実装
                                        <葉>             <枝>
                                     FileName          Folder
颁辞尘辫辞蝉颈迟パターンとは?
   階層構造のデータを表現するのに適しています
フォルダとかファイルとか区別なしにデータを保持できます

ルートフォルダ


          サブフォルダ


           ファイル    サブフォルダ


           ファイル     ファイル    ファイル


                    ファイル
ロジック説明
   メイン処理
ファイル?フォルダを取得する



 出力内容を編集する



    出力する
ロジック説明
    ファイル?フォルダを取得する
            以下のような順番でデータ取得
③

ルートフォルダ
             ②

          サブフォルダ   ①


           ファイル        サブフォルダ


           ファイル         ファイル    ファイル


                        ファイル
ロジック説明
       ファイル?フォルダを取得する
引数:「C:?Windows」
親フォルダのインスタンス                 再起呼び出し

                    そうだよ
                             配下のファイルと
       フォルダ?
                            フォルダを取得します

            ちがうよ

    ファイル名を取得して               1件ずつループ
   親フォルダインスタンスに
    FileNameを追加する


                            フォルダ名を取得して
           ループ終了後          親フォルダインスタンスに
                             Folderを追加する
ロジック説明
             データ編集?出力
データクラスの内容が
                 そうだよ
                          編集する
      フォルダ?
                        “先頭に■を付加“

          ちがうよ

      編集する
    “先頭に└─を付加“
                          標準出力


      標準出力




              再起呼び出し
コーディング
              FileFolderListComposit
/**
 * メイン処理
 * @param args引数
 */
public static void main(String args[]){

    ~略~
    //ルートのインスタンス作成
    FilefolderList = new Folder("ルート");

     //ファイル、フォルダの一覧を取得する
     getFileList(args[0],filefolderList);

     //ファイル、フォルダの一覧を編集して出力する
     printTree(filefolderList);

}
/**
 * 配下のファイルまたはフォルダを標準出力します
 * @param FolderOrFileフォルダ名またはファイル名
 */
private static void getFileList(String FolderOrFile,IComposit folder){
    File f = new File(FolderOrFile);
    if (f.isDirectory()){
         //サブフォルダのインスタンス作成
         IComposit subfolder = new Folder(f.getPath());
         File[] fs = f.listFiles();
         for(int i = 0; i<=fs.length -1;i++){
             //サブフォルダインスタンスにファイル?フォルダ追加
             getFileList(fs[i].getPath(),subfolder);
         }
         //親フォルダにサブフォルダを追加
         folder.addChild(subfolder);
    } else {
         folder.addChild(new FileName(f.getName()));
    }
}
/**
 * ファイル、フォルダの一覧を編集して出力します
 * @param file
 */
private static void printTree(IComposit fileOrFolder){

      //配下のファイル?フォルダの一覧数分ループ
      for (IComposit f:fileOrFolder.getChildren()) {

             if (f instanceof FileName) {

                    //ファイルの場合
                    System.out.println(f.editNames());

             } else if (f instanceof Folder) {

                    //フォルダの場合
                    System.out.println(f.editNames());

                    //再帰呼び出し
                    printTree(f);
             }
      }
}
コーディング
                     IComposit
/**
 * 子要素の内容を編集して出力します
 */
public String editNames();

/**
 * 子要素を追加します
*/
public boolean addChild(IComposit file);

/**
 * 子要素を削除します
*/
public boolean removeChild(IComposit file);

/**
 * 子要素の一覧を取得します
*/
public List<IComposit> getChildren();
コーディング
                      FileName
private String _Name = "";

/**
 * コンストラクタ
 * @param name
 */
public FileName(String name){
    this._Name = name;
}

@Override
public String editNames() {

   //ファイル名を編集して返却
   return " └─" + this._Name;
}
~略~
コーディング
                         Folder
private String _Name = "";
private List <IComposit> childList;

/** コンストラクタ* /
public Folder(String name){
    this._Name = name;
    this.childList = new ArrayList<IComposit>();
}
@Override
public String editNames() {
   //フォルダ名を編集して返却
   return "■" + this._Name;
}
@Override
public boolean addChild(IComposit file) {
   return this.childList.add(file);
}
@Override
public List<IComposit> getChildren() {
   return childList;
}
なぜこんな構成に?

ファイル?フォルダを取得する



 出力内容を編集する



    出力する
理由
これらが同じメソッドやクラスに記載されていたら、
  処理のどれか1つにでも変更がある度に
    全体をテストをする必要がある

しかも、意図しない箇所を誤って変更する可能性も!
     →デグレードが発生しやすい!

 役割を明確にして適切にクラス分けすることで
  JUnit や xUnit.NET の単体テストツールが
            使用しやすくなる

    →品質の向上が見込めるかも!?
デメリット
  メモリの大量消費!




    分かりづらい!
    説明しにくい!

→ お互い頑張りましょう(^_^;)

More Related Content

Viewers also liked (15)

Intelligence
IntelligenceIntelligence
Intelligence
jsli3004
?
39540950 gsm-ion-course-130814024028-phpapp01
39540950 gsm-ion-course-130814024028-phpapp0139540950 gsm-ion-course-130814024028-phpapp01
39540950 gsm-ion-course-130814024028-phpapp01
Ahlem DRIRA
?
FootballFootball
Football
cmlfrnc
?
FootballFootball
Football
cmlfrnc
?
フッコーロード (エフスタvol11)
フッコーロード (エフスタvol11)フッコーロード (エフスタvol11)
フッコーロード (エフスタvol11)
Hiroyuki Honta
?
Elevate presentation
Elevate presentationElevate presentation
Elevate presentation
oneproductions
?
ARS AUTOMAT 1
ARS AUTOMAT 1ARS AUTOMAT 1
ARS AUTOMAT 1
ARS AUTOMAT
?
第2回 FIC+FCS勉強会
第2回 FIC+FCS勉強会第2回 FIC+FCS勉強会
第2回 FIC+FCS勉強会
Hiroyuki Honta
?
INCOTERMS
INCOTERMSINCOTERMS
INCOTERMS
S Khan
?
р?дний край на карт? укра?ни
р?дний край на карт? укра?нир?дний край на карт? укра?ни
р?дний край на карт? укра?ни
Irina Bigus
?
Social dimension,report
Social dimension,reportSocial dimension,report
Social dimension,report
Katty Dela Cruz
?
Socialization
SocializationSocialization
Socialization
Katty Dela Cruz
?
Introduction to Angel Funding - Startupvillage
Introduction to Angel Funding - StartupvillageIntroduction to Angel Funding - Startupvillage
Introduction to Angel Funding - Startupvillage
Startup Village
?
39540950 gsm-ion-course-130814024028-phpapp01
39540950 gsm-ion-course-130814024028-phpapp0139540950 gsm-ion-course-130814024028-phpapp01
39540950 gsm-ion-course-130814024028-phpapp01
Ahlem DRIRA
?
FootballFootball
Football
cmlfrnc
?
FootballFootball
Football
cmlfrnc
?
フッコーロード (エフスタvol11)
フッコーロード (エフスタvol11)フッコーロード (エフスタvol11)
フッコーロード (エフスタvol11)
Hiroyuki Honta
?
第2回 FIC+FCS勉強会
第2回 FIC+FCS勉強会第2回 FIC+FCS勉強会
第2回 FIC+FCS勉強会
Hiroyuki Honta
?
INCOTERMS
INCOTERMSINCOTERMS
INCOTERMS
S Khan
?
р?дний край на карт? укра?ни
р?дний край на карт? укра?нир?дний край на карт? укра?ни
р?дний край на карт? укра?ни
Irina Bigus
?
Introduction to Angel Funding - Startupvillage
Introduction to Angel Funding - StartupvillageIntroduction to Angel Funding - Startupvillage
Introduction to Angel Funding - Startupvillage
Startup Village
?

Similar to 第3回 FIC&FCS合同勉強会 (13)

狈滨翱.2を使って简単ファイル操作
狈滨翱.2を使って简単ファイル操作狈滨翱.2を使って简単ファイル操作
狈滨翱.2を使って简単ファイル操作
Yuichi Sakuraba
?
アップグレードセミナー
アップグレードセミナーアップグレードセミナー
アップグレードセミナー
kmiyako
?
2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers
2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers
2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers
Takeshi Fujimoto
?
3-1
3-13-1
3-1
Atsushi Hara
?
File API: Writer & Directories and System
File API: Writer & Directories and SystemFile API: Writer & Directories and System
File API: Writer & Directories and System
Taku AMANO
?
ファイルのソース?ターゲットエンドポイントとしての利用
ファイルのソース?ターゲットエンドポイントとしての利用ファイルのソース?ターゲットエンドポイントとしての利用
ファイルのソース?ターゲットエンドポイントとしての利用
QlikPresalesJapan
?
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
?
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
AromaBlack
?
Web 08
Web 08Web 08
Web 08
XMLProJ2014
?
狈滨翱.2を使って简単ファイル操作
狈滨翱.2を使って简単ファイル操作狈滨翱.2を使って简単ファイル操作
狈滨翱.2を使って简単ファイル操作
Yuichi Sakuraba
?
アップグレードセミナー
アップグレードセミナーアップグレードセミナー
アップグレードセミナー
kmiyako
?
2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers
2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers
2019-10-18 JXUG Xamarin.Essentials - #3 File System Helpers
Takeshi Fujimoto
?
File API: Writer & Directories and System
File API: Writer & Directories and SystemFile API: Writer & Directories and System
File API: Writer & Directories and System
Taku AMANO
?
ファイルのソース?ターゲットエンドポイントとしての利用
ファイルのソース?ターゲットエンドポイントとしての利用ファイルのソース?ターゲットエンドポイントとしての利用
ファイルのソース?ターゲットエンドポイントとしての利用
QlikPresalesJapan
?
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
?
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
AromaBlack
?

Recently uploaded (7)

名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験
名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験
名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験
KeisukeHattori1
?
研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)
研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)
研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)
Takayuki Itoh
?
2024年度卒業後動向実態調査 - 上智大学
2024年度卒業後動向実態調査 - 上智大学2024年度卒業後動向実態調査 - 上智大学
2024年度卒業後動向実態調査 - 上智大学
IROfficeSophiaUniver
?
Organizational Behavior V2.0 2nd Edition Bauer Test Bank
Organizational Behavior V2.0 2nd Edition Bauer Test BankOrganizational Behavior V2.0 2nd Edition Bauer Test Bank
Organizational Behavior V2.0 2nd Edition Bauer Test Bank
anducehymy
?
Prepositions of Place Lesson for Online.pptx
Prepositions of Place Lesson for Online.pptxPrepositions of Place Lesson for Online.pptx
Prepositions of Place Lesson for Online.pptx
ednagalvez002
?
条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025
条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025
条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025
MILab
?
INDUSTRIAL CHEMISTRY (SBCH1303), Assignment slites
INDUSTRIAL CHEMISTRY (SBCH1303), Assignment slitesINDUSTRIAL CHEMISTRY (SBCH1303), Assignment slites
INDUSTRIAL CHEMISTRY (SBCH1303), Assignment slites
tamilarasan811199
?
名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験
名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験
名前を呼ぶリーダーは信頼できる? ?指名フィードバックが評価認知に与える影響の実証実験
KeisukeHattori1
?
研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)
研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)
研究分野をサーベイする(情报処理学会第87回全国大会での基调讲演スライド公开版)
Takayuki Itoh
?
2024年度卒業後動向実態調査 - 上智大学
2024年度卒業後動向実態調査 - 上智大学2024年度卒業後動向実態調査 - 上智大学
2024年度卒業後動向実態調査 - 上智大学
IROfficeSophiaUniver
?
Organizational Behavior V2.0 2nd Edition Bauer Test Bank
Organizational Behavior V2.0 2nd Edition Bauer Test BankOrganizational Behavior V2.0 2nd Edition Bauer Test Bank
Organizational Behavior V2.0 2nd Edition Bauer Test Bank
anducehymy
?
Prepositions of Place Lesson for Online.pptx
Prepositions of Place Lesson for Online.pptxPrepositions of Place Lesson for Online.pptx
Prepositions of Place Lesson for Online.pptx
ednagalvez002
?
条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025
条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025
条件付きCutPasteを用いた異常検知の高精度化,電子情報通信学会 東海支部 卒業研究発表会,2025
MILab
?
INDUSTRIAL CHEMISTRY (SBCH1303), Assignment slites
INDUSTRIAL CHEMISTRY (SBCH1303), Assignment slitesINDUSTRIAL CHEMISTRY (SBCH1303), Assignment slites
INDUSTRIAL CHEMISTRY (SBCH1303), Assignment slites
tamilarasan811199
?

第3回 FIC&FCS合同勉強会

  • 1. 2013/1/23 第3回 FIC + FCS勉強会 本多裕幸 facebook - hiroyuki.honta twitter - @p_takichi 自己紹介用サイト - http://pontakichirooms.appspot.com/indexmobile.html
  • 5. ポイント ファイル?フォルダ名を取得する → 再帰処理 階層構造のデータの保持 →デザインパターンComposit
  • 6. クラス図 GoF – Composit パターン IComposit FileFolderListComposit // データ編集 生成?使用 + printNames() + Main() //配下のファイル?フォルダを追加 - getFileList () + addChild() - printTree() //配下のファイル?フォルダ一覧返却 +getChildren() + removeChild() 実装 <葉> <枝> FileName Folder
  • 7. 颁辞尘辫辞蝉颈迟パターンとは? 階層構造のデータを表現するのに適しています フォルダとかファイルとか区別なしにデータを保持できます ルートフォルダ サブフォルダ ファイル サブフォルダ ファイル ファイル ファイル ファイル
  • 8. ロジック説明 メイン処理 ファイル?フォルダを取得する 出力内容を編集する 出力する
  • 9. ロジック説明 ファイル?フォルダを取得する 以下のような順番でデータ取得 ③ ルートフォルダ ② サブフォルダ ① ファイル サブフォルダ ファイル ファイル ファイル ファイル
  • 10. ロジック説明 ファイル?フォルダを取得する 引数:「C:?Windows」 親フォルダのインスタンス 再起呼び出し そうだよ 配下のファイルと フォルダ? フォルダを取得します ちがうよ ファイル名を取得して 1件ずつループ 親フォルダインスタンスに FileNameを追加する フォルダ名を取得して ループ終了後 親フォルダインスタンスに Folderを追加する
  • 11. ロジック説明 データ編集?出力 データクラスの内容が そうだよ 編集する フォルダ? “先頭に■を付加“ ちがうよ 編集する “先頭に└─を付加“ 標準出力 標準出力 再起呼び出し
  • 12. コーディング FileFolderListComposit /** * メイン処理 * @param args引数 */ public static void main(String args[]){ ~略~ //ルートのインスタンス作成 FilefolderList = new Folder("ルート"); //ファイル、フォルダの一覧を取得する getFileList(args[0],filefolderList); //ファイル、フォルダの一覧を編集して出力する printTree(filefolderList); }
  • 13. /** * 配下のファイルまたはフォルダを標準出力します * @param FolderOrFileフォルダ名またはファイル名 */ private static void getFileList(String FolderOrFile,IComposit folder){ File f = new File(FolderOrFile); if (f.isDirectory()){ //サブフォルダのインスタンス作成 IComposit subfolder = new Folder(f.getPath()); File[] fs = f.listFiles(); for(int i = 0; i<=fs.length -1;i++){ //サブフォルダインスタンスにファイル?フォルダ追加 getFileList(fs[i].getPath(),subfolder); } //親フォルダにサブフォルダを追加 folder.addChild(subfolder); } else { folder.addChild(new FileName(f.getName())); } }
  • 14. /** * ファイル、フォルダの一覧を編集して出力します * @param file */ private static void printTree(IComposit fileOrFolder){ //配下のファイル?フォルダの一覧数分ループ for (IComposit f:fileOrFolder.getChildren()) { if (f instanceof FileName) { //ファイルの場合 System.out.println(f.editNames()); } else if (f instanceof Folder) { //フォルダの場合 System.out.println(f.editNames()); //再帰呼び出し printTree(f); } } }
  • 15. コーディング IComposit /** * 子要素の内容を編集して出力します */ public String editNames(); /** * 子要素を追加します */ public boolean addChild(IComposit file); /** * 子要素を削除します */ public boolean removeChild(IComposit file); /** * 子要素の一覧を取得します */ public List<IComposit> getChildren();
  • 16. コーディング FileName private String _Name = ""; /** * コンストラクタ * @param name */ public FileName(String name){ this._Name = name; } @Override public String editNames() { //ファイル名を編集して返却 return " └─" + this._Name; } ~略~
  • 17. コーディング Folder private String _Name = ""; private List <IComposit> childList; /** コンストラクタ* / public Folder(String name){ this._Name = name; this.childList = new ArrayList<IComposit>(); } @Override public String editNames() { //フォルダ名を編集して返却 return "■" + this._Name; } @Override public boolean addChild(IComposit file) { return this.childList.add(file); } @Override public List<IComposit> getChildren() { return childList; }
  • 19. 理由 これらが同じメソッドやクラスに記載されていたら、 処理のどれか1つにでも変更がある度に 全体をテストをする必要がある しかも、意図しない箇所を誤って変更する可能性も! →デグレードが発生しやすい! 役割を明確にして適切にクラス分けすることで JUnit や xUnit.NET の単体テストツールが 使用しやすくなる →品質の向上が見込めるかも!?
  • 20. デメリット メモリの大量消費! 分かりづらい! 説明しにくい! → お互い頑張りましょう(^_^;)