3

入力がいくつかの定数文字列の 1 つであるかどうかをテストしたいと仮定し、パフォーマンスを無視すると、コーディングのアンチパターンになります。

if ("yes oui ja da".contains(answer)) {
    // answer was in the affirmative
}

より従来の代わりに:

private static List<String> affirmativeAnswers = Arrays.asList("yes", "oui", "ja", "da");

if (affirmativeAnswers.contains(answer)) {
    // answer was in the affirmative
}

コードが大幅に減り、読みやすくなっていますが、これは「ハック」でしょうか?

編集:

安全性を高めるために、部分一致が心配な場合は、次のようにコーディングできます。

if (",yes,oui,ja,da,".contains(',' + answer + ',')) 

それはまだコードがはるかに少ないです(醜くなっていますが)

4

5 に答える 5

5

さまざまな理由から、これは醜いハックと見なします。

  • 予期しない入力に対して堅牢ではありません。たとえば、("yes oui ja da".contains(" "))true が返されます。おそらく意図したものではありません。これが一番の問題だと思います。さらにトリックを追加し始めたとしても (最近の編集でのコンマのように)、考慮すべき厄介なコーナー ケースがまだあります。
  • 一般的なケースではそれほどパフォーマンスが高くありません-テストする可能性が中程度または多数ある場合は、連結された文字列をスキャンするのではなく、 HashMaporに対してチェックする方がよいでしょう。HashSetO(1)O(n)
  • 経験の浅いコーダー/将来のメンテナーを混乱させる可能性があります。コードを保守可能にしたい場合は、巧妙なトリックを使用しないでください。
  • 将来のリファクタリングには向いていません (たとえば、文字列の国際化?実行時に可能性のリストを動的に変更する?)。
于 2013-01-02T06:34:48.887 に答える
1

文中の文字列の存在を確認したい場合は、
string.contains(string)が実行可能です。

それ以外の場合、文字列全体が等しいかどうかを確認する場合は、
list.contains(string)が実行可能です。

于 2013-01-02T06:43:13.087 に答える
0

また、AFAIK、String containsメソッドは、正規表現を使用して、サブストリングがストリングの一部であるかどうかをチェックします。また、この操作は、リストの検索(AFAIK)に比べてコストがかかります。だからIMO、今はリストを使うほうがいいですね。;)

于 2013-01-02T06:42:14.267 に答える
0

可能な場合は依存関係を削除します

私の意見では、それはベストプラクティスではありません。ベストプラクティスでは、受け入れ文字列への依存関係を削除できます。この場合、依存関係はこの("yes", "oui", "ja", "da")文字列のリストです。ただし、文字列のリストへの依存関係をサービスまたはデータベースに移動する場合、それを受け入れるメソッドに統合するのは非常に簡単ですが、それを受け入れるメソッドList<string>に統合しようとすると問題が発生する可能性があります。単にを期待しstringます。

スコープを覚えておいてください

いつものように、これはスコープによって異なります。この小さなことを一度だけ行う必要があり、それが非常に小さなプロジェクトの一部であった場合、それは実際にはほとんど違いがありません。ただし、これが小規模ではないプロジェクトの一部である場合、ベストプラクティスが守られていなければ、将来的にリファクタリングが必要になる可能性があります。

コンパイラにコードを最適化させます

必要なコードの量に関しては、あまり心配する必要はありません。読みやすいことがより重要です。コンパイラはコードを可能な限り効率的にします。それが義務だからです。コンパイラに似たコードを書き込もうとしないでください。より良いアプローチが出現すると、コンパイラはそれらを使用しますが、エミュレートされたコードは同じままです。

于 2013-01-02T06:43:10.027 に答える
0

...言語の乱用ですか...

「Java - 彼は気にしない!!」. でも「えっ!!いやだ!!」1 .

しかし真剣に、コードを読みやすく、保守しやすいものにすることを目指すべきです。(またはパフォーマンス...それが重要な場合。)

最小数のキーストロークを使用して何かを表現するトリッキーであいまいなコードは、上記のいずれにも当てはまりません。それは悪いスタイルです...コードが機能的に正しいとしても。


1 - 過去 1 年ほど岩の下に住んでいる場合は ... 私はこれをほのめかしています - http://knowyourmeme.com/memes/honey-badger .

于 2013-01-02T06:58:11.997 に答える