防衛的 vs 契約的プログラミング
- 防衛的プログラミングと契約的プログラミングの違いやそれぞれのメリットについてまとめる
防衛的プログラミング
- システムへの入力に対して一切の仮定をしない設計思想
- ex) sqrt関数には負の数値も入力され得る→その場合はエラー値を返そう!
攻撃的プログラミング
- 異常値が入力された場合に速やかにプログラムをクラッシュさせる設計思想
- ex) sqrt関数には負の数値も入力され得る→その場合は
abort()
しよう! - 調べてたら見つけた (ソース)
- 矛盾するようだが,攻撃的は防衛的のサブセットだと個人的に思う
- releaseビルドに防衛的プログラミングの要素(異常値の判定と分岐処理)が含まれるため
契約的プログラミング
- システムへの入力に対して絶対の仮定をする設計思想
- ex) sqrt関数には負の数値が入力されてはいけない!→エラー処理は不要!
- C++の
assert(expr);
マクロなどは契約プログラミングの考え方- なぜなら,releaseビルドでは式が評価されず,分岐処理も存在しないから
まとめ
- フロントエンドは防衛的思想を強めに,バックエンドは契約的思想を強めにしていくのが,個人的にはいいと思う
- 落ちても良い&暴走するより落ちた方がマシなシステムの場合は,攻撃的思想を持てば楽になるかも
- 以下の表を参考に,状況に応じて防衛的か,契約的かを使い分けると良い
思想 | コード短さ | 実行時overhead少なさ | セキュリティ高さ | デバッグし易さ | ユーザー体験良さ |
---|---|---|---|---|---|
防衛的 | × | × | ○ | ○ | ○ |
攻撃的 | △ | × | ○ | ○ | △ |
契約的 | ○ | ○ | × | × | × |