はじめに
PHPerKaigi 2022の和田卓人(@t_wada)さんのスライドを実際にコード1を書きながら勉強してみた。
この記事はその学びのまとめ。
「防御的プログラミング」とは、問題発生を事前に防ごうというコーディングスタイル。
悪いコードに絆創膏をあてることではない。
結果、防御的になる
「防御的なコードを書く」という意識があるのと同時に、
対象を正しく表現した結果として間違いや想定外が入り込む余地が少なくなる、というのもあるように感じた。
『セキュア・バイ・デザイン』におけるセキュアなソフトウェア設計と同じようなイメージ。
「動作するきれいなコード」はさまざまな利点を生む。
小さなクラスを作る
ドメインの知識や責務を小さなクラスにまとめる。
その型を使うことで想定される状況が限定される。
そして、そのオブジェクトは常に整合性のとれたものだけが存在できるようにする。
正しい方向に流れやすくする
良いインタフェースとは次の2つの条件を満たすインタフェース
・正しく使用するほうが操作ミスをするより簡単
・誤った使い方をすることが困難
人間の注意力には限界があるし、楽な方に流されやすい。
流れてほしい方向に楽に行けるような仕組みを作ることが大切。
SimpleとEasy、正当性と堅牢性はレイヤーを分ける
「単純にしたいが使い易くもしたい」というジレンマはよくある。
これらは混ぜずに別のレイヤーで提供する、と学べたのは良かった。
まとめ
設計とは責務の最適配置を求め続けること。誰が何を知っていて何を知るべきでないか、何をやるべきで何をやるべきでないかを常に考え続けること
対象のドメインを分析し、コードを改善する、というサイクルを常に回し続ける必要がある。
これをやるには開発プロセスもそのような形にする必要があるだろうし、テストの自動化も必要になるだろう。
安全なソフトウェアやアジリティはそこから生まれてくる。