Przeprowadzamy wiele testów jednostkowych i refaktoryzacji naszych obiektów biznesowych i wydaje mi się, że mam bardzo odmienne opinie na temat projektowania klas niż inni koledzy.
Przykładowa klasa, której nie jestem fanem:
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; } }
}
W „prawdziwej” klasie nie wszystkie są ciągami, ale w niektórych przypadkach mamy 30 pól bazowych dla całkowicie publicznych właściwości.
Ja nienawidzę tej klasy, a ja nie wiem, czy jestem po prostu wybredna. Kilka ważnych rzeczy:
- Prywatne pola zaplecza bez logiki we właściwościach wydają się niepotrzebne i nadmuchują klasę
- Wiele konstruktorów (nieco w porządku), ale w połączeniu z
- wszystkie nieruchomości mają publiczną konfigurację, nie jestem fanem.
- Potencjalnie żadna właściwość nie miałaby przypisanej wartości z powodu pustego konstruktora, jeśli osoba dzwoniąca jest nieświadoma, możesz potencjalnie uzyskać bardzo niechciane i trudne do przetestowania zachowanie.
- To zbyt wiele właściwości! (w przypadku 30)
Znacznie trudniej jest mi naprawdę wiedzieć, w jakim stanie Foo
jest dany obiekt, jako implementator. Argument został postawiony: „możemy nie mieć niezbędnych informacji do ustawienia Prop5
w czasie budowy obiektu. Ok, chyba rozumiem to, ale jeśli tak jest, ustaw Prop5
publicznie tylko setter, nie zawsze do 30 właściwości w klasie.
Czy jestem po prostu wybredny i / lub szalony, że chcę klasy, która jest „łatwa w użyciu”, a nie „łatwa do napisania (wszystko publiczne)”? Klasy takie jak powyższe krzyczą do mnie, nie wiem, jak to będzie wykorzystane, więc na wszelki wypadek zamierzam upublicznić wszystko .
Jeśli nie jestem strasznie wybredny, jakie są dobre argumenty do walki z tego rodzaju myśleniem? Nie jestem zbyt dobry w artykułowaniu argumentów, ponieważ jestem bardzo sfrustrowany, próbując przekazać swój punkt widzenia (oczywiście nie umyślnie).
get
lub set
:-)