nikkie-ftnextの日記

イベントレポートや読書メモを発信

読書ログ | #ちょうぜつ本 第8章 Template Methodパターン 〜穴埋め問題にする〜

はじめに

オレンジノキオク、めっちゃいいぞ...🟧 UR 葉月恋状態のnikkieです1

ちょうぜつ本読書ログシリーズ冒頭のいつものやつ、いきましょう。

変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか

天使様2ごめんなさい〜

「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会を共同主催しており、第8章「デザインパターン」を読み進めています。
過去読んだ範囲のTemplate Methodについて取り上げます。

目次

前回のちょうぜつ本!

第8章に突入し、読書会では範囲を細かくしてじっくりと読み進めています。

今回取り上げるTemplate Methodについては、読書会を終えた状態での読書ログとして書き残します。

Template Method

Template Methodは11/3の回の範囲でした。
Bridgeと一緒に8-3で扱われます。

複数の異なる概念の差を意識しながら、クラスの振る舞いの多態性を効率的に設計する (Kindle版 p.323)

記憶に残っていた例え

ラクスさんのおすすめの技術書LT会3で聞いたこちらです。

「穴埋め問題」にしているんだ!

アルゴリズムの大枠が共通したクラス群があるとき、それらの基底となる抽象クラスを設け、異なる部分だけをオーバーライドして穴埋めするパターンです。(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章、分量がおかしなことになっていますが、知っているデザインパターンを少しずつ増やして、各パターンを使うべきタイミングで使えるように(=過ちを繰り返さないように)なっていきたいですね。


  1. 止まらないんです...
  2. ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です
  3. 【LT増枠】おすすめの技術書 LT会 【登壇初心者の方大歓迎】 - connpass
  4. プライベートで書いたTwitter Botです
  5. でへへでは済まないですけどね(今回リファクタリングのヒントは得られました)