呼び出すインターフェイスとして API をIFoo
定義しており、メソッドを定義したいBar()
このメソッドBar()
は、1 つの必須引数と、任意の数の他の引数を取ります。これらの他の引数の解釈は、実装者次第です。IFoo
このシナリオでは、例を使用params
または使用してインターフェースを定義する方が適切ですか?Dictionary<String, Object>
public interface IFoo
{
bool Bar(String id, params Object[] params);
}
または
public interface IFoo
{
bool Bar(String id, Dictionary<String, Object> params);
}
前者はユーザーにとって呼び出しが簡単なようですが、前者では実装が適切に解釈するために特定の順序でパラメーターを指定する必要があるため、後者はその意図がより明確です。後者では本質的に名前付きパラメーターを実行します。
だから質問:
- どのフォームを使用する必要がありますか (そしてその理由は?) - これらのうちの 1 つは他のものよりもベスト プラクティスと見なされますか?
- 私が知っておくべき特定のスタイルと他のスタイルの利点はありますか? これらの 1 つは、コードの臭いと見なされますか?
- 別の/より良い方法で同じことを達成する代替パターンはありますか?
記録のために、.Net 4.0 の名前付きパラメーターを認識していますが、このコードは .Net 3.5 でコンパイル可能である必要があるため、.Net 4.0 以降の機能は使用できません。
編集
IFoo
誰かが尋ねたので、 my メソッドとBar()
メソッドが実際に何を表しているかについての詳細を追加するだけです。
IFoo
一部のストレージ サブシステムを表し、Bar()
実際には作成操作です。ストレージ サブシステムによってはBar()
、ID 以外のパラメーターが必要ない場合と、多くのパラメーターが必要な場合があります。
編集 2
したがって、@ Kirk Wollのコメントと@ Fernandoの回答に応じて、詳細情報を以下に示します.
IFoo.Bar()
このインターフェイスはオープン ソース フレームワークの一部です。サード パーティの開発者が実装IFoo
し、エンド ユーザーがその特定のインスタンスを呼び出すことにIFoo
なります。その目的は、ユーザーがストレージ サブシステム間でアプリケーションを簡単に移行できるようにすることです。人間的に可能。
最も単純なケースでは、基礎となるストレージ サブシステムにはストアの形式が 1 つしかないため、ID 以外のパラメーターは必要ありません。複雑なケースでは、ストレージ サブシステムが複数のタイプのストアを許可する場合があり、ストアの各タイプが任意の複雑な構成パラメーターのセット (インデックス サイズ、永続性、トランザクション動作、インデックス作成戦略、セキュリティ、ACL の考慮事項など) を許可する場合があります。
私は@Fernandoに同意しますが、おそらくもっとポリモーフィックなものが理にかなっているかもしれません。おそらくポリモーフィズムとジェネリックと型の制限を組み合わせたものが最適かもしれません。
public interface IFoo
{
bool Bar<T>(T parameters) where T : IBarConfig;
}
public interface IBarConfig
{
String ID { get; set; }
}
次に、次のような実装を使用します。
public class MyFoo
{
bool Bar<T>(T config) where T : MyBarConfig
{
//Implementation
}
}
public class MyBarConfig : IBarConfig
{
public String ID { get; set; }
public long IndexSegmentSize { get; set; }
//Etc...
}
これは私の頭の中から外れているので、実装するインターフェイスとは異なる型制限で定義Bar()
することが実際に合法であるかどうかはわかりませんか?MyFoo