防御的プログラミング
https://gyazo.com/478c1a0ca6a153ec8cbc83f43825f27e
defensive programming
「防御的プログラミング」とは、プログラミングに対して防御的になること、つまり「そうなるはずだ」と決め付けないことである。この発想は「防御運転」にヒントを得たものだ。防御運転では、他のドライバーが何をしようとするかまったくわからないと考える。そうすることで、他のドライバーが危険な行動に出たときに、自分に被害が及ばないようにする。たとえ他のドライバーの過失であっても、自分の身は自分で守ることに責任を持つ。同様に、防御的プログラミングの根底にあるのは、ルーチンに不正なデータが渡されたときに、それが他のルーチンのせいであったとしても、被害を受けないようにすることだ。もう少し一般的に言うと、プログラムには必ず問題があり、プログラムは変更されるものであり、賢いプログラマはそれを踏まえてコードを開発する、という認識を持つことである。
Steve McConnell. 【電子合本版】Code Complete 第2版 完全なプログラミングを目指して (Japanese Edition) (Kindle の位置No.5012-5019). Kindle 版.
プログラムは変化するものなのだから、「仕様通りでない」としても、不正な入力に対して防御的であるべき。
色々な対処パターンを使って、防御的なコードを書く。
上品にクラッシュさせる物は残しておいてもいいし、ビジネスロジックが矛盾するような物はクラッシュしてくれた方がユーザーもうれしいかもしれない。最終的に製品コードにどう配置するかは別の問題。
対処パターン
アサーション
不正な入力時はエラーをアサートする
開発時のみ
契約による設計
MicrosoftWordのソースコードでは、常に真であるはずの条件がアサートされるようになっているが、エラーはアサーションが失敗した場合に備えてエラー処理コードでも処理される。Wordのように、大規模で複雑な寿命の長いアプリケーションでは、アサーションは開発時のエラーをできるだけ多く暴き出すのに欠かせない。しかし、アプリケーションは非常に複雑で(数百万行のコードから成る)、改良を重ねてきているので、ソフトウェアをリリースするまでにすべてのエラーが検出され、修正されると考えるのは現実的ではない。このため、製品版のシステムでもアサーションでエラーに対処しなければならない。
Steve McConnell. 【電子合本版】Code Complete 第2版 完全なプログラミングを目指して (Japanese Edition) (Kindle の位置No.5148-5154). Kindle 版.
エラー処理
正当性と堅牢性
正当性: 不正確な動作は絶対にしない
堅牢性: 絶対にストップしない、ソフトウェアの実行の継続に手を尽くす
バランスを取りながら処理をする
例外
コードの正常な流れとは別の次元でエラー処理を実行している。
例外の最大の利点は無視できないということ。エラーを返すなら無視できる
絶対に発生してはいけない状態にのみ使う。
例外はカプセル化を弱め、これによりコードの複雑さが増す。
エラーコードを返す、アサートする、エラーを処理してしまう、など色々手法はあるはず
デバッグエイド
デバッグの補助ツール。デバッグコードのような。
Code Complete 第2版 完全なプログラミングを目指して