概要
書籍詳細
タイトル
良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
著者
仙塲 大也
出版社
技術評論社
発売日
2022/4/30
カテゴリ
設計
Amazonリンク
良いコード/悪いコードで学ぶ設計入門 ―保守しやすい成長し続けるコードの書き方
この書籍を読もうと思った理由
- 良いコードと悪いコード、それぞれの認識が自分の中で明確なものがないという意識があったので勉強するため。
- SNSで話題になっていたりAmazon等で至るところでベストセラーとなっており、口コミも良かったため。
要約
第一章「悪しき構造の弊害を知覚する」
技術駆動命名や連番命名などの命名アンチパターン、仕様を理解しにくい深いネスト、データクラス設計における注意点などを紹介。命名については仕事していて迷うとこなのでアンチパターンの解説は非常にためになった。
第二章「設計の初歩」
章の名の通り、コードを書く上で初歩的な気をつけるべきポイントを紹介。主に変数の扱いについて解説している。変数名を省略しないこと、変数を使いまわさないこと、メソッドに切り分けること、扱う変数が増えてくると読み手の理解が難しくなってくるのでクラスにまとめること。
第三章「クラス設計」
オブジェクト思考におけるクラス設計の考え方を紹介。家電に例えながらクラス単体で正常に動作する重要性を説く。またインスタンス変数や値オブジェクトの考え方、バグの引き起こさいクラス設計の考え方について紹介している。
第四章「不変の活用」
主にfinalの使用の考え方を解説。変数や引数の可変が許可されていることにより思わぬバグが発生する可能性があることを理解した。(ちょうど職場でも同じような事例がありホットだった。)デフォルトは不変でよいというのが目から鱗だった。
第五章「低凝集」
変更に強い高凝集なクラス設計に必要な考え方を解説。前半はstaticメソッドの正しい指針を示し、データと処理がバラバラにならないようにする考え方を紹介。その他ファクトリメソッドの有効な使い方、共通クラスの設計方針、長すぎる引数を避ける方法がわかった。
第六章「条件分岐」
if・switch文の深いネストを防ぐ方法について解説。私も現場でifが何十にもネストし何千行といった地獄のコードを見たことがあるが、本章ではinterfaceを使用しif・switch無しで条件分岐を実現するなどミラクルな手法がいくつかされており、オブジェクト思考の理解が非常に深まった。
第七章「コレクション」
コレクション(配列やList)の処理を行う時にfor文やif文が深くネストすることを防ぐ方法について解説。第六書で早期returnがあったが今回は早期continue、早期breakといったテクニックも紹介する。またリストを扱う処理をインスタンスメソッドとして持つ方法も提案。
第八章「密結合」
ソフトウェア原則の単一責任の原則に基づいて設計し、モジュール間の密結合を防ぐ方法について解説。システムアーキテクチャにおいてもマイクロサービス等で疎結合が好まれるがクラス設計においてもこの考え方が重要であることがわかった。継承は使うべきでないというのにも驚いた。
第九章「設計の健全性をそこなうさまざまな悪魔たち」
この章では「デッドコード」「YAGNI原則」「マジックナンバー」「null問題」等コードに潜みがちな悪魔について解説される。ダメだと知っているものからこれもダメなんだみたいなものまで幅広くある。初心者でも意識しやすい内容になっている。
第十章「名前設計」
設計において一番悩みがちな命名における指針について解説する。「関心事」と「目的駆動名前設計」というキーワードでバグを生みにくく保守しやすい名前をつけるにはどうしたらいいかがわかる。その他ありがちなtmpのようなわかりにくい名前についての継承などについても。
第十一章「コメント」
ないはダメなのは当たり前だが、あれば良いだろうと意外と何も考えずに書きがちなコメントだが思わぬ落とし穴について解説。コメントはメンテナンスされにくいものであることを「退化コメント」と表現しコメントを残す上での肝を解く。またドキュメントコメントの有用性も。
第十二章「メソッド(関数)」
メソッドの設計方針について解く。「尋ねるな、命じろ」ではよくありがちなgetter/setterについての注意喚起、「コマンドクエリ分離」では状態の変更と問い合わせは分けるべきという指針、その他引数・戻りに対する重要事項について解説する。
第十三章「モデリング」
物事の特徴や関係性を整理するモデリングについて解説する。まず最初にどんなシステムにも登場する肥大しやすいUserクラスにおける重要な考え方について説明する。またシステムにおけるモデリングとは何なのかや目的や機能性に焦点を当てたモデリング手法について解説する。
第十四章「リファクタリング」
この章では既存のコードに対してリファクタリングでどう見通しの良いコードに変更するかについて説明する。複雑なネストの解消、意味のある単位でロジックをまとめる、条件を簡略化など取っ付きやすいアプローチ手法をまとめる。また単体テストについても解説。
第十五章「設計の意義と設計への向き合い方」
この章では改めて本書が何について書かれたものか、設計の意義について解く。またソフトウェアの構造の複雑度をどう数値化するか等、ソフトウェアの設計に対する尺度について紹介する。またその尺度を評価するに有用なツールについても記載。
第十六章「設計を妨げる開発プロセスとの戦い」
ソフトウェアの悪魔を呼び寄せる環境的要因や心理的要因について説明する。コミュニケーション不足が招いてしまう例や業務に追われることで招いてしまう例等が紹介されている。その他コーディング規約やレビューのルール化等の提案が記載されている。
第十七章「設計技術の理解の深め方」
本書を読んだ上で今後どう設計技術について学んでいくかについて指南。前半では設計に関する技術書の名著を多数紹介。後半は現場や自己学習でどう学び実践していくかの指針が紹介されている。
書評
読んだ感想
内容がわかりやすくかつ取っ付きやすいので設計初心者にも非常におすすめできる一冊だった。コードの細かい組み立て方からオブジェクト指向に基づく保守しやすいクラス設計等にも言及されており非常に勉強になった。
おすすめできる方
- オブジェクト指向を理解したい方・おさらいしたい方
- 良いコードと悪いコードを見分けれるようになりたい方
- クラス設計等を勉強したい方