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

Created: 2010/05/23|Last updated: 2013/06/16 21:37:55