Java.use(better); Episode#23 ファインダーを作成する
《前の記事|記事一覧|次の記事》
Java.use(better, Scala);
Episode#23ファインダーを作成する:リファクタリング
我々は耳は二つ持っているのに
口は一つしか持たないのは
より多くのことを聞いて
話す方はより少なくするためなのだ
Zeno of Citium - Wikipedia
《関連記事》
■ 情報隠蔽の原則
注目に値するのは「情報隠蔽の原則」に沿って、利用者(プログラマー)は知る必要のないコンポーネントの詳細から解放され、アプリケーションの開発に専念できることです。その一方で、作成者(プログラマー)は、リスナーの登録では、どのリスナー ActionListener をどうやって登録するか addActionListener を知る必要があります。また、イベントの処理では、どのイベント ActionEvent にどうやって呼応するか actionPerformed を知る必要があります。というのも、これらの組み合わせは多種多様だからです。
パッケージ scala.swing を利用すると、利用者(プログラマー)は、面倒な事務手続きから解放されます。というのも、共通のメソッド listenTo を利用するなら、コンポーネント/イベントの組み合わせに専念できるからです。それが、今回の TextField/EditDone であり、前回の TreeView/TreeSelectionChanged も、これに準拠するように新規作成しました。
┃ファイルシステムから得られる情報を活用する
前回は、既存のコンポーネント JTree を介して、ツリー構造を扱うときの基本を紹介しました。今回は、ファイルシステムから得られる情報を扱います。
15: import java.io._ 16: class FileSystem(file: File) { 17: def this(pathname: String) = this(new File(pathname)) 18: 19: override def toString = { 20: val buf = new StringBuffer 21: appendRoot(buf, file) 22: appendNode(buf, file, 0) 23: buf.toString 24: } 25: def appendRoot(buf: StringBuffer, file: File) = 26: buf.append("%s\n" format last(file)) 27: def appendNode(buf: StringBuffer, 28: file: File, level: Int): Unit = 29: file.listFiles foreach { e => 30: buf.append("%s%s %s\n".format( 31: tabs(level), 32: if (e.isDirectory) "+" else ".", 33: e.getName)) 34: if (e.isDirectory) appendNode(buf, e, level+1) 35: } 36: def last(file: File) = { 37: val s = file.toString.split("/") 38: s(s.length-1) 39: } 40: def tabs(level: Int) = " "*level 41: }
[17]コンストラクター this(String) の引数に文字列を指定すると、ファイルの名前(パス名)を指定したものと見なして、特定のファイル file を扱う基本コンストラクター this(File) を呼び出します。多重定義されたコンストラクターはすべて、基本コンストラクターに帰着します。
☞ 余録:Complete Constructor
[19-24]オブジェクトを表現する文字列を生成します。前回と同じく、バッファー StringBuffer を用意して、ファイルシステムから得られた情報を蓄積します。ここには、分割したメソッド呼び出しだけを列挙します。
☞ 余録:Composed Method
[25-26]特定のファイル file をツリーの頂点として、その情報をバッファー buf に追加します。
[27-35]特定のファイル file を頂点 level として、その傘下にあるファイル/フォルダーの情報をバッファー buf に追加します。[29]既存のメソッド java.io.File.listFiles を利用すると、file の直下にあるファイル/フォルダーを列挙した配列が得られます。[31]先行するタブ tabs(level) と[32]フォルダー "+" または、ファイル "." の後に[33]名前を続けます。[34]再帰呼び出し appendNode が階層構造を反映するので、次のレベルを探索するときに、実引数の値 level+1 を増やします。
》作業中です《
↑ TOP