kuwana-kbの開発/学習ブログ

プログラミング、クラウドインフラのWeb開発/学習ブログ

「現場で役立つシステム設計の原則」 書評

こんばんは、kuwana-kbです。 今回はソフトウェア設計に関する書評です。

最近、チームの開発タスクで「○○機能を実装する」というタスクをこなせるようになってきました。 どんなタスクか具体化すると、仕様書にある「入力」と「出力」に基づいた実装を書くことです。 これができるようになってきたのは、大変喜ばしいことです。これができるということは、自分の手でプログラムを作って動かせるということを意味します。 例えば、Lambdaなどで日常のタスクを自動化したりなんかもできますね。

しかし、喜ばしいのと同時に新たな課題を感じています。 それは設計です。どうしたら変更に強くて可読性の高いソースコードになるのか、といった課題を感じています。 「作れるようになったのはいいけど、この作り方でどれくらい運用できるだろうか…他の人からみたら読みづらくないだろうか…」という不安に駆られる感じですね…。 そこで、今回は「現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法~」という本を読みました。

ちなみに私は設計に関して完全な初心者なため、本書を著者の意図通りに理解できているか微妙です。 そんな初心者が書評をまとめるのはどうかな…という気もするんですが、そういう視点の書評もあって良いだろうと開き直ってまとめたいと思います。

ざっくりと3行でいうと

この本の紹介

この本は、システム設計の解説書です。
序盤は「わかりやすく、変更に強い」コードの書き方に関する解説で、中盤以降は「三層+ドメインモデル」による設計の解説がメインになります。 参考までに、以下は本書の目次になります。

  1. 小さくまとめてわかりやすくする
  2. 場合分けのロジックを整理する
  3. 業務ロジックをわかりやすく整理する
  4. ドメインモデルの考え方で設計する
  5. アプリケーション機能を組み立てる
  6. データベースの設計とドメインオブジェクト
  7. 画面とドメインオブジェクトの設計を連動させる
  8. アプリケーション間の連携
  9. オブジェクト指向開発プロセス
  10. オブジェクト指向設計の学び方と教え方

本書では、サンプルコードとしてJavaが使われています。 とはいえ、何かしらの言語の基礎をわかっていれば、躓くことなく読めると思います。 私はJavaをよく知らなかったので、ネットでJavaの基礎を1時間ほど調べてから読み始めました。

この本の3つのポイント

リファクタリングのテクニックを学べる

本書では、プログラミングの具体的なテクニックを学べます。 私が過去に読んだ本でいえば、「リーダブルコード」に近しい内容です。 どうすればわかりやすく変更に強いコードを書けるか、という視点で様々なテクニックが紹介されています。

コードの改善方法が段階的に解説されているため、各テクニックがどういうメリットをもっているか理解しやすかったように思います。 また、サンプルコードもあり実践的な内容になっているため、すぐにでも適用できる内容である点も良いと思いました。

ドメイン駆動設計の理解の足がかりになった

私はDDD本をまだ読んだことがないのですが、周りの人から難解な本である、という話は聞いていました。 本書を読むきっかけとなったのは、チームでDDDを採用しているためDDD本を読もうとしていたところを「その前にこの本を挟んだほうが良いよ」と会社の先輩から助言頂いたからでした。

本書で紹介されているオブジェクト指向の設計方法は、ドメイン駆動設計に基づいたものです。 実際にドメイン駆動設計と明言はされていませんが、「三層+ドメインモデル」として紹介されており、参考文献としてエリック・エヴァンス氏のDDD本が何度か登場します。

「三層+ドメインモデル」の解説の流れとしては、ドメインモデルとはなにかという解説から始まり、 三層であるプレゼンテーション層、アプリケーション層、データソース層におけるノウハウや注意点の説明がなされています。 ドメインモデルという抽象的な概念の説明も充実していますし、三層における具体的なノウハウもわかりやすかったです。

特にプレゼンテーション層の解説において、利用者の関心事が画面とドメインオブジェクトで一致する話は納得感がありました。

その他にも本書では以下の点を繰り返し述べていたことも印象的でした。

  • 現実の関心事をドメインモデルとして、プログラムの関心事を三層として分ける
  • 現実の関心事が三層に漏れ出すと変更が難しく読みづらいコードになっていくので、それをどのように防ぐか
  • データとロジックをまとめることを徹底する(手続き型言語との対比として)

また、個人的には本書で説明されているドメインモデルの設計についてどこまでがDDDで、どこからが筆者の意見であるかというのが分かりづらいように思いました。 (そもそも本書はDDDの解説書ではなく、「現場で役立つシステム設計の原則」なので筋違いの意見になってしまうのですが…) これは、DDD本を読んでいない私が原因なので、DDD本を読んでからもう一度向き合いたいです。

設計に関する次の学習指針を立てられた

最後の章では「オブジェクト指向設計の学び方と教え方」について解説がされています。 本書で出てきた概念やテクニックを深掘りしたい方にとっては、ありがたいページです。 個人的には、「リファクタリング」と「エリック・エヴァンスのドメイン駆動設計」は是非読みたいと思っていた本なので、今後の学習計画の指針になりました。

まとめ

以上が「現場で役立つシステム設計の原則」の書評でした。

序盤のわかりやすく、変更に強いコードの書き方は初心者の方でもすぐに実践できるような内容です。 途中で登場するドメインモデルは、私にはまだ全てを理解することができませんでしたが、おおよその「DDDの地図」ができたように感じます。 次はエリック・エヴァンス氏のDDD本に挑戦してみたいと思います。