防衛的 vs 契約的プログラミング

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