11月5日(木)1、2コマ目
今日の予習
このシリーズのゴール
if文撲滅!
仕様変更、機能追加等でif文はどんどん育っていくから。
ソフトウェアのライフサイクル
作ってから本当のお付き合いが始まる
作る=>完成 で終わりではない。
完成してからが本当のお付き合い。仕様変更や機能追加がまちがいなくある。
変更・追加でソースをいじる=>テストするのはいじったところだけではない。
仕様変更、追加は必ずある
変更・追加のありそうなところは、簡単に対応できるようにしておいた方が自分を助けることになる。
標準体重計算方法はきっと追加される
特定の計算方法ではなく、漠然と「計算する」にしておけば、計算方法が増えても対応しやすい。
特定の計算方法(BMI方式とか)ではなく、ただ計算するにしておく。
要は計算方法(BMIとかローレルとか)をぼやかす=>抽象化する
抽象化したら、if文はいらなくなる(かも)。
〇抽象化前(イメージ)
if( 選択計算方法 == BMI)
BMI方式で計算する
else if( 選択計算方法 == ローレル )
ローレル方式で計算する
else if( 選択計算方法 == 簡易 )
簡易方式で計算する
〇抽象化後(イメージ)
標準体重計算実行
抽象化するには
Javaにしても.Netにしても、「抽象クラス」や「インタフェース」が用意されてあり、これらがプログラムを抽象化するときの最高のお助けツールになる。
「標準体重計算」を抽象化すると
BMIとかローレルとかを抽象化する「標準体重計算」クラスを用意する。
「標準体重計算」クラスのサブクラスとして、各計算方法(BMIとかローレルとか)に特化した(具象)クラスを用意する。
=>これで各具象クラスのインスタンスは「標準体重計算」クラス型として扱うことができる。
|
|
図 抽象化クラス図 |
だがしかし...
計算方法決定 => 利用する具象クラスが決まる => 具象クラスのインスタンスが必要
具象クラスのインスタンス生成 => このタイミングで具象クラス名を指定する必要あり
ここで、残念ながらif文登場。
標準体重計算 calc = null;
// 選択された計算方法に特化した具象クラスのインスタンス生成
if( 選択計算方法 == BMI)
calc = new BMI( );
else if( 選択計算方法 == ローレル )
calc = new ローレル( );
else if( 選択計算方法 == 簡易 )
calc = new 簡易方式( );
// 標準体重計算
calc.計算する( );
これからのテーマ
if文を撲滅するには、具象クラス名を書かないようにしたい。
今後はいかにして具象クラス名を書かないかを扱います。
正直なところ、小技、テクニックな世界です。
テクニック その1「動的インスタンス生成」
一応、紹介しておきますが、これは封印してください。
あんまり使われるテクニックではないので。
今日のホワイトボード
標準体重計算を改造(動的インスタンス生成版)
標準体重計算アプリの計算部分を下図のように改造する。
|
| 図 標準体重計算部分を抽象クラスを使って実現 |
しかしながら、「今日の予習」のとおり、BMIやRohrerといったサブクラスを使うには具象クラス名を指定してインスタンス生成を行う必要がある。
そこで、今日は動的インスタンス生成を使って具象クラス名を書かずにインスタンス生成をしてみる。
授業で紹介したソースコードを公開しておきます。
〇Resultクラス
計算結果を受け渡すために利用。単なる構造体的なクラス。
〇AbstractStandardWeightクラス
標準体重計算クラス群の共通インターフェース。
BMIやローレル指数で計算するクラスはこのクラスを継承することで、同じ変数でインスタンスを参照できる。
〇BMIクラス
AbstractStandardWeightクラスを継承したBMI方式に特化したクラス。
〇Rohrerクラス
AbstractStandardWeightクラスを継承したローレル指数方式に特化したクラス。
〇Easyクラス
AbstractStandardWeightクラスを継承した簡易方式に特化したクラス。
〇Serviceクラス
動的インスタンス生成を使って、BMIやRohrer、Easyクラスのインスタンスを生成。
〇IndexSrvクラス(サーブレット)
サーブレット。
〇index.jsp
存在を隠蔽するためにWEB-INF/以下に配備。
(つくってみよう)四則演算をおこなう
図のような四則演算を行うアプリケーションを作成する。
|
|
図 四則演算アプリケーションのイメージ |
〇Resultクラス
結果受け渡し用クラス。
〇AbstractOperatorクラス
四則演算クラス群の共通インタフェース。
足し算、引き算クラスなどはこのクラスを継承する。
〇Plusクラス
AbstractOperatorクラスを継承した足し算に特化したクラス。
〇Minusクラス
AbstractOperatorクラスを継承した引き算に特化したクラス。
〇Multiクラス
AbstractOperatorクラスを継承した掛け算に特化したクラス。
〇Divideクラス
AbstractOperatorクラスを継承した割り算に特化したクラス。
〇Serviceクラス
選択された演算子に応じた計算クラスのインスタンスを動的インスタンス生成を用いて生成する。
〇IndexSrvクラス(サーブレット)
サーブレット。
〇index.jsp
存在を隠蔽するためにWEB-INF/以下に。



コメント