導入
コードの作成途中で手に負えなくなって、
今回から学習する
展開
デザインパターンとは
デザインパターンの目的
コードの規模が大きくなると、
コードの分割は多くの場合、
GoF
プログラマ同士で、
GoFとは、
Java言語が浸透し始めた2002年頃、
デザインパターンは図で読む
デザインパターンは、
Facade(ファサード)
GoF本に紹介されている23個のパターンの中で、
Facadeパターンの目的
Facadeパターンは、
なお、
[Facadeパターン]
複雑なコードを簡単に利用するための窓口となるメソッドがあり、

上図はFacadeパターンを用いたコードのクラス図の一例です。ClientクラスがClass0からClassNの数多くのクラスを上手に使って成り立っているとします。FacadeクラスがなければClientクラスはすべてのClassX
プログラマが一人で開発している場合や、
また、
例えば、
Facadeパターンを使う
それでは、
前回作成した健康管理アプリケーションのコードをリファクタリングして、
前回のコードの多くは、HealthApp.
に集中していました。
- 連載第22回の演習解答例
Processingを使用していますから、
- ユーザインタフェイスのコードをクラス
UI
にまとめる HealthApp.
からユーザインタフェイスに関するコードを切り出して1つのクラスファイルpde UI.
にまとめましょう。そして、pde 今後ユーザインタフェイスに関する操作はこのクラス UI
を通して行うようにするのです。これによって、メインとなるスケッチファイル HealthApp.
のコードはぐっと減ります。クラスpde UI
が、メインとなるスケッチファイルから見て、 ディスプレイウインドウに表示される各種オブジェクト操作に対するFacadeになります。 //コードの概略を示すために、
メソッド内部のコードは略します。 class UI{ private PersonalData pd; UI(PersonalData obj){ } void drawManShape(){ } void drawWeightSign(){ } void drawWeightUpButton(){ } void drawWeightDownButton(){ } void drawWeight(){ } void drawHeightSign(){ } void drawHeightUpButton(){ } void drawHeightDownButton(){ } void drawHeight(){ } void drawBMI(){ } void drawCategory(){ } void mousePressed(){ } }- テストコードをクラス
PersonalDataTest
にまとめる ついでですから、
テストに関するコードも切り出して PersonalDataTest.
というクラスファイルにまとめましょう。すると、pde びっくりするぐらいにメインとなるファイルのコード量が減ります。クラス PersonalDataTest
が、メインとなるスケッチファイルから見て、 各種テストコードに対するFacadeになります。 //コードの概略を示すために、
メソッド内部のコードは略します。 class PersonalDataTest{ void testPersonalData(){ } }- 健康管理アプリにFacadeパターンを適用したコード例
- デザインパターンとは何かを学びました。
- Facadeの使い方を学びました。
- デザインパターンの目的とメリットが理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
- Facadeを使えるようになりましたか?
- 使えるようになった。自分のプログラミングにも活用できそうだ。
- 本文の例を理解することはできたが、
自分のプログラミングに活用できる気がしない。 - 本文の例が理解できない。
- 『増補改訂版Java言語で学ぶデザインパターン入門』
(結城浩 著、 ソフトバンククリエイティブ) - 誰もが認める最も分かりやすいデザインパターン入門書。本来は原典
(GoF本) を勧めるべきところですが、 本書は別格。
- 誰もが認める最も分かりやすいデザインパターン入門書。本来は原典
- 『オブジェクト指向における再利用のためのデザインパターン』
(Eric Gamma 著、 ソフトバンククリエイティブ) - デザインパターンの原典。別称
『GoF本』 サンプルコードがC++で書かれているため、 ProcessingやJava言語のユーザにはハンディがあります。しかし結城浩氏の入門書を読みこなした後ならば本書にあたる価値があります。
- デザインパターンの原典。別称
- 『Java デザインパターン徹底攻略』
(日立ソフトウェアエンジニアリング (株) インターネットビジネス部 著、 技術評論社) - 流石の日立。前掲のGoF本の解説書で、
サンプルはJava言語。絶版であることが惜しまれます。強く再版を望みます。
- 流石の日立。前掲のGoF本の解説書で、
- 『Robocodeで学ぶ 一歩先のJavaプログラミング』
(平田敦 著、 カットシステム) - Robocodeを使ったJava言語の学習書です。デザインパターンの活用にも言及します。
大きな変更ではありません。
UI.
にpde arrengeElements
メソッドを作り、その中に HealthApp.
にあったユーザインタフェイス関係のメソッドを移動すれば終了です。pde_ Facade. pde ui.
と呼んでいたところは、drawManShape() drawManShape()
としましょう。ui.
がついていても、Processingは問題なく実行してくれますが、 格好がよくありません。
UI.
とPersonalDataTest.
を書きましょう。
以下にFacadeパターンを適用したコード例を示します。PersonalDataTest
クラスを実行するためにDEBUG_
変数がtrue
になっています。ユーザインタフェイスの動作を確認する場合はDEBUG_
をfalse
にしてから実行してください。
メソッドをFacadeで隠蔽する
主となるスケッチファイルHealthApp_
から多くのコードを消せましたが、
ui.drawManShape();
ui.drawWeightSign();
ui.drawWeightUpButton();
ui.drawWeightDownButton();
ui.drawWeight();
ui.drawHeightSign();
ui.drawHeightUpButton();
ui.drawHeightDownButton();
ui.drawHeight();
ui.drawBMI();
ui.drawCategory();
メインになるスケッチファイル内で、arrangeElements
というメソッドにまとめてしまいましょう。
ui.arrangeElements();
こうすることで、HealthApp_
は、
今回の演習はこのarrangeElements
を書くこととします。とても簡単です。問題を考えるための演習ではなく、
演習
演習1(難易度:very easy)
健康管理アプリのユーザインタフェイスの各要素を配置するメソッドarrangeElements
を書き、HealthApp_
のコードをさらにシンプルにしましょう。
まとめ
学習の確認
それぞれの項目で、