Open6

不正な値との戦い

awonosukeawonosuke

アーキテクチャとバリデーション
どう防御するのか、防御的プログラミング、契約による設計

awonosukeawonosuke

契約、表明によるプログラミング
https://twitter.com/masuda220/status/1513637702800863232?s=20&t=BL3YcDfQw1YPW0WcmfAcew
https://yoshitaro-yoyo.hatenablog.com/entry/2022/08/07/On_Defensive_and_Contract_Programming

防御的プログラミング
https://chaingng.github.io/post/防御的プログラミング/

防御的プログラミングへの誤解

  • 入力をひたすらチェックしまくる(不正の検知という考え方自体はOK)
  • 不正な入力があった時になんとかしようとする(不正な入力を検知したら処理を中断、もしくは適切は中断処理を実施する)
  • ドキュメントに正しい使い方を詳説する(間違えた使い方をすることが難しいインターフェースの設計)

twadaさんの発表資料より引用

awonosukeawonosuke

サブルーチン(つまり関数、メソッドコール)の開始時に呼び出す側が必要とする条件をすべて満たし、呼び出された側は終了時に特定の条件で終了するように設計・プログラミングする手法です。

現在のPHPでもassert()を使って契約による設計を行えます。

「信頼境界線」

信頼境界線とはプログラムが入力されるデータやプログラムを信用してよいかどうか?を基準に境界線を引きます。

https://blog.ohgaki.net/design-by-contract-and-trust-boundary

awonosukeawonosuke

攻撃的プログラミングについて

攻撃的プログラミングの「攻撃的」とは、「⁠なにかおかしいことが起きたら、例外を発生させたりエラーを発生させて即時落とす。速やかに停止させる。無理やり動作させても、どうせその先で落ちるならさっさと停止させる。これで傷が浅くなる。障害を抱えて中途半端に動いているプログラムよりも死んだプログラムのほうがいい」と紹介しました。

「そんなにかんたんにシステムを落としていいのか?」という懸念については「アーキテクチャとプログラミングスタイルは別である」だとし、正当性と堅牢性を次のように説明しました。

  • 正当性とは、不正確なことを出すくらいなら死ぬこと
  • 堅牢性とは、ほどほどに死なないこと

https://gihyo.jp/news/report/01/phpcon2016/0002#sec3