nikkie-ftnextの日記

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

読書&写経ログ | #ちょうぜつ本 第8章 Compositeパターン 〜自己再帰的なデータ構造〜

はじめに

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

天使様、ごめんなさい〜、nikkieです1

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

目次

前回のちょうぜつ本!

手に取ったきっかけは、いわしまんさんの書評エントリです。

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

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として持つ
  • Leaf

Branchがファイルシステムでいうフォルダに、Leafがファイルに対応しますね。

クラスのプロパティはどう初期化されるの?

Pythonで写経していったときに手が止まったのはここです。
例えばbranch2とnode3の部分を考えると、

  • PHPのコードの意味が完全にとれていないのですが、)branch2の初期化にはparentsubnodesが要るってこと?
  • 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(金)です!🐈

にゃんにゃにゃにゃーーん4

P.S. 映画『HELLO WORLD』ってもしかして

Compositeパターンも描いてたんじゃないかな?


  1. ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です。なお、天使様は2024年の干支の可能性があります!
  2. 技術書界のきららとして知られます。アニメ化してほしいな〜
  3. 今回参照したのは増補改訂版(第2版)です。今から買うなら最新の3版がよさそうでした。「わかりやすさはそのままに、取り扱う例や解説を現代の観点から修正しました(依存性の注入、セキュリティに関する記述の追加など)。
  4. 意訳 常連さんも、お久しぶりの方も、はじめましての方もデザインパターンに興味ある方、大歓迎です!ぜひぜひお気軽にお越しください〜