新しいものを表示
orange さんがブースト

実用的なプログラムは必ずそういう「そこは信用します」というレベルを程度の差こそあれ持っていて、「そこは信用しますレベル」は invariant がどれだけあるか、どれだけ強い条件かで決まってくる。
で、その信用を裏切られたときクラッシュ以外の行為に意味がない、という話です

スレッドを表示

成功したって事は成功したかも?><;
それで例えば"123"って文字列を投げて整数型の123じゃなく420とかが返ってきちゃったかどうか? って実行時には検査しないかも><
というか現実的にその整数型にパースするやつが実行時に狂ったかどうか調べるのは現実的じゃないかも><

orange さんがブースト

その「内部を区切ってお互いを信用しない」はモジュール間連携の話で、それは確かに私も同意なんだけど、それをどこまでやるかという話ですよね。
たとえば文字列をパースして整数にする処理が成功した後に「や、ライブラリは『文字列を整数にできた』と報告してきたけど、本当にそれって正しいのか……?」と疑いますかと

ソフトウェアがモノリシック的かどうかって事になるんだと思う><
クラッシュさせるって事はある一部分に問題があった時に全体を信用しないって事になるかも>< なぜかアプリケーション単位(プロセス単位)で><
クラッシュさせない方の考え方は、内部を区切って行ってお互いを疑いまくり期待しないでおいて、頼んだ先がダメだったら出来る限りのこと、例えばファイルを閉じたり色々なリソースを解放したり、可能であればエラーダイアログを出したりエラーログを書き出したりとか、なるべく穏便な終了処理を試みるかも><

orange さんがブースト

たとえばあなたは C++ 標準ライブラリのあらゆるバグを想定して検査をかけますかと。まあ普通はかけない。
何故検査をかけないかというと、ライブラリが仕様通りに動作すると暗黙に信用していて、かつライブラリが狂っているときは自分も狂っていることになるという一連托生状態を受け入れているから。

スレッドを表示
orange さんがブースト

で、通常は依存ライブラリというのは自分並に信用しているので、依存ライブラリやモジュールが狂っているのは即ち自分が狂っているのと等価に扱うべき

スレッドを表示
orange さんがブースト

で、狂人に「あなたは狂人ですか?」と尋ねるのは根本的に作りがおかしくて、『わたし』の側で「こいつ狂人じゃん!」と気付くのは常に『わたし』側で実装された処理の責任

スレッドを表示
orange さんがブースト

blog.cardina1.red/2019/12/19/d

> つまり、プログラムが不整合状態になったとき、プログラムは全体として既に想定を満たさない状態で動いている可能性があり、その結果として発生する処理やデータも基本的に無意味である[6]。 その無意味な処理で無意味なデータを解釈して「復帰」しようとする行為も、当然無意味である。

スレッドを表示
orange さんがブースト

他人が狂人だったらオメーが自衛しろ、自分が狂人かもしれなかったら死ね、と言っています (言葉が悪い)

微妙に納得いかない><;
狂人に「狂っているか?」と聞いてまともな返事が得られると期待すべきでは無いかも><
多重チェック出来るのであればすべきかも><
そこまでの手間をかけられるのであれば、あるセクションが(理由を問わず)実行不可能だった場合を想定するように書く手間を惜しむのは謎かも><

orange さんがブースト
orange さんがブースト

見分けがつかない場合もあるでしょうし、あるいは正しく設計すればそもそもそんなことが起き得ない書き方もできるでしょうね。それは言語の表現力とユーザの設計次第。

orange さんがブースト

blog.cardina1.red/2019/12/19/d

端的にはコレです

> * プログラムが完全に掌握しているはずのデータが誤っていれば、 panic せよ
> * プログラムのバグが原因なら、 panic せよ
> * 環境や外部データに問題があるなら Result を返すべし
> * エンドユーザに問題があるなら Result を返すべし
> * ありえないことが起きたなら panic せよ

スレッドを表示

検出可能かというかファイル内容の不整合と見分けがつくのかが謎かも・・・><

orange さんがブースト

たとえばですが、
「jsonファイルがフィールド a と b を持っている」
という想定があったとして、「a や b がなかったり余計な c があったりするファイルを読んだ」は「想定可能なエラー」なんですよ。この場合クラッシュすべきでない。

で、じゃあどういう場合にクラッシュすべきかというと、
「json ファイルがフィールド a と b を持っていてそれを読んだのに、返すオブジェクトで a の値を設定し忘れた」とかそういう「デシリアライザが仕様違反を犯している場合」です。
この場合「デシリアライザが『こういうデータを読みますよ』と (仕様で暗黙に) 表明したデータ以外を返す」というのは仕様外動作なので、そこから復帰しようとすべきでない。

orange さんがブースト
orange さんがブースト

ファイル等の読み込みの場面は、ファイルが正しいフォーマットである事に期待する事自体が危険だと思うかも・・・><

なんでファイル等の読み込みの場面でオレンジが神経質に考えるかというと、そこが型付けの場面で静的な型に収まっている世界と収まっていない世界の境界になるので、静的に型付けされていない側は徹底的に疑って期待しないかも><

ファイル等の読み込みの場面は、ファイルが正しいフォーマットである事に期待する事自体が危険だと思うかも・・・><

orange さんがブースト

それは単に仕様の問題で、もちろん「実装のバグも仕様として想定されたエラーと見做す」という仕様にしてもいいんですよ、そのコストが本当に得られるものに釣り合うなら。

古いものを表示
:realtek:

思考の /dev/null