「PHP7 で堅牢なコードを書く」 のスライドを見て

PHP7 で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計 / PHP Conference 2016

一年前にも見てその時は曖昧な理解だったけども、今見たら「それありがたい!わかる!そういう名前ついていたの...あ、そういう考え方もあるのか、なるほど...」となった

嬉しみ

  • 防御的プログラミング
    • やって欲しいことをやりやすく、やって欲しくない事をやりづらくする
    • 型による防御
  • 攻撃的プログラミング
    • 中途半端に動くより死んだ方がマシ(原因を特定しやすい、影響が小さく済む)な時にやる
    • 正当性と堅牢性
      • 個々のクラスは正当性を重視する
  • 表明プログラミング
    • 表明は、実装するエンジニア間で必要なコミュニケーション
    • 副作用があってはいけない。本番ビルドで無効になる表記をする。(-> assert)
  • 契約プログラミング
    • 契約プログラミング = 正しさを保証する
      • 状態P(事前条件) の時に プログラムA を実行したら、必ず 状態Q(事後条件) になる
    • 責任の所在
      • 事前条件を守れていない場合はプログラムAを "利用している側" がバグの原因である
      • 事後条件を守れていない場合は "プログラムA(が中で利用している処理)" がバグの原因である
    • バグ or 例外
      • 常に失敗する条件は"バグ"
        • etc) 間違ったSQL文(=バグ)が渡されたら Error を投げる
      • たまに失敗する条件は"例外"
        • etc) ネットワーク障害(=例外)の場合は Exception を投げる

雑感

  • 防御的プログラミング
    -> 手法の名前は知らなかったが、会社の人がやっていたのを真似して常日頃嬉しみを感じていた部分で、名前知れてよかった。
  • 正当性と堅牢性
    -> 正当性について自分の認識が曖昧だったのが更新された。対で考えてなかったけど、片方を上げればもう一方が下がる対の存在だよなぁ。堅牢性はViewの所でいい感じにやるのが良いかな、というかそうしていたように思う。
  • 表明プログラミング
    -> 集約のスライドでも見てなんとなく良さげ〜ぐらいしか思っていなかったけど使いどころが腑に落ちた。(assertの使い所いまいち分かっていない問題も解決した)
  • 契約プログラミング
    -> 日頃作っていて責任の所在に悩むことがあり、所在に悩むと値チェックもエラーハンドリングもどこでやるべきなのか悩んで困るのだけど、分け方が腑に落ちた(多分)