nikkie-ftnextの日記

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

読書&写経ログ | #ちょうぜつ本 第8章 Bridgeパターン 〜has-a関係でとらえて、複数系統の組合せを表現できる!〜

はじめに

本の日(百合子ちゃんかわいい) nikkieです

いつものやつ、いきましょう

変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様1ごめんなさい〜

「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会2を共同主催していますが、ついに第8章「デザインパターン」に突入です。
次回の範囲の予習の中から、学びがたくさんあったBridgeパターンについてログを残します。

目次

前回のちょうぜつ本!

いわしまんさんの書評エントリがきっかけで、手に取りました。
第7章まで読み進め、依存性注入まで完全に理解。作ると使うを分けるんだ!
天使様にこれ以上刺されないんじゃないかと思っています(そうであってほしい!)

ついに第8章に突入です

第8章より Bridgeパターン

第8章はたくさんのデザインパターンが出てきます。
もとになっていると思われるのは ちょうぜつのカレンダー | Advent Calendar 2019 - Qiita

Bridgeパターンの回です。

生き物を

  • 動物
  • 鳥(飛べる)
  • 魚(泳げる)

に分けたとき

  • 飛べない鳥(ニワトリ)
  • 泳げる鳥(ペンギン)
  • 飛べる魚(トビウオ)

が出てきて1つの系統樹だと破綻します。

これを解決するのがBridgeパターン!
複数の系統を架橋します。

  • 生物学の分類
  • 生息域による特徴

1つの系統樹(is-a関係)で扱えないので、複数の系統3のhas-a関係で考えています。
複数のhas-aから合成すると理解しました。
例:分類は鳥で、生息域は水(ペンギン)

Bridgeサンプルコード

書籍には金メダルや銀の盃といった賞の例がありました。
これを見て「ミリシタのイベントランキングの賞でできるんじゃないか」と思った私4が書いたのがこちらです!

% python rank_by_bridge.py 
Metal.PLATINUM Title.RANKER
Metal.SILVER Title.MASTER

「プラチナランカー」や「シルバーマスター」といった、イベントランキングで獲得できる称号を表してみました。

現時点の理解メモ

  • インターフェース(RankInterface)を用意
    • Metal(プラチナやシルバー)がわかる
    • Title(ランカーやマスター)がわかる
    • 実装の詳細はわからなくても、上記2つが使える
  • さらに他のインターフェース
    • RankMetal
      • Metalがわかる
    • RankTitle
      • Titleがわかる
  • RankInterfaceを実装する形でRankを用意(Pythonでは継承)
    • RankMetalとRankTitleの合成
  • 「プラチナランカー」や「シルバーマスター」を合成した🙌

合成で実装しているので、新しいMetal(トッププラチナ)や新しいTitle(ラウンジ)は加えやすいと思います。
ミリシタの称号は2系統の全組合せ網羅となりますが、ちょうぜつ本の例では全組合せ網羅は前提にしていないと思います。

実装しての感想

Template Methodパターンを覚えて適用していたら苦しい(これが継承税ってやつなのか?)と感じていたのですが、わからん殺しから脱するヒントは見えたかなと思います。

しかし、Template Methodで設計可能なのはひとつの系です。軸が異なる共通性が複数あると、継承はうまく機能しません。(Kindle版 p.340)

軸が異なっていたんだ!!
Template Methodには限界があったんだ!

また、RankInterfaceのようなインターフェースの用意がうまいと思います。
実装詳細によらない使い方を伝えられるわけで、Bridgeさせられない無茶苦茶なRankが爆誕しても吸収できます(この点もわからん殺しされていた)

getメソッドはEnumと相性がよさそうだったので試してみました。
https://docs.python.org/ja/3/library/enum.html#enum.Enum

Template Methodの限界は単一継承を前提にして論じられていますが、Pythonは多重継承が可能です。
Template MethodやBridgeをMixinで実装できないかは考えてみたいですね

終わりに

ちょうぜつ本 8章でBridgeパターンを知りました。
複数の軸から合成する実装は非常にしっくり来ました。
そして、ブリッジパターンを表す挿絵の、そけっとさん(ふんす)かわいい🤗

最後は天使様に締めてもらいましょう!

複数系統の組合せが必要なのにTemplate Methodパターンとか舐めているのですか

ごめんなさい〜

P.S. 11/3(金) 第8章「デザインパターン」(8-3まで)のちょうぜつ本_読書py!

次回ちょうぜつ本_読書py(Python使い視点でちょうぜつ本を読む、みんなのアウトプット中心の読書会)は11/3(金)です!

常連さんも、お久しぶりの方も、はじめましての方もデザインパターンに興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜


  1. ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です
  2. 先日のPyCon APAC 2023でコミュニティのポスターセッションをしました
  3. 言い換えると「特性軸」
  4. これは仕掛け人が板についてきたんじゃないでしょうか