nikkie-ftnextの日記

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

読書ログ | #ちょうぜつ本 第5章 〜SOLID原則、この章までの積み重ねと豊富なサンプルコードでこれまでで一番分かりやすかった解説!〜

はじめに

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

「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会と絡めて読み進め、今回は第5章「オブジェクト指向原則 SOLID」を読みました。

目次

前回のちょうぜつ本!

いわしまんさんの書評エントリがきっかけで、手に取りました。
3章まで読み進め、

今回は4章の読書ログに先んじて、次回読書会の範囲になっている5章の読書ログです!

SOLID原則は初見ではないのですが、サンプルコードがSOLID原則を守ることで変更しやすいコードに変わっていくさまを見て、これまでになく理解が深まりました。
各原則に関する気づきや感想を綴ります。

SRP

単一責任原則で印象的だったのは、

クラスの責務は、何かの法則で機械的に決まるものではなく、将来の保守開発への想像から恣意的に生み出すもの (Kindle 版 p.152)

設計って数学の証明みたく、置かれた文脈によらず同一の結論に達するものだと思い込んでいたのですが、恣意性!!

ここでの例は2つで

  • ニュース記事管理で入稿と購読は分ける
  • データベースドライバのreadとwriteは分けない

ドライバの例でreadとwriteを分けないのは、ドライバVer1とVer2を区別するのを優先という意思決定による!(恣意性の例)
このデータベースドライバの例も別の文脈においてはreadとwriteを分けうるわけで、「設計ってめちゃめちゃ人間臭いな〜」と実感しました。
置かれた状況まで考慮しないと設計の妥当性というものは判断できないかもしれません(設計においても圧倒的当事者意識説)

OCP

ジェネリックFizzBuzzの例!
本質を抜き出して変更に対して閉ざし、仕様は拡張に対して開きます。
本質の抜き出し方がお見事でした👏

FizzBuzzの本質に近い実装は、私がこれまで雑多なコードリーディングで見出していたものでもありました(解釈一致〜🙌)。
ちょうぜつ本で言語化を得て先へ進んでいけそうです。

ここで語られるシンプル

一貫した法則をベースに、徹底してパーツを外せるように作られたもののほうがシンプル (Kindle 版 p.163)

これはレゴブロックのような性質で(個々の形状は変更できないけれど、積み上げてどんなものでも作れる=拡張性)、私も信奉するところです。
おすすめ記事

LSP

正しい継承について、言い換えると下位互換性

基底クラスにない事前条件(入力値の制限など)を加えてはいけない以外に、基底クラスが持っていた事後条件(出力結果など)の範囲を逸脱するのもNGです。(Kindle 版 p.169)

  • 型の事前条件:狭めてはならない
  • 型の事後条件:広げてはならない

写経の中でPythonの型チェッカはどれくらいサポートしてくれるんだろうと気になりました。
mypyのドキュメントにはLSPへの言及があるのですが、
https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
使い方が悪かったのか、開発中にAnimalとCatを入れ替えても怒ってくれなかったんですよね

ISP

インターネットサービスプロバイダ!

ISPが一番衝撃でした。
小さなインターフェース(を組合せる)!

この原則のポイントは「利用」(使用)

インターフェースは利用時の概念の最小単位です。(Kindle 版 pp.172-173)

実装より先に使用を想像し、複数の使うときの関心を結合させてしまうのを避ける (Kindle 版 p.189)

複数の使うときの関心(利用時の関心)を結合させてきたな〜、過去の私〜〜!😇
サンプルプログラムは小さなインターフェースを使って利用時の関心を分離していき、「こんなふうに書けるなんて考えもしなかったけど、これはたしかに分かりやすい!」と思いました

構造化プログラミングとの違いとして、使うときは概念の一部しか見えないという点。
身の回りのものを想像してもたしかにそうなんですよね。
使うときに必要な概念は一部=小さいので、小さいインターフェースとなる(すなわちISP

小さなインターフェースの組合せというのは練習してできるようになっていきたいですね。
3章で学んだ、「具象があることにできる」という抽象の性質も活用できそうです

DIP

Software Design 2023年6月号」でDIPの解説を読んでいたので、復習という気持ちで読みました。

  • トップダウン機能分解アプローチとは別物
  • 考え方を変えて、最小のインターフェースに依存
    • 結果、制御構造と依存関係が逆転する

これまでの節のサンプルコードにもDIPが隠れていたことが明らかにされます。
このあたりは慣れつつあるかも〜🙌

クリーンアーキテクチャを実現する2のにもDIPが一役買いますね。

終わりに

ちょうぜつ本 第5章で、SOLID原則の手応えを得ました。
解説からどの原則にも発見がありましたが、特に印象的だったのは以下です

  • 設計の恣意性
  • 小さいインターフェース(利用時の概念)を組み合わせる

ちょうぜつ本のSOLID原則の説明は、ここまでの解説と、この章の豊富なサンプルコードもあいまって、これまで見聞きした中で私には一番分かりやすかったです。
オブジェクト指向に関する知の高速道路があって、この本の後に学ぶ方は本当にいいなァ!

Pythonで写経したコードはこちらです:

P.S. 8/18(金) 第5章「オブジェクト指向原則 SOLID」のちょうぜつ本_読書py!

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

常連さんも、お久しぶりの方も、はじめましての方もSOLID原則に興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜


  1. ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です
  2. 1章で肝心なポイントとして謎に包まれていた部分です。