はじめに
本の日(百合子ちゃんかわいい) nikkieです
いつものやつ、いきましょう
変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様1ごめんなさい〜
「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会2を共同主催していますが、ついに第8章「デザインパターン」に突入です。
次回の範囲の予習の中から、学びがたくさんあったBridgeパターンについてログを残します。
目次
- はじめに
- 目次
- 前回のちょうぜつ本!
- 第8章より Bridgeパターン
- Bridgeサンプルコード
- 終わりに
- P.S. 11/3(金) 第8章「デザインパターン」(8-3まで)のちょうぜつ本_読書py!
前回のちょうぜつ本!
いわしまんさんの書評エントリがきっかけで、手に取りました。
第7章まで読み進め、依存性注入まで完全に理解。作ると使うを分けるんだ!
天使様にこれ以上刺されないんじゃないかと思っています(そうであってほしい!)
ついに第8章に突入です
第8章より Bridgeパターン
技術本、だいたい60%過ぎたあたりから、技術的に複雑なくせに目的観の扱いが雑になってきて、1章を見たときの感動が薄れますよね。実は #ちょうぜつ本 では、8章のデザパタに、確信犯的にその役をやらせました。7〜10話でペースダウンしてから怒涛の11〜12話に入るアニメ、盛り上がるじゃないですか
— 田中ひさてる (@tanakahisateru) 2023年6月26日
第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(金)です!
11/3(祝・金)の ちょうぜつ本_読書py[7] に参加を申し込みました! 今回からデザインパターンに挑んでいくぜ! まずはこいつらだ:Iterator! Template Method!! そして、Bridge!!! https://t.co/TkZhQG2m3T #ちょうぜつ本
— nikkie にっきー (@ftnext) 2023年10月23日
常連さんも、お久しぶりの方も、はじめましての方もデザインパターンに興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜
- ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です↩
-
先日のPyCon APAC 2023でコミュニティのポスターセッションをしました
↩ポスターセッションの準備が出来ました!会場でお待ちしてます! pic.twitter.com/iJQUVFoVWj
— nibu / Yumihiki (@YumihikiDev) 2023年10月27日 - 言い換えると「特性軸」↩
- これは仕掛け人が板についてきたんじゃないでしょうか↩