1

Transaction非常に負荷の高いクラスがあります。非常にロードされているため、元々はほぼ20個の引数をに渡すことになりましたctor。いくつかの値オブジェクトを抽出した後も、まだ12個の引数が残っていますが、それでも多すぎると思います。

これを回避するにはどうすればよいですか?引数はすべて必須なので、コンストラクターに渡されるのは合理的だと思います。それを明示的にしたいと思います。ctorまた、プロパティを追加した場合、それ自体のテストに依存する代わりに、プロパティをに追加して、コンパイラにプロパティが壊れた場所を見つけさせる方法も気に入っています。私は、オブジェクト初期化子、またはビルダーが問題をうまくやっていないと思います。次の数日で、どの議論が一緒に属しているかがより明らかになるかもしれませんが、それでも構成することができます。

public class MyEntity() 
{
    public MyEntity(ValueType prop2, ValueType prop3, ...) 
    {
        Id = Guid.NewGuid();
        Prop2 = prop2;
        Prop3 = prop3;
        ...
    }

    public Guid Id { get; private set; }

    public ValueType Prop2 { get; private set; }

    public ValueType Prop3 { get; private set; }

    public ...
}
4

4 に答える 4

2

すべてのパラメーターが必要であることを確認しますか?「必須」という言葉は欺瞞的です。たとえば、コンパイラは文字列引数を指定するように強制する場合がありますが、nullまたは空でない値を指定するように強制することはできません。

有効なデータを強制的に提供する唯一の方法は、使用時にデータを検証することです。I / Oオブジェクトのように、初期化されたときにのみ意味を持つものをラップするクラスなど、コンストラクターに含める必要がある場合があります。ただし、通常は、呼び出し元のコードが古い方法でプロパティを設定し、それらを必要とするメソッド呼び出しでそれらの値を検証できるようにするだけで十分です。

私は少しとりとめのないです。私のポイントは、初期化データをクラスに提供する唯一の方法として、コンストラクターパラメーターにとらわれないことです。これらは、単純なプロパティ以外に追加のコンパイラ保護をほとんど提供しません。

于 2013-01-15T20:09:45.110 に答える
1

パラメータを構造体にカプセル化し、構造体を渡すのはどうですか?

public struct ParamsStruct
{
    Type1 param1;
    Type2 param2;
    ...
}

public void Method(ParamsStruct p)
{
    ...
}

public void Main(String[] args)
{
    ParamsStruct p;
    p.param1 = ...
    p.param2 = ...
    Method(p);
}
于 2013-01-15T20:12:50.440 に答える
1

ユーザー インターフェイスまたはシステム インターフェイスで完全なトランザクションの詳細を出力する場合、すべてのパーツが必要になります。これは、分割を見つけるのに役立つ可能性は低いです。

しかし、内部処理を見てください。トランザクションでフィールドのサブセットのみを使用する状況はありますか? トランザクションを渡すが、4 つのフィールドしか使用しない場所はありますか? 文字通り常にすべてのフィールドを使用する場合は、それらを 1 つのオブジェクトに保持します。

銀行取引の場合、次のような分割を検討します。

  • お金はどこから来たのか
  • お金はどこへ行った
  • お金がどのように移動されたか - どの支払い手段または機能が使用されたか
  • お金が移動した理由 - 参照番号など
  • 金額と通貨
  • 日にち
  • 取引状況

(明らかに、これは正確なドメインによって異なります)。

于 2013-01-16T00:49:43.313 に答える
0
public class MyEntity() 
{
    public ValueType Prop1 { get; set; }

    public ValueType Prop2 { get; set; }

    // And so on...

    public MyEntity() 
    {
        Id = Guid.NewGuid();
    }
}

それで:

MyEntity entity = new MyEntity();
entity.Prop1 = prop1;
entity.Prop2 = prop2;
// And so on...

最終的には、2つの異なる設計アプローチを検討できます。

于 2013-01-15T20:35:38.517 に答える