はじめに
変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様、ごめんなさい〜、nikkieです1。
「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』2)!🤗
昨年から読書会を共同主催しており、現在は第8章「デザインパターン」を読み進めています。
直近読んだ範囲から、Compositeを取り上げます。
目次
- はじめに
- 目次
- 前回のちょうぜつ本!
- Compositeパターン
- サンプルコードを動かしていく!
- 結城先生本より、複数と単数の同一視
- 終わりに
- P.S. 2/2(金) 第8章「デザインパターン」(8-9前半)のちょうぜつ本_読書py!
- P.S. 映画『HELLO WORLD』ってもしかして
前回のちょうぜつ本!
手に取ったきっかけは、いわしまんさんの書評エントリです。
前から順に読み進めて第8章に突入し、読書会では範囲を細かくしてじっくりと読み進めています。
- 読書ログ | #ちょうぜつ本 第8章 Template Methodパターン 〜穴埋め問題にする〜 - nikkie-ftnextの日記
- 読書&写経ログ | #ちょうぜつ本 第8章 Bridgeパターン 〜has-a関係でとらえて、複数系統の組合せを表現できる!〜 - nikkie-ftnextの日記
- 読書ログ | #ちょうぜつ本 (第8章)でも #fukabori (48)でも、ただしSingleton、テメーはダメだ - nikkie-ftnextの日記
- 読書ログ | #ちょうぜつ本 第8章 Facadeパターン 〜表玄関だけを通って!〜 - nikkie-ftnextの日記
- 読書&写経ログ | #ちょうぜつ本 第8章 Mediatorパターン 〜ColleagueたちにMediator自身を渡して、必ずMediatorを介在させる!〜 - nikkie-ftnextの日記
- 読書ログ | #ちょうぜつ本 第8章 Proxyパターン 〜Python文法のデコレータは1つの例〜 - nikkie-ftnextの日記
- 読書ログ | #ちょうぜつ本 第8章 Decoratorパターン 〜新たなメソッドを追加するラッパー。委譲による実装がうまい!〜 - nikkie-ftnextの日記
Adapterパターンは、身の回りにあるアダプタと同じことをしていました。
Compositeパターン
自己再帰的なデータ構造です。
24あるGoFデザインパターンの中で唯一データ構造に言及しているとのこと。
理論上無限に中へ展開できるツリー型の構造 (ちょうぜつ本 Kindle版 p.390)
自己再帰的なデータ構造の例は
です。
元になったアドカレに分かりやすい説明がありました。
部分と全体が同じ形をした再帰的ツリー構造はかっこいいし、実際に扱いもシンプルでいいよね
サンプルコードを動かしていく!
例の木構造を再現しよう
ちょうぜつ本にある図8-18を再現します。
classDiagram root_branch *-- branch1 root_branch *-- node1 branch1 *-- branch2 branch1 *-- node2 branch2 *-- node3
- root_branchの子は2つ
- branch1
- node1
- branch1の子は2つ
- branch2
- node2
- branch2の子は1つ
- node3
ちょうぜつ本には3つのクラスが定義されています(リスト8-45)
<?php abstract class Node { protected Branch $parent; } class Branch extends Node { protected array $subnodes; } class Leaf extends Node { }
- Node(抽象クラス)
parent
としてBranchを持つ
- Branch
- Nodeの配列を
subnodes
として持つ
- Nodeの配列を
- Leaf
Branchがファイルシステムでいうフォルダに、Leafがファイルに対応しますね。
クラスのプロパティはどう初期化されるの?
Pythonで写経していったときに手が止まったのはここです。
例えばbranch2とnode3の部分を考えると、
- (PHPのコードの意味が完全にとれていないのですが、)branch2の初期化には
parent
とsubnodes
が要るってこと? - node3の初期化には
parent
が要りそう - node3を初期化しようとすると
parent
のbranch2が必要。だけど、branch2の初期化にはsubnodes
にnode3が必要では?? あれ、無限に後退しちゃう...
Mediatorのときと同様、サンプルコードだけではどう実装すればいいか見えてこなくなってしまいました。
そこで、結城先生の『Java言語で学ぶデザインパターン入門』3も参照しました。
結果、初期化するときに渡すのではなく、初期化したあとでNodeどうしを操作するようにしました。
Pythonで写経したコード
ちょうぜつ本と結城先生本の合作です。
全容はこちらからどうぞ
% python composite_example.py Branch('root') Branch('branch1') Branch('branch2') Leaf('node3') Leaf('node2') Leaf('node1')
結城先生本より、複数と単数の同一視
Compositeパターンは複数と単数の同一視と見ることもできる(結城先生本 p.163)。
複数と単数の同一視はOSSのコードリーディングの中で見つけていました。
これ、頭いいと思うんですよね。
Compositeパターンと出会っていたんだなー!
終わりに
ちょうぜつ本 8章よりCompositeパターンでした。
自己再帰的なデータ構造! 内側に無限に続くことができます。
「複数と単数の同一視」でもありました。
P.S. 2/2(金) 第8章「デザインパターン」(8-9前半)のちょうぜつ本_読書py!
次回ちょうぜつ本_読書py(Python使い視点でちょうぜつ本を読む、みんなのアウトプット中心の読書会)は2/2(金)です!🐈
ちょうぜつ本_読書py[12] に参加を申し込みました!2/2開催、にゃんにゃん!🐈 今回のデザインパターンを紹介するにゃん。にゃにゃーん! Strategy! State!! にゃにゃにゃにゃ、しゃーっ!!🐈⬛ https://t.co/hKr4gNy4wy #ちょうぜつ本
— nikkie / にっきー (@ftnext) 2024年1月20日
にゃんにゃにゃにゃーーん4
P.S. 映画『HELLO WORLD』ってもしかして
Compositeパターンも描いてたんじゃないかな?
これはネタバレになっていそうなのですが、#ちょうぜつ本 を読んで、映画『HELLO WORLD』の軸の1つにCompositeパターンがあったんだなあと思うなどhttps://t.co/2eyQQnQAmX https://t.co/yhcdDb6v32
— nikkie / にっきー (@ftnext) 2024年1月20日
- ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です。なお、天使様は2024年の干支の可能性があります!↩
- 技術書界のきららとして知られます。アニメ化してほしいな〜↩
- 今回参照したのは増補改訂版(第2版)です。今から買うなら最新の3版がよさそうでした。「わかりやすさはそのままに、取り扱う例や解説を現代の観点から修正しました(依存性の注入、セキュリティに関する記述の追加など)。」↩
- 意訳 常連さんも、お久しぶりの方も、はじめましての方もデザインパターンに興味ある方、大歓迎です!ぜひぜひお気軽にお越しください〜↩