保守性向上のためのアプリケーション設計の思想 2022-02
何を実現したいか
そのために何を意識するべきか
処理を抽象化してレイヤー分けする → 同じレベルでは抽象度が揃うことで、読みやすく理解しやすいコードになる https://docs.google.com/drawings/d/e/2PACX-1vRPN_1YN41harf_zmHqxTPC3k90DZFVY9jfSnlmYLjSdQbciuUs3EpDwpWtSBgMfxIhwhN9iZNz3K-s/pub?w=442&h=406&ext=.png https://docs.google.com/drawings/d/1uEctKMdhjHTDNZISVAbQgbjZyiq9Xrx_qpX5VISaMYY/edit?usp=sharing
モジュールを塊に分けて (= 大きなモジュールを作り)、構造を与える → アプリケーション全体の構造を理解しやすくなる このとき、モジュールの凝集度を上げて、モジュール間の結合度を下げることを意識する https://docs.google.com/drawings/d/e/2PACX-1vSf6zvkTeyZlVzv-S6XG1FHANye8qcfa8NxB03Y614qYskxxgEW3WEQR1-CiN5n_46LGRwxWocqSzcj/pub?w=613&h=379&ext=.png https://docs.google.com/drawings/d/1ucJOxmrcjO9A_wWUgR6Xx-GJzRd7gPdQXUjYPFoyT_g/edit?usp=sharing
テストしにくい実装詳細 (UI 処理やネットワーク通信) を入れ替えられるように → テスト可能性を高める
実装詳細 (外部とのやり取りなど) を依存の外側に置き、アプリケーションのコアな部分を依存の中心に置く → テスト可能性を高める
https://docs.google.com/drawings/d/e/2PACX-1vSRuM8OYYjk_k9ZMRUQJx22cFHM_qcuLvHhU9XkRMjnMV2PUQ_E1C60QWCvtPTXsEOZ3xTY3oTXAn2K/pub?w=759&h=476&ext=.png https://docs.google.com/drawings/d/1j60VAY9GvDh6rdhrWerHpzJ4KcXPAfmrBubElSg8gnM/edit?usp=sharing
具体的にどういう風に設計を考えるか
まずはアプリケーションのコア部分とそれ以外を分ける
アプリケーション全体設計を考えようとするといろいろ考えることがあって大変だが、まずはここが一番重要なのでここから考える
その中でも、まずは、利用者とシステムの相互作用を基に抽象的な入出力を考える
「利用者が何のためにシステムを利用するか? どのように相互作用するか?」 という点 (すなわちユースケース) アプリケーションロジック部分 (ユースケースクラス (?)) は、ユースケースシナリオレベルの抽象度で捉える
外部 IO のような実装詳細を外に置きたいものについては外部から依存注入するためのインターフェイスを置く nobuoka.icon とはいえ、マルチスレッド処理とかトランザクション処理とか通信の待ち合わせなどの、アプリケーションとして必要な処理もこのレイヤで実装すべきかなと思ったりはしている
アプリケーションのコア部分以外は、アプリケーションのコア部分のインターフェイスとの繋ぎこみを考慮して検討
参考文献