第3回 fic&fcs合同勉強会

20
第3回 FIC + FCS勉強会 本多裕幸 facebook - hiroyuki.honta twitter - @p_takichi 自己紹介用サイト - http://pontakichirooms.appspot.com/indexmobile.html 2013/1/23

Upload: hiroyuki-honta

Post on 18-Aug-2015

146 views

Category:

Education


0 download

TRANSCRIPT

第3回 FIC + FCS勉強会

本多裕幸

facebook - hiroyuki.honta

twitter - @p_takichi

自己紹介用サイト - http://pontakichirooms.appspot.com/indexmobile.html

2013/1/23

ファイルとフォルダの一覧!

ファイルとフォルダの一覧!

概要

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

出力内容を編集する

出力する

ポイント

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

階層構造のデータの保持 →デザインパターンComposit

クラス図

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つにでも変更がある度に

全体をテストをする必要がある

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

デメリット

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

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

メモリの大量消費!