導入
オブジェクト指向の学習をしています。連載第13回と14回では、
展開
新しいクラスを作成する方法は、
- 独立したクラスを作る
- 別のクラスを継承するクラスを作る
- インタフェイスを実装するクラスを作る
- 別のクラスを内包し委譲をするクラスを作る
いずれの方法をとるにせよ、
1.~4.の方法を学ぶために、
テーマ:データファイルを読み込むクラスを作成する
「テキスト形式のデータファイルから設定情報を読み込むクラスを作る」
今回はこのテーマを達成するために、
独立したクラスを作る
まずは最も単純に、testメソッドの中で目的のクラスのインスタンスを作成し、
TestAppInfoLoader.pde //Test AppInfoLoader class
private final String TARGET_CLASS_NAME = "AppInfoLoader";
private final String SOME_TROUBLE = TARGET_CLASS_NAME + " : "
+ "Some trouble happend.";
void setup(){
test();
}
void test(){
noLoop();
println("Test Start.");
assert AppInfoLoader.CLASS_NAME.equals(TARGET_CLASS_NAME)
: SOME_TROUBLE;
AppInfoLoader ail = new AppInfoLoader();
assert ail.CLASS_NAME.equals(TARGET_CLASS_NAME);
println("All Test Done.");
exit();
}では、AppInfoLoader.として書きましょう。次の手順にしたがってProcessingのIDEで新しいタブを作成してください。
- IDEに表示されている
TestAppInfoLoaderタブの隣にあるドロップダウンメニューボタンをクリックし、New Tabを選択します。ファイル名は AppInfoLoaderとします( .pdeは打ち込む必要がありません。IDEが自動で追加して保存します)。
AppInfoLoaderクラスのために新しいタブを作成する。
AppInfoLoaderとして、
AppInfoLoader.pde public class AppInfoLoader{
public static final String CLASS_NAME = "AppInfoLoader";
}ここで今回読み込むデータファイルを次のCONFING.とします。このファイルは、
CONFIG.TXT VERSION,1.0[作業] CONFIG.を読み込むコードと、getVersionを書きましょう。これはCONFIG.に記録されているバージョンナンバーを文字列で返すメソッドです。ファイルの読み込みにはloadStringsメソッドを使いましょう。ファイル名はAppInfoLoader.、TestAppInfoLoader.としてください。この作業を今回の演習1とします。
最終的に、AppInfoLoader.は次のように書けます。
このAppInfoLoader.はTestAppInfoLoader.のスケッチフォルダ内に配置してください。CONFIG.はAppInfoLoader.を読み込んだProcessingのIDE上にドラッグ&ドロップしてください。
実装が異なる別のクラスを作成する
次に、
たとえば、AppInfoLoader.ではloadStringsメソッドを使いましたが、BufferedReaderクラスを使います。そして将来のためにAppInfoLoaderクラスをそのまま残しておきたいならば、
ここでは、BufferedReaderクラスを使ってAppInfoLoader2クラスを書いてみましょう。
[作業] CONFIG.を読み込むコードと、getVersionを書きましょう。ファイルの読み込みにはBufferedReaderクラスを使ってください。ファイル名はAppInfoLoader2.としましょう。テストコードはTestAppInfoLoader.に追加しましょう。先ほどのテストコードと区別するために、TestAppInfoLoader2.とファイル名を変更しましょう。これを今回の演習2とします。
- 注
AppInfoLoader2というクラス名はよくありません。AppInfoLoaderとどう違うのか、名前から判断できません。これらのクラスを使うコードの文脈から、 それぞれのクラス名を再検討するべきです。
AppInfoLoader2クラスと、
メソッド名と戻り値、AppInfoLoader2クラスは、try...節で例外の内容をコンソールに出力することしかさせていませんので、BufferedReaderクラスを使った価値がありません。Processingで用意されている便利なメソッドを利用せずに、
新たに独立したクラスを作成する利点
十分小さいコードならば切り分けないほうが見通しが良い
今回は、setupメソッド内に記述しても構わないのです。新たにクラスを書くということは、
1画面に収まらないコードは切り分けると見通しが良くなる
一画面に収まらないほど長いコードはクラスに切り分け、
隠蔽とカプセル化
大枠を見ているときに、
オブジェクト指向プログラミング言語はプログラミングを楽にする道具立てを持つ
クラスを作るというステップの精神的敷居を超えてしまえば、
演習
「展開」
まとめ
- 独立したクラスの作成手順を学習しました。
- 新たにクラスを作成する利点を紹介しました。
- オブジェクト指向の便利な仕組みである隠蔽とカプセル化を紹介しました。
学習の確認
それぞれの項目で、
- 独立したクラスの作成手順が理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
- 新たにクラスを作成する利点が理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
隠蔽とカプセル化の利点が理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
参考文献
- 『本格学習Java入門[改訂新版]』
(佐々木整 著、 技術評論社) - Java言語の基本的な文法が良くまとめられています。また、
大変広い範囲をカバーしているので、 はじめてJava言語に触る方が、 Javaがどんな言語なのかを知るために役立つ資料になるでしょう。
- Java言語の基本的な文法が良くまとめられています。また、
- 『ずばりわかる! Java Javaの良いコード、
悪いコード (日経BPパソコンベストムック)』(日経ソフトウエア 編著、 日経BP社) - 日経ソフトウエア誌に掲載された特集を集めたムックです。2006年発行と少々古くなりましたが、
各トピックともにコンパクトにまとまっており、 Java言語でコーディングをする際の具体的な指針やその例が掲載されています。
- 日経ソフトウエア誌に掲載された特集を集めたムックです。2006年発行と少々古くなりましたが、
演習解答
解答のコードは
ただし、
- 設定情報ファイル
CONFIG.がTXT CONFIG.になっても良いように、DAT AppInfoLoaderクラスに設定情報ファイル名を受け取る引数付きのコンストラクタをつける。 - 設定情報ファイル名を受け取るメソッドをつける。
- 設定情報のデータの区切り文字が、
コンマではなく空白文字等任意のものを指定できるようにする。 - 2つの
AppInfoLoaderクラスのクラス名を、機能に応じたよりふさわし名前に変更する。
