🚀

現場で役立つシステム設計の原則を読みました。

2021/12/09に公開

概要

現場で役立つシステム設計の原則 という書籍を読んだ。

ソフトウェア開発において意識しておいた方がよい事がバランスよく記載されていた。
ある課題がありその解決策はこうだ、といった構成になっていてイメージがしやすい。
書籍の冒頭にもあるが、変更が楽で安全なオブジェクト指向らしい設計に挑戦するための手がかりの一つになるだろう。

せっかくなので、以下に各章ごとの感想を残す。

1章

ソフトウェアの変更が大変な原因やその解決手段を教えてくれる。

  • 大きいクラス、長いメソッドは小さくして関心事を限定させる。
  • 値を扱う専用クラスを用意し、業務的に不適切な値が入り込むのを防ぐ。
  • コレクション専用クラスを用意してロジックを集中させる。

ここで紹介されているのは、リファクタリングの基本であり知っておいて損はない。というか得しかない。
ロジックをばら撒きながら多目的クラスを絶賛量産中の方々は、何かしら改善のきっかけを見つけることができるであろう。

2章

場合分けを整理する手段を教えてくれる。

業務アプリでは顧客区分や商品種別といった区分を扱う事が多い。
それらの区分を判定するロジックは散乱しやすい傾向にある。

区分ごとのクラス分け、列挙型を利用した場合分けの整理方法などを解説してくれている。
その他にも、早期リターン、ガード節、多態といったテクニックも載っている。

この章を読んで、リファクタリングのテクニックを少しでも身につけていこう。

3章

「データ格納だけのデータクラス」と「ロジックだけの機能クラス」に分ける。
このような設計は、全体のコードの見通しが悪くなることを伝えてくれる。
データの定義場所データの使用場所が違うとロジックの重複や散乱を招く。

重複や拡散を防ぐために「共通機能を取り揃えた汎用クラス」を用意すればよい?
これも失敗しやすいので注意が必要だ。
膨大な数のメソッド、引数大量メソッド。そんなメソッドは誰も使わない。

データとロジックが一体なクラス、凝集度、パッケージ、「三層+ドメインモデル」の導入。
この辺の解説がされているので、クラス設計が苦手な人は参考にしてみると良さそうだ。

4章

ドメイン駆動を学びたい人は、この章は特に気にしておいた方が良いだろう。
この章では、ドメイン駆動で最も重要(と私が勝手に思っている)なドメインモデルの設計について解説されている。

  • ドメインモデルとは何か。
  • ドメインモデルで設計する良さ。
  • ドメインモデルは部分を作りながら全体を組み立てる。
  • 業務の関心事はヒト/モノ/コトの3つに分類できる。
  • ドメインモデルは日々改善するもの。
  • ドメインエキスパートとの会話のコツ。

ドメインモデルの理解、作り方、見つけ方、実践の解説が丁寧にされている。
この章は、とにかく読んで理解しよう。損はしないだろう。

5章

「三層+ドメインモデル」の設計における「アプリケーション層」の説明だ。

アプリケーション層はごちゃごちゃしやすい。
DBの入出力の都合に引っ張られ、画面の関心ごとに振り回されやすいのだ。
しかも、業務ロジックを書きたくなってしまう場所なのだ(ドメインモデルが貧弱であるきっかけ)。

  • アプリケーションサービスは小さく分解する。
  • アプリケーションサービスクラスの利用側と提供側との約束とは。
  • アプリケーションサービスクラスからはDB操作を意識させるな

正しいアプリケーションサービスの設計を知ることができるであろう。

6章

しばらくオブジェクト指向やDDD関係の話が続いてたが、この章ではDB設計について解説してくれる。

NULL値前提カラム、マジックナンバー入り放題カラムを私は何度も見た(作った)ことだろう。
こういった拙いDB設計はプログラムを複雑性に繋がる。

  • 拙いDB設計の事例紹介。
  • 「NOT NULL制約」「一意性制約」「外部キー制約」が大事な理由。
  • 業務の関心事の一つ「コト」の記録の徹底と工夫。
  • 状態の参照手段(ここは分散型や非同期な処理の話があり難しいかも)

DB設計に自信がない人ほど、参考になることが多いであろう。

7章

個人的に一番衝撃が大きかった章かもしれない。
私には、「MVCにおけるモデルとビューは分離する」という考え方が染み付いてたことを自覚した。

書籍にも載っていた例だが、検索結果の件数表示で「見つからない」や「xx件見つかった」などの場合分けがあった時、
私は必ず画面側のテンプレート上でif文を設けて表示する文字を切り替えていた。

文字列表現は利用者の関心事ドメインオブジェクトに記述

つまり、上例のような文字列表示の違いはドメインオブジェクトが出し分けを行うようにする。
ここらへんの観点が無かったので、衝撃はあれど勉強になった。

他にもタスクベースUIや画面デザインの4原則などが解説もある。
新鮮な気持ちでこの章を読むことができた。

8章

Webアプリ開発において、広く普及しているWeb APIについての解説がされている。

  • 良くないAPIと良いAPIはどういったものか
  • HTTPメソッドは適切に指定する
  • APIが取り扱うデータとドメインオブジェクトのマッピング
  • APIは小さい部品の方が発展性がある

他には、APIを開発する上で便利な支援ツールの紹介等がある。
API開発の基本的な内容になるので、ぜひ参考にしていこう。

9章

この章では、開発プロセスやマネジメントについて語られている。

顧客のニーズの多様化により事業環境の変化が著しい昨今において、
オブジェクト指向はまさに開発と変更に適した開発手法の一つであろう。

分析と設計が一体になりプログラムの自己文書化が進むことで、
ドキュメントの管理や進捗管理が圧倒的に楽になる。

オブジェクト指向的な開発を進めていけるためにも、
企業間の契約や実際の開発要員の調整や組織体制づくりも意識していくべきだろう。
そんなことを感じさせてくれる章であった。

10章

オブジェクト指向を学ぶ上での参考情報として、リファクタリングオブジェクト指向エクササイズの紹介がある。
他にも参考書籍をいくつか紹介してくれている。

どれも最高に良い書籍だ。(たぶん)

最後に

あくまで、私の周辺での話になるので参考程度ではあるが、
ある会社では実際に書籍の内容を実践してみたり、ある人はこの書籍を布教していたりと、書籍の評判は良さそうな感触があった。(書籍の内容で社内チャットが盛り上がったくらいだ)

話のネタにもなるので、私のように積読している方がいらしたら、ぜひ、一度読んでみることをオススメする。

Discussion