タグ付けされた質問 「defensive-programming」

16
将来必要になる可能性がある場合に備えて、冗長コードを追加する必要がありますか?
正しくも間違って、私は現在、コードを可能な限り堅牢にするように常に努めるべきだと考えています。これは、今は役に立たないことがわかっている冗長コード/チェックを追加することを意味しますが、 x数年後かもしれません。 たとえば、私は現在、次のコードを含むモバイルアプリケーションに取り組んでいます。 public static CalendarRow AssignAppointmentToRow(Appointment app, List<CalendarRow> rows) { //1. Is rows equal to null? - This will be the case if this is the first appointment. if (rows == null) { rows = new List<CalendarRow> (); } //2. Is rows empty? - This will be the case …

14
TDDは防御的なプログラミングを冗長にしますか?
今日、同僚と興味深い議論をしました。 私は防御的なプログラマーです。「クラスは、クラスの外部から対話するときにオブジェクトが有効な状態になることを保証する必要がある」というルールを常に順守する必要があると思います。このルールの理由は、クラスがそのユーザーが誰であるかを知らず、違法な方法で対話された場合に予想通り失敗する必要があるためです。私の意見では、この規則はすべてのクラスに適用されます。 今日議論した特定の状況では、コンストラクターへの引数が正しいことを検証するコードを作成しました(たとえば、整数パラメーターは> 0でなければなりません)。前提条件が満たされない場合、例外がスローされます。一方、私の同僚は、ユニットテストがクラスの不正な使用を検出する必要があるため、このようなチェックは冗長であると考えています。さらに、彼は防御的なプログラミングの検証もユニットテストする必要があると考えているため、防御的なプログラミングは多くの作業を追加するため、TDDには最適ではありません。 TDDが防御的なプログラミングを置き換えることができるというのは本当ですか?結果としてパラメーターの検証(およびユーザー入力を意味するものではありません)は不要ですか?それとも、2つの手法は互いに補完するのでしょうか?

4
if( 'constant' == $ variable)vs. if($ variable == 'constant')
最近、私はPHPで、特にWordPressフレームワーク内で多くのことをしています。私は次の形式の多くのコードに気付いています: if ( 1 == $options['postlink'] ) 期待していた場所: if ( $options['postlink'] == 1 ) これは特定の言語/フレームワークで見られる慣習ですか?前者のアプローチが後者よりも好ましい理由はありますか(処理の観点、または構文解析の観点、あるいは人間の観点からも) それとも単に好みの問題ですか?ある定数に対してテストされる変数項目は左側にあると、テストを実行するときは常に良いと思っていました。「チョコレートがケーキの場合」よりも、「ケーキがチョコレートの場合」という自然言語での質問の方がよく似ているようです。

10
堅牢なコードを定義するものは何ですか?
私の教授は、「堅牢な」コードについて話すとき、このJavaの例を参照し続けます。 if (var == true) { ... } else if (var == false) { ... } else { ... } 彼は、「堅牢なコード」とは、プログラムがすべての可能性を考慮に入れており、エラーなどは存在しないことを意味すると主張しています。 しかし、私は疑っています。変数がブール値の場合、3番目の状態が論理的に不可能なときに3番目の状態をチェックするポイントは何ですか? 「エラーのようなものを持たないこと」もばかげているようです。Googleアプリケーションでさえ、エラーを静かに飲み込んだり、何らかの形でそれらを有効な状態と見なしたりするのではなく、ユーザーに直接エラーを表示します。そしてそれは良いことです-私は何かがうまくいかないときを知ることが好きです。そして、アプリケーションにエラーが発生することは決してないだろうという主張はかなりのようです。 それでは、「堅牢なコード」の実際の定義は何ですか?

7
メソッドが不正な入力を返すことができないことがわかっている場合でも、メソッド呼び出しの戻り値を検証する必要がありますか?
呼び出しているメソッドがそのような期待を満たしているとわかっていても、メソッドが呼び出した期待値を満たしていることを検証することで、メソッド呼び出しの戻り値に対して防御する必要があるかどうか疑問に思っています。 与えられた User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } 私はすべき void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } または void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …


3
リフレクションを通じてプライベートメソッドが呼び出される状況に対処する必要がありますか?
ライブラリを作成するとき、同じクラスの他のメソッドではなく、リフレクションを通じて別のライブラリによって呼び出されたときに、プライベートメソッドが期待どおりに動作することを確認する必要がありますか? たとえば、プライベートメソッドが以下をprivate DoSomething(int number)期待している場合: number は、ゼロ以外の正の整数であり、次のとおりです。 プライベート変数string abcはnullではなく、空の文字列でもありません。 そして、完全に、これらの2つの条件が一致しない場合、い失敗します。クラスのすべてのメソッドが常に空でない値を割り当てて、をabc呼び出す前にこれらの失敗を処理する必要がありDoSomething、これに正の非ゼロ整数を渡します方法? 言い換えると、リフレクションによる安全でない呼び出しから保護されていないコードは低品質コードと見なすことができますか、それともリフレクションを使用して呼び出しが何も中断しないことを保証する呼び出し元に属しますか? 注:私の質問は、ライブラリの標準セットのみを対象としています。これは、高度に安全でなければならないコード(つまり、予期しない動作やクラッシュをさせるためにリフレクションを使用することに興味がある場合)をカバーしません。 ¹他の開発者がこのメソッドを壊さないようにするための十分な単体テストがあるため、クラスが正しく文書化されているため

4
私たちはどれほど守勢すべきですか?
私たちはいくつかのコードでPexを実行しており、いくつかの良い点を示してきました(悪い点はありますが、本番環境に到達する前にそれらを示しています!)。 ただし、Pexの優れた点の1つは、問題の検出を必ずしも停止する必要がないことです。 見つかった1つの領域は、文字列を渡すときに空の文字列をチェックしていなかったことです。 そこで変更しました: if (inputString == null) に if (string.IsNullOrEmpty(inputString)) // *** それは最初の問題を修正しました。しかし、その後、Pexを再度実行すると、次のことが決定されました。 inputString = "\0"; 問題を引き起こしていました。その後 inputString = "\u0001"; 私たちが決定したのは、遭遇// ***した場合にデフォルトを使用でき、他の奇妙な入力によって引き起こされた例外を見て喜んでいるということです(そしてそれを処理します)。 それで十分ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.