虎の穴ラボ技術ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

きれいな設計を目指したい! ちょうぜつ ソフトウェア設計入門

本記事は 虎の穴ラボ Advent Calendar 2024 15日目の予約投稿記事です。


こんにちは、虎の穴ラボの大場です。 今回は「ちょうぜつソフトウェア設計入門 PHPで理解するオブジェクト指向の活用」という書籍について紹介します。 本書の目次を眺めた時にソフトウェア設計の話題に加えて、依存性の注入(DI)に関して取り扱っていた点に惹かれて購入しました。 まだDIの章まで読み進められていないのですが良い本だと感じているので、私が読み進められている範囲で本書を紹介していければと思います。

書籍情報

タイトル ちょうぜつソフトウェア設計入門 PHPで理解するオブジェクト指向の活用
著者 田中ひさてる
発売日 2022年12月10日
発行 技術評論社
ページ数 328ページ

gihyo.jp

どんな本か

対象読者について

ソフトウェア設計やオブジェクト指向を「完全に理解してやろう!」というよりも、 「噛み砕いても良いのでざっくり理解したい!」人向けに感じました。

とても可愛らしい表紙の雰囲気から、初心者向けの書籍と誤解されそうですが、 取り扱っている題材が設計ということもありプログラミング初学者向けではありません。

また、こちらの書籍は 「PHPの基礎」 と 「ソフトウェア設計」を一石二鳥で学べるというものではありません。 あくまでソフトウェア設計について学ぶために、PHPでサンプルコードを記載しているだけなので、 PHP入門を目的としている方は別の書籍を購入した方が良いです。

2024年12月4日に「めもりーちゃんのPHPでプログラミング入門」が発売されているようですので、 参考情報としてリンクを貼っておきます。 gihyo.jp

書籍の構成について

本書の構成としては、まずクリーンアーキテクチャについての説明を導入の章とし、 パッケージ原則、オブジェクト指向、UMLの順に、前の章で学んだ知識をどんどん肉付けしていく形をとっています。 特に4章のUMLは、5章でのSOLID原則での本格的な説明に入る前に紹介するのは理にかなった構成だと感じました。

この構成のおかげで自分が理解できない場合は、前の章の理解が足りてないことに気づきやすかったですし、 必要になる前提知識は前の章に書いてあるため、適宜戻って理解を深めるといった読み返し動作がしやすかったです。 反対に全体から必要な情報を求めて飛ばし飛ばし読んだり、辞書引きするといった使い方は難しいように思いました。

書籍全体の雰囲気

全体的に語り口が柔らかく口語的な表現も多い印象です。 表紙の世界観につられて購入された方はそこまで違和感を感じないと思いますが、 教科書みたいに体系的でかっちりとした書籍では無いのでご注意ください。

本書の章見出しの最後には要所要所で1コマ漫画が差し込まれており、 ときに核心をつくような表現がされていたり、ギャグ要素があったりと本書の魅力の一つだと感じます。 個人的には、「汚い設計はなぜ生産性を落とすか」での1コマがお気に入りです。

「ごちゃごちゃしていてどこに片付ければいいかわからないなぁ」

「勝手に動かしたらダメそうだしそのままにしておいてとりあえず見えるところに置いておこうかな」

「あー、なるほど そういう歴史か」

引用元:汚い設計はなぜ生産性を落とす(6P)

書籍内容

1章 クリーンアーキテクチャ

クリーンアーキテクチャのメリットと、対称に汚い設計の特徴について紹介されています。 「安定度・凝集度・抽象・依存」等の専門用語を用いてクリーンアーキテクチャを紹介しつつ、 普段から開発に携わっている人はほぼ皆さん共感できるような内容が書かれています。

綺麗な設計は開発パフォーマンスを向上させてくれますし、 汚い設計では修正箇所が散らばってたり大変だよなぁ..とあるあるを感じながら読み進められました。

2章 パッケージ原則

パッケージ原則と呼ばれる以下の6つの原則に対して解説が行われます。

  • Reuse/Release Equivalence Principle (REP):再利用・リリース等価の原則
  • Common Reuse Principle (CRP):全再利用の原則
  • Common Closure Principle (CCP):閉鎖性共通の原則
  • Acyclic Dependencies Principle (ADP):非循環依存関係の原則
  • Stable Dependencies Principle(SDP):安定依存の原則
  • Stable Abstractions Principle(SAP):安定度・抽象度等価の原則

上記の原則に則ってコードをどう分けるかという話が主題なのですが、 解説を読んでいると「なるほど」と思う部分がある反面、2章にきていきなり難易度が高くなったように感じました。

個人的には、初見で2章を何度も読み返すよりも、5章を読んでから2章を読み返した方が理解が捗ると感じたので、 難しいと感じたら次に進んでしまうのも手かなと思います。

3章 オブジェクト指向

冒頭でオブジェクト指向における、よくある勘違いや誤解を解いた後に、関連する以下のキーワードが登場します。

  • カプセル化
  • 多態性(ポリモーフィズム)
  • 継承/汎化

この章から、上記のキーワードを説明するために、具体的なPHPのサンプルコードが出てきます。 といってもそこまで難しいわけでは無く、RubyやJavaなどを触っている人であれば苦労せず読み替えられる難易度だと思います。 (abstract, interface, implements等 の使い方は Java とほぼ一緒に見受けられました。)

4章 UML

クラス図・インスタンス図・シーケンス図の3つに絞って紹介されています。 UML2.0のものも含めて14種類あるうちの3つに絞っているのは、 この後の章で登場するSOLID原則での説明に用いるためだと思われます。

もし、UMLの読み方が頭に入っている方は読み飛ばしてしまって問題無い章です。 私の場合は読み慣れてなかったので、クラス図の線の形や向きの意味について簡易メモをとり、5章のお供として利用していました。

5章 SOLID原則

SOLID原則はオブジェクト指向での設計の考え方である以下の5つを合わせたものです。 この考え方は一般的なソフトウェア開発のシーンで応用できるとのことです。

  • Single Responsibility Principle (SRP):単一責任原則
  • Open Closed Principle(OCP):開放閉鎖原則
  • Liskov Substitution Principle (LSP) :リスコフの置換原則
  • Inter Separation Principle (ISP):インターフェース分離原則
  • Dependency Inversion Principle(DIP):依存性逆転の法則

この章の開放閉鎖原則の解説では、FizzBuzzを例に挙げての説明が行われており、非常にわかりやすいと感じました。 今後起こり得るであろう仕様変更を見据えて、コードの変化を具体的に提示している点が良かったです。

本章は「2章パッケージ原則」を前提として記載されている部分が多いのですが、 5章を読んだ後に2章の内容を振り返って読み直すと、パッケージ原則についての理解がさらに深まるように感じました。

現在、5章までしか読み進めていないため、残りの章については章題のみの紹介とさせてください。

  • 6章 テスト駆動開発
  • 7章 依存性注入
  • 8章 デザインパターン
  • 9章 アジャイル開発

最後に

本当は可愛い表紙に釣られました🎣

気軽に手をとったものの、思いの外、内容が濃い一冊だと思います。 パッケージ原則やらSOLID原則を噛み砕きつつも丁寧に解説しており、 取り扱う題材は難しいながらも順立てながら全体的にわかりやすく書かれています。

巻末記載の参考文献にロバート・C・マーチン著の書籍が羅列されていますが、 著名な翻訳本に手を出す前にこの本に出会えたのはとっかかりを掴む上で非常に良かったと感じています。

本書を読んで、綺麗な設計について考える時、デキル人はこの原則に沿った視点で考えていたんだろうなとか、 あの時のリリースはREPに当てはまっていたのかも、といった新たな発見があり、 いままで自身で考えが及ばなかった部分が少し明確になった気がします。

設計に関しては、AIに聞いても絶対的な正解が返ってくるものでは無いと感じています。 その分、学びがいのある分野ですし、人間が大いに工夫できる部分だと思いますので、引き続き学習を進めていきたいです。

宣伝

虎の穴ラボでは、毎月月末の火曜日に「オンラインもくもく読書会」を開催しています。 今月のもくもく読書会は2024年12月17日(火)に開催を予定です。

オンライン上で各自の読み進めたい本を持ち寄り、自分のペースで読み進める形式となっていますので、 本を積んでしまっている方や読み進めたいのに時間がなかなか確保できない方におすすめです! 興味がある方はぜひConnpass経由でお申し込みください🙏 yumenosora.connpass.com

採用情報

虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp