逆引き!GoFデザインパターン入門 の研修コースに参加してみた
今回の研修参加レポートは↓です。
逆引き!GoFデザインパターン入門
“オブジェクト指向を理解する” の続きでオブジェクト指向の実践的な活用パターンを学ぶコースです。
“実践的な活用パターン” というと銀の弾丸っぽく聞こえるのですが、講師の矢沢さんから地味な話なんですよ、と冒頭に話があったように、地味でした。(笑)
ただ、有名なアルゴリズム同様、知らないと思いつかないテクニックばかりで、実装上、どこに気をつけると依存性を排して書けるのか、幾つものヒントがある内容でした。
また、ご参加の方もオブジェクト指向プログラミングをもっと上手く書きたい、現場のコードで時折見る public class AdpterHoge
ってなんだろう、のような疑問をお持ちの方がお集まりのようで、とても実装寄りの質問が多いコースでした!
もっとプログラミングが上手くなりたい、オブジェクト指向に慣れたい、と言う方にはとてもオススメのコースです!!
では、どんな内容だったのかレポートします!
想定する受講者
- Javaの基本的な言語構文がわかること。
受講目標
- GoFデザインパターンの全容と活用方法がわかる。
講師紹介
「地味な内容なのにありがとうございます。」という挨拶から始まりました。講師はおなじみの 矢沢久雄 さんです。
今日のつかみは「オヤジギャグを言うので、リアクションがないと何回も言ってしまいます。不快に思う方はリアクションをお願いします」というお話でした。
皆さんの自己紹介
続いて、受講者の自己紹介ということで、簡単なアンケートです。
お越しの方は、
- Q. デザインパターンって知ってますか?
-> ほとんどナシが大半でした - Q. Javaの経験は?
-> 少しだけありますというのが大半でした
ということで、想定の通り、ということでスタートです。
GoF デザインパターンとは
- GoF と言うと高尚な雰囲気がありますが、 Gang of Four (4人の奴ら) なので恐れることはありません
- その4人がオブジェクト指向の活用パターンとして発表したのが GoFデザインパターン です
- アルゴリズムに似ていて [プログラミング -> フローチャート -> 代表的なアルゴリズム] という順番で学ぶのと同じように、 [OOP -> UML -> デザインパターン] という順番でオブジェクト指向を学ぶとスムーズに進みます
- デザインパターンには名前がついているので、名前から自分なりにイメージを持つと良いとのことでした
- デザインパターンには、構造、生成、振る舞い、の3つの分類がある
名前付け大事ですね。全然話は変わりますが、最近ワークショップをいい感じに進めるパターンを Wiki にまとめているものを見ました。そこでもパターンに名前がついていて、とてもイメージが湧きやすいものでした。
また、デザインパターンに3つの分類があるということは、オブジェクト指向プログラミングも3つのポイントで工夫できます。
これだけでも見通しが良くなりますね。
構造に関するパターン
ここからはデザインパターンの3つの分類毎に、代表的なパターンを紹介いただきました。
また、そのパターンの説明だけでなく、実際にJavaで書かれたサンプルコードを見て、実装上のポイントも教えていただきました。
まず、構造とは クラスを改良したり拡張するときに、よく使われるパターンで、クラスを1つ追加したり、隠蔽すると問題を解決できるテクニック です。
- 改造せずにつなぐ Adapter
- usage: 外部ライブラリや既存のクラスは変えずに、インターフェースを追加して改造したいとき
- 実装のポイント: 継承と集約を使う
- AdapterSample.java
- 拡張から実装へ橋を架ける Bridge
- usage: 既存のクラスに新しいメソッドを追加したいんだけど、既存クラスと関係のあるクラスまで影響を及ばさずに追加したいとき
- 実装のポイント: 集約を使う
- BridgeSample.java
- 複数のクラスを1つに見せる Facade
- usage: DAOパターンと同じく、複雑な処理があるクラスを隠蔽して、使いやすくしたいとき
- 実装上のポイント: クラスを使う人が楽になるよう工夫する (ex. staticにする、例外を投げない など)
- FacadeSample.java
- メモリの使用量を少なくする Flyweight
- usage: 商品情報などマスタのような情報を格納した複数のオブジェクトを再利用して、メモリの使用量を抑えたいとき
- 実装上のポイント: オブジェクトプールという概念を使う
- FlyweightSample.java
生成に関するパターン
生成とは new
するときに面倒なことや複雑なことを軽減するテクニック です。
- 1個のインスタンスを共有する Singleton
- usage: DBアクセスを伴うような重い処理が複数インスタンス化されるのを防ぎ、1個だけインスタンス化して共有したいとき
- 実装のポイント: コンストラクタを
private
にする - SingletonSample.java
- オブジェクトの複製を作る Prototype
- usage: ユーザーが操作したオブジェクトをコピー (clone) して使いまわしたいとき = protected な clone メソッドを利用可能にしたいとき
- 実装のポイント:
protected
をpublic
にするsharllow copy
とdeep copy
の違いに注意する (複製元の変更の影響を受けてよいのかどうか)
- PrototypeSample2.java
- 適切なセットを生成する Abstract Factory
- usage: 複数のインスタンスをセットで生成したいとき
- 実装のポイント: 抽象化したクラスを定義して追加する
- AbstractFactorySample.java
- ディレクターを介して構築者を使う Builder
- usage: ユーザー登録のようなオブジェクトが生成されたときに、タスクランナーのように様々なクラスのメソッドを順次実行するとき
- 実装のポイント: Builderという構築者だけでなく、Directorという指示を出すクラスも作る
- BuilderSample.java
振る舞いに関するパターン
振る舞いとは メソッドを呼び出すときの面倒さを軽減するテクニック のことです。
- 拡張for文に対応する Iterator
- usage: 配列やコレクションなど様々なデータ構造に対して、先頭から末尾まで順番に読み出せるようにしたいとき
- 実装のポイント: Iterator という配列などを parse するクラスを作って、返すメソッドを定義する
- IteratorSample.java
- 同じ手順の雛形を使う Template Method
- usage: 同じようなメソッドをもつクラスに、メソッドを書き足す必要があり、全部のクラスに書かずに1つだけ書きたいとき
- 実装のポイント: スーパークラスに処理のテンプレートを作って、そのサブクラスにメソッドを書き足すだけにする
- TemplateMethodSample1.java
- 引数のインスタンスに委譲する Visitor
- usage: Double Dispatch とも呼ばれ、複数のクラスのメソッドを呼び出して処理を行いたいとき
- オブジェクト指向をマスターしたぜ、という練習に良い
- 実装のポイント: 引数にインスタンスを指定する
- VisitorSample.java
その他 Strategy パターンも解説していただいて、23個のパターンの内、12コを紹介していただきコースは修了しました。
まとめ
オブジェクト指向の実践的活用パターン、デザインパターンを “こういうときに使おう” ということで逆引き的に紹介していただきました。
クラスの修正、new
するとき 、メソッドの呼び出しで面倒だなーと思ったら、デザインパターンをつらつら見てみるとアイデアが湧いて良さそうです。
また Builder
パターン一つとっても、Effective Java という書籍で改良されたパターンがあったり、DAOパターンのようにWebアプリケーションフレームワークで使われていたりと、デザインパターンの活用の幅は広がっています。
もっとプログラミングが上手くなりたい、オブジェクト指向ってもっと便利なはず、なんかデザパタの名前がコードに書かれていて知りたい、といった方にはとてもオススメです!!
SEカレッジが気になった方はこちらからお気軽にお問合わせ下さい!
SEカレッジの詳細をご覧になりたい方はこちら!!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。