2

少し前に、UI とバックエンドの間のすべてのデータ/ビジネス ロジックに WCF を使用している新しい仕事を始めました。

私が気付いたのは、これらの WCF サービス呼び出しの大部分にさまざまなパラメーターが含まれていることです。たとえば、GetFoo というサービス コールがあるとします。ここでは、次のように署名を使用できます。

public Foo GetFoo(int? ID, string Name, DateTime? fooDate)

よりオブジェクト指向のアプローチでは、代わりに以下を使用できます。

public Foo GetFoo(Foo foo)

Fooこの場合、コードは、UI から渡された特定のパラメーターのセットに依存するのではなく、POCO オブジェクトから必要なものを取得します。

一方では、これにより、UI と WCF サービス間の契約がより柔軟になります。契約を破棄したり参照を更新したりすることなく、サービス側で実装を変更できます。さらに、パラメータの明示的なリストを処理するのではなく、POCO に直接作用するビジネス オブジェクトを使用できます。

一方、必要なオブジェクト/データを取得するために何が必要かは明確ではありません。

どのアプローチがベスト プラクティスと見なされますか?

4

4 に答える 4

1

私はいつも単一のパラメーターを出し入れします。そのパラメーターは、期待しているデータのメッセージ(または少なくともメッセージ本文)を定義し、returnは、返送するメッセージ本文を定義します。

複数のパラメータを使用する場合、ネットワーク上でメッセージがどのように表示されるかをほとんど制御できません。

コントラクト操作が.NETメソッドであるという事実は、実装の詳細です。契約の目的は、消費者とサービスの間のメッセージの構造を定義することです。

于 2012-05-15T10:40:17.943 に答える
1

3番目のより冗長なアプローチをお勧めします。

public Foo GetFooByName(string Name)
public Foo GetFooByIDAndName(int ID, string Name)
public Foo GetFooByNameAndDate(string Name, DateTime fooDate)
public Foo GetFooByIDNameAndDat(int ID, string Name, DateTime fooDate)

などなど。DRY するために、共通コードを抽出していくつかのprivateメソッドを作成する場合があります。これは自己記述的なコードにつながり、エラーをより正確に特定できます (言うまでもなく、他のメソッドに影響を与えずに 1 つのメソッドを変更できます。これは常に良いことです)。

于 2012-05-15T10:44:26.213 に答える
0

OOP は、私たちのほとんどが目指しているものです。Foo オブジェクトに新しい属性が必要になり、Foo オブジェクトにはサブメソッドなどを持つ 15 ~ 20 個のメソッドがあることに気付いたら、これはただの臭いコードであり、正しいことを行うための時間を節約できます。 (おっと :) )。

パラメータが多すぎますか? より詳しい情報

Martin Fowlers のリファクタリングに関する本を参照することをお勧めします。彼はほとんどのプログラマーが考えていることを述べていますが、何らかの理由で私たちはそうしていません。

于 2012-05-15T10:31:24.367 に答える
0

両方を使用できますが、その意味は明らかです。あなたが今持っている両方の方法は、それらが何をするかについて明確ではありません。最初の1つ:

次を渡すとどうなりますか:

ID = 1
Name = "Name"
fooDate = NULL

次に、id = 1 および name = "Name" のアイテムを要求するか、id = 1 および name = "Name" および fooDate = null を要求するか、id = 1 または name = "Name" ro fooDate = を要求するかヌル。

この場合、少なくとも Id は別の関数である必要があります。

2 番目のサンプルでは、​​get by example と呼ぶ関数を作成しています。ただし、特定の NULL 値を要求することはできません。それに加えて、オブジェクトを渡すため、オブジェクト指向のアプローチとは呼びません。OO は、オブジェクトが互いにどのように相互作用するかに関するものです。

アプローチを選択する際には、関数の機能をより明確にします。オブジェクトを渡して動的クエリを作成できる関数が必要な場合。関数 GetFooByFooExample を呼び出します。ただし、ID のみを入力する場合は、GetFooById などの関数を検討してください。これにより、コードがはるかに読みやすくなり、自明になります。

于 2012-05-15T10:28:05.413 に答える