1. ホーム
  2. language-agnostic

[解決済み] お気に入りの(賢い)防御的プログラミングのベストプラクティス【非公開

2022-04-29 03:01:04

質問

もし、あなたが自分のことを選ぶとしたら <強い お気に入り (防御的なコーディングのための(賢い)テクニック、それは何でしょう? 現在の使用言語はJavaとObjective-C(C++のバックグラウンドあり)ですが、どの言語でも自由に回答してください。 ここで強調したいのは 賢い 7割以上の人が知っている防御法以外のテクニック では、次はあなたのトリックのバッグを深く掘り下げる番です。

つまり、これ以外を考えてみてください。 つまらん の例です。

  • if(5 == x) ではなく if(x == 5) : 意図しない代入を避けるため

以下は、いくつかの例です。 魅力的な 防御的なプログラミングのベストプラクティスです(言語固有の例はJava)。

- 変数を変更する必要があるとわかるまで、変数をロックすること

つまり すべて 変数 final を変更する必要があることがわかるまで、その時点で final . よく知られていないこととして、これはメソッドのパラメータにも有効です。

public void foo(final int arg) { /* Stuff Here */ }

- 悪いことが起きたら、証拠を残しておくこと

例外が発生したときにできることはたくさんあります。もちろん、例外をログに記録したり、何らかのクリーンアップを行ったりすることもできます。 例えば、変数を "UNABLE TO LOAD FILE" や 99999 のようなセンチネル値に設定すると、デバッガで例外を回避する際に便利です。 catch -ブロック)。

- 一貫性に関して言えば、悪魔は細部に宿る

使用している他のライブラリと同様に一貫性を持たせること。 例えば、Javaで、値の範囲を抽出するメソッドを作る場合、下限値を インクルーシブ と上限 排他的 . これにより、以下のようなメソッドとの整合性が保たれます。 String.substring(start, end) も同じように動作します。 Sun JDK のこの種のメソッドはすべてこのように動作します。要素の反復を含むさまざまな操作を配列と一致させるためで、インデックスがゼロから始まる ( 包括的 )から配列の長さ( 排他的 ).

では、あなたが好きな守備の練習方法を教えてください。

更新:まだの方は、ご自由にご意見をお寄せください。 を選ぶ前に、もっと多くの回答が来るようにチャンスを与えています。 オフィシャル の答えです。

どのように解決するのですか?

c++で、私はかつて、フェンスポストエラーをキャッチするための余分なメモリを提供するように、newを再定義するのが好きだった。

現在、私は防御的なプログラミングを避けて、次のようなものを好んで使っています。 テスト駆動開発 . エラーを素早く外部でキャッチすれば、防御的な作戦でコードを濁す必要はなく、あなたのコードは DRY -そして、その結果、防御しなければならないエラーが少なくなる。

WikiKnowledgeが書いたように :

<ブロッククオート

防御的なプログラミングを避け、代わりにFail Fastを行う。

防御的なプログラミングとは というコードを書く習慣のことです。 を補おうとする。 データの不具合、コードの書き方 呼び出し側が に適合しないデータを提供する。 呼び出し元と呼び出し先の間の契約 サブルーチン は、何らかの方法でそれに対処しなければなりません。