web-dev-qa-db-ja.com

ペアパラメータのセット

私は次のクラスを持っています、多くのようにこのクラスはペアとして入ってくる1つのパラメータに依存しています。もともと便宜上_params Object[] values_に設定し、偶数かどうかを確認しますif (values % 2 == 0)

サンプルコード:

_using RVD = System.Web.Routing.RouteValueDictionary;

/// <summary>
/// Allows for quick building of similar RVDs.
/// </summary>
public class RVDBuilder
{
    public RVD Template { get; protected set; }

    public RVDBuilder(RVD template)
    {
        this.Template = template;
    }
    public RVDBuilder(params Object[] routeValues)
    {
        if (routeValues.Length % 2 != 0)
        {
            throw new Exception("parameters must come in pairs of two!");
        }
    }
}
_

私はここで2つの視点を見ることができます:

  • これにより、プログラマーは非常に便利になります。つまり、new RVDBuilder("Key1", 1, "Key2", "2", ...);
  • これは、安全ではありません。つまり、new RVDBuilder(Tuple.Create("Key1", 1), ...);

私はこの主題/トピックに関する意見を聞きたいと思っていました。

  • プログラマーに「ペア」クラスの使用を強制する必要がありますか? (これはカップリングにどのように影響しますか?)
  • エラーが発生した場合、簡単に修正/キャッチできますが、より安全にする必要がありますか?
  • 例外をスローすることはそれを処理するための最良の方法ですか、それとも単に切り捨てるべきですか?
  • プログラマーが状況を処理する方法を選択できるようにイベントを追加することは良い習慣ですか?

しかし、全体として、この状況を処理する方法をどのように特定して決定するのですか?全体的にはプロジェクトの設定に依存することは知っていますが、このテーマに関して設定されたムード/コンベンションは実際にはありません。一般的な経験則はありますか?

(これがこの質問に完全に適切なStackExchangeではない場合は申し訳ありません。コードが含まれますが、これは純粋にたとえば私の設計質問をよりよく説明するためのものであるため、ここに最適です)。

4
Shelby115

私は最近Javaでこれに取り組む必要がありました。私の解決策は、Pairクラスをインスタンス化するのにかなり苦痛がないようにすることでした:Pair.of(..., ...)。これは括弧の前に7文字しか追加されておらず、ファクトリメソッドにofという名前を付けることは、値ベースのクラスがJava 8で従う規則のようです。

しかし、私のユースケースでは、通常3〜4ペアしかなかったので、最大5ペアの引数にオーバーロードを提供したので、タプルを使用する必要はほとんどありません。書くのは無意味な定型文ですが、それは一度だけ行う必要があり、発信者はそれから何度も恩恵を受けます。

プログラマーに「ペア」クラスの使用を強制する必要がありますか? (これはカップリングにどのように影響しますか?)

「ペア」クラスは、かなり無害な依存関係です。小さく、明確に定義されたインターフェイスとセマンティクス、およびシンプルでわかりやすい実装があります。そのインターフェースが変更されることや、将来誰かがそれを壊すことはほとんどありません。また、他のクラスに依存する可能性はほとんどありません。

例外をスローすることはそれを処理するための最良の方法ですか、それとも単に切り捨てるべきですか?

実行not切り捨てます。これは明らかにプログラマー側のエラーであり、欠落している値が最後にあるとは想定できません。引数リストの中央で2つの文字列を誤って融合したことがあります。 "foo", "bar", "baz", "quux" なりました "foo", "bar baz", "quux"。例外を除いて中止する以外に何もすることはありません。

プログラマーが状況を処理する方法を選択できるようにイベントを追加することは良い習慣ですか?

プログラマーが意図的に不正な引数リストを渡す理由はないため、エラーが処理された場合、メソッド呼び出しではなく、高レベルの「すべてをキャッチ」エラーハンドラーで発生する可能性があります。呼び出し元は、必要に応じてすでに例外をキャッチできるため、イベントは役に立ちません。

4
Doval

「EffectiveC++」で、APIは常に正しく使用しやすく、誤って使用するのは難しいはずだと読みました。間違って使用される可能性があるとおっしゃっていたので、より安全な解決策のためにそれを捨てます。

4
Lawrence Aiello

あなたのクラスはRVDBuilderと呼ばれます。ビルダーパターンのポイントは、途方もなく複雑なコンストラクターを避け、代わりに通常のメソッド呼び出しを介して必要なすべての情報を徐々に収集できるようにすることです。したがって、最善の解決策は、情報のペアを追加するための流暢なインターフェイスを追加することです。

_class RVDBuilder {
  public RVDBuilder Add(string key, Object value) { … }
  public RVD Instantiate() { … }
}
_

次に:new RVDBuilder().Add("foo", 42).Add("bar", "baz").Instantiate()

2
amon