daisuzz.log

A philosophy of software design 4章 ~ 6章を読んだメモ

A Philosophy of Software Designを読んだので忘備録としてまとめていきます。

A Philosophy of Software Design

A Philosophy of Software Design

4章 Modules Should Be Deep

この章からは実際にどうやって複雑さを減らしていくかについて書かれている。まずはモジュールについて。

modular design

モジュールはinterfaceとimplementationに分けて考える。なるべく他のモジュールから独立したモジュールを作る。

deep module

interfaceはシンプルに。implementationを大きくする。モジュールの中でなにが重要な情報なのかを理解すること。

classitis

大きいクラスを分割せよ、という考えがいき過ぎてしまうと、クラスの数が増えすぎてしまい、システム全体の複雑度をかえって大きくしてしまう。

5章 Information Hiding (and Leaking)

この章は、前章のdeep moduleを作るためのテクニックを紹介している。

Information Hiding

deep moduleを作るために最も重要なテクニック。implementationに知識をカプセル化することで、モジュールの結合度を下げる。 interfaceがシンプルになりcognitive loadを減らすことができ、さらにモジュールの結合度を下げることができるので、システムを変更しやすくなる。

Information leaking

interfaceに知識が漏れていることによって、モジュールの修正の影響が他のモジュールに影響してしまう状態。この状態に気づくかどうかはソフトウェアの設計において重要なスキル。

Temporal Decomposition

変換、読み込み、書き込みなど実行されるタスク単位でクラスに分類してしまうこと。Inforamtion leakingを引き起こしてしまう要因の一つ。処理単位でクラスに分割するのではなく、必要な知識単位でクラスに分割すること。

6章 General Purpose Modules are Deeper

この章では、モジュールを特定用途にすべきか汎用用途にすべきかという話がされている。

somewhat general-purpose

implementationは特定用途にしておき、interfaceは汎用用途で使えるように書く手法。 implementationを特定用途にしておくことで不要なロジックや処理を書かなくて済む。一方で、interafaceを汎用用途にすることで、特定用途をモジュール外に漏らさずかつメソッドの数を減らすことができ、結果としてcognitive loadやinforamtion leakingを減らすことができる。

さらに、設計をしている中で以下の質問を自分に投げかけてみるのがおすすめ。

  • 今必要な機能を実現するためのinterfaceの中で最もシンプルなものはどれか?

  • このメソッドが呼ばれる状況はどれだけあるか?

  • 今必要な機能を実現するために、このAPIを簡単に使えるか?