私たちは多くのユニットテストとビジネスオブジェクトのリファクタリングを行っており、クラスの設計について他のピアとは非常に異なる意見を持っているようです。
私がファンではないクラスの例:
public class Foo
{
private string field1;
private string field2;
private string field3;
private string field4;
private string field5;
public Foo() { }
public Foo(string in1, string in2)
{
field1 = in1;
field2 = in2;
}
public Foo(string in1, string in2, string in3, string in4)
{
field1 = in1;
field2 = in2;
field3 = in3;
}
public Prop1
{ get { return field1; } }
{ set { field1 = value; } }
public Prop2
{ get { return field2; } }
{ set { field2 = value; } }
public Prop3
{ get { return field3; } }
{ set { field3 = value; } }
public Prop4
{ get { return field4; } }
{ set { field4 = value; } }
public Prop5
{ get { return field5; } }
{ set { field5 = value; } }
}
「実際の」クラスでは、それらはすべて文字列ではありませんが、完全にパブリックなプロパティ用の30のバッキングフィールドがある場合があります。
私はこのクラスが嫌いで、私がうるさいだけなのかどうかわかりません。いくつかの注意点:
- プロパティにロジックがないプライベートバッキングフィールドは不要と思われ、クラスを膨らませます
- 複数のコンストラクター(やや良い)と組み合わせて
- すべてのプロパティにパブリックセッターがあり、私はファンではありません。
- 空のコンストラクターが原因で、プロパティに値が割り当てられない可能性があります。呼び出し元が知らない場合、非常に望ましくない動作のテストが困難になる可能性があります。
- プロパティが多すぎます!(30件の場合)
実装者として、オブジェクトがいつどのような状態にあるのかを実際に知ることFoo
は、はるかに困難です。「Prop5
オブジェクトの構築時に設定するために必要な情報がない可能性があります。それは理解できると思いますが、その場合、Prop5
セッターのみを公開します。クラスのプロパティは常に30までではありません。
「書くのが簡単(すべて公開)」ではなく、「使いやすい」クラスを欲しがっているので、私はただひたすらとか狂っているとか?上記のようなクラスは私に悲鳴を上げ、これがどのように使用されるのかわからないので、念のためにすべてを公開します。
私がひどくうるさくないなら、この種の考え方と闘うための良い議論は何ですか?私は自分の要点を伝えようとすることに非常にイライラしているので(当然のことではありませんが)、私は引数を明確に表現することはあまり得意ではありません。
get
またはset
:-)の代わりにシームレスに追加できるということです