第3回 fic&fcs合同勉強会
TRANSCRIPT
第3回 FIC + FCS勉強会
本多裕幸
facebook - hiroyuki.honta
twitter - @p_takichi
自己紹介用サイト - http://pontakichirooms.appspot.com/indexmobile.html
2013/1/23
クラス図
FileFolderListComposit
+ Main() - getFileList () - printTree()
IComposit // データ編集 + printNames() //配下のファイル・フォルダを追加 + addChild() //配下のファイル・フォルダ一覧返却 +getChildren() + removeChild()
<葉> FileName
<枝> Folder
生成・使用
実装
GoF – Composit パターン
階層構造のデータを表現するのに適しています フォルダとかファイルとか区別なしにデータを保持できます
Compositパターンとは?
ルートフォルダ
サブフォルダ
ファイル
ファイル
サブフォルダ
ファイル
ファイル
ファイル
ロジック説明 ファイル・フォルダを取得する
フォルダ?
ファイル名を取得して 親フォルダインスタンスに
FileNameを追加する
ちがうよ
配下のファイルと フォルダを取得します
そうだよ
1件ずつループ
引数:「C:¥Windows」 親フォルダのインスタンス
フォルダ名を取得して 親フォルダインスタンスに
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; } ~ 略 ~
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; }
コーディング Folder
理由
役割を明確にして適切にクラス分けすることで JUnit や xUnit.NET の単体テストツールが
使用しやすくなる
→品質の向上が見込めるかも!?
これらが同じメソッドやクラスに記載されていたら、 処理のどれか1つにでも変更がある度に
全体をテストをする必要がある
しかも、意図しない箇所を誤って変更する可能性も! →デグレードが発生しやすい!