はじめに
オレンジノキオク、めっちゃいいぞ...🟧 UR 葉月恋状態のnikkieです1
ちょうぜつ本読書ログシリーズ冒頭のいつものやつ、いきましょう。
変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様2ごめんなさい〜
「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会を共同主催しており、第8章「デザインパターン」を読み進めています。
過去読んだ範囲のTemplate Methodについて取り上げます。
目次
前回のちょうぜつ本!
第8章に突入し、読書会では範囲を細かくしてじっくりと読み進めています。
今回取り上げるTemplate Methodについては、読書会を終えた状態での読書ログとして書き残します。
Template Method
Template Methodは11/3の回の範囲でした。
Bridgeと一緒に8-3で扱われます。
記憶に残っていた例え
#itbookslt デザインパターン本紹介LTより、
— nikkie / にっきー (@ftnext) 2021年3月24日
解決する課題と実装方法をセットで覚えよう
「テンプレートメソッドパターン」
一部のアルゴリズムを変更するデザパタ
不変なものと可変なものに分ける
不変:ラーメン作る手順 インターフェース
可変:スープ、麺、具材 サブクラス
「穴埋め問題」にしているんだ!
アルゴリズムの大枠が共通したクラス群があるとき、それらの基底となる抽象クラスを設け、異なる部分だけをオーバーライドして穴埋めするパターンです。(Kindle版 pp.323-324)
私の記憶に残っていた例に当てはめると、醤油ラーメンや味噌ラーメンを作る場合
- ラーメンの作り方は大枠で共通
- ゆでる
- トッピング
- 「ゆでる」や「トッピング」が穴埋め問題。ここを具体的なラーメンごとに変える
- ゆで時間
- トッピングするもの
これで大枠で共通なアルゴリズムの細部を、具体ごとに変えるということが実現できますね。
ちょうぜつ本の元になったアドベントカレンダーでは、「歯抜け」という言い回しでした。
継承を使っていることに注意
Template Methodは、継承による差分プログラミング
Template Methodパターンのひとつの側面は、継承による差分プログラミングです。(Kindle版 p.327)
たしかにラーメンの例を思い返しても差分プログラミングですね。
アドベントカレンダー記事より
Template Method はフレームワークです。また同時に、よりハードコードに近いほうの妥協です。(略) コンポジションによる柔軟性より、継承による硬直化をあえて選ぶのがこのパターンです。
読書会で印象的だった議論
- Strategyといった代案は常にある
- 不確実性が低いならTemplate Methodで硬直化させるのはありだが、不確実性が高い状況(アルゴリズムの大枠が見えない状況)でTemplate Methodを選ぶか
インターフェースを設けよう!
ちょうぜつ本のTemplate Methodの説明で私の一番の学びがこちら!
実装上のアドバイスとして、テンプレート抽象となるクラスの定義を、クライアントコードが直接利用するのは避けたほうがいい点を補足しておきます。(Kindle版 p.329)
はい、テンプレート抽象となるクラスの定義をクライアントに直接利用させました🙋♂️
その結果、テンプレート抽象で拾えない具象があることが見えてきて、テンプレート抽象のクラスを変えたいが、既存を壊さないように手を出すのが非常に難しく感じています4
これがインターフェースだったら全然話が違うんですよ。
クライアントがインターフェースを知っている(インターフェースをどう実装しているかは知らない)だったら、テンプレート抽象で拾えない場合にテンプレート抽象を使わずにインターフェースを満たすようにして対処できると思うんですよね。
テンプレート抽象をクライアントに利用させちゃうと、この逃げ道がないんですよ!!
インターフェースは利用時の関心です。
Template Methodのテンプレート抽象となるクラスの詳細は隠して、利用時の関心(インターフェース)だけをクライアントに見せる✍️
わからん殺しされてたポイントでした(でへへ〜5
終わりに
ちょうぜつ本 8章よりTemplate Methodパターンでした。
- 共通アルゴリズムの穴埋め問題にしている
- テンプレート抽象ではなく、インターフェースをクライアントに見せよう(マジで!)
Template Methodパターンは理解が容易だった分、他のデザインパターンと使い所を比較検討できないうちから使っていました。
その判断にいま苦しめられています。
ちょうぜつ本 8章、分量がおかしなことになっていますが、知っているデザインパターンを少しずつ増やして、各パターンを使うべきタイミングで使えるように(=過ちを繰り返さないように)なっていきたいですね。
-
止まらないんです...
↩ミリシタ、Team 3rdイベント楽しすぎる🙌🟧
— nikkie / にっきー (@ftnext) 2023年11月30日
オレンジノキオク、楽曲としてめっちゃ好きだし、
メンバーに思い入れある子いるし、
「UR 葉月恋」状態です!
恋ちゃんのごとく止まらないです。もう色々手につきません!(読書会とかアドカレとかいろいろあるのですが...) - ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です↩
- 【LT増枠】おすすめの技術書 LT会 【登壇初心者の方大歓迎】 - connpass ↩
- プライベートで書いたTwitter Botです ↩
- でへへでは済まないですけどね(今回リファクタリングのヒントは得られました)↩