2010-07-27 10 views
6

Mam dwie klasy, A i B. B wie o A, a A nie wie o B. Właściwości B mogą być ładnie ustawione z A, chociaż nie ma dziedziczenia dzielonego między A i B. Nie będzie wiele razy, kiedy muszę przypisać właściwości B z A, ale szukam wskazówek, gdzie powinienem umieścić ten kod.Konwencje w kodzie przypisania?

public class A 
{ 

} 

public class B 
{ 
    //constructor? 
    public B(A a) 
    { 
     //set b's properties from a 
    } 

    //factory method? 
    public static B FromA(A a) 
    { 
     B b = new B(); 
     //set b's properties from a 
     return b; 
    } 

    //setter method? 
    public static void SetBFromA(B b, A a) 
    { 
     //set b's properties from a 
    } 

    //assignment method? 
    public void AssignFrom(A a) 
    { 
     //set b's properties from a 
    } 
} 

//static helper class? 
public static class BHelper 
{ 
    public static B GetBFromA(A a) 
    { 
     B b = new B(); 
     //set b's properties from a 
     return b; 
    } 

    public static void SetBFromA(B b, A a) 
    { 
     //set b's properties from a 
    } 
} 

Które z nich, jeśli takie są, są powszechną praktyką? Czy któryś z nich ma konsekwencje wynikające z podpisu? Na przykład, czy użycie konstruktora zazwyczaj oznacza, że ​​B zawiera odniesienie do A? Są to rozważania, o których myślę.

Dzięki!

Odpowiedz

2

Wszystkie wymienione opcje są prawidłowe. Wybór zależy od konkretnych okoliczności.

//constructor? 
public B(A a) 
{ 
    //set b's properties from a 
} 

Wzór konstruktor byłby wybór, gdy B nie może istnieć bez danych z A.

//factory method? 
public static B FromA(A a) 
{ 
    B b = new B(); 
    //set b's properties from a 
    return b; 
} 

Sposób fabryka będzie wzór z wyboru, gdy wartości B wystąpią zależą od wartości w A lub B. Zwłaszcza, jeśli B ma potomków, których wartość w A dałaby wybór konstrukcji.

//setter method? 
public static void SetBFromA(B b, A a) 
{ 
    //set b's properties from a 
} 

setter nie byłyby stosowane w scenariuszu, jak miałoby to być stosowany, gdy A i B nie znam siebie i osoba trzecia musi wstawiać.

//assignment method? 
public void AssignFrom(A a) 
{ 
    //set b's properties from a 
} 

Jest to w zasadzie wzór gościa. Wizyty B i zostawiają coś z siebie (myśli o kawalerskich dniach). Byłby to wzór wyboru, jeśli dane z A są opcjonalne dla B.

+0

Doskonała odpowiedź. Podoba mi się komentarz do każdej z sugestii, które wymyśliłem, a także świetne zasady dotyczące każdego z nich. Dokładnie to miałem nadzieję osiągnąć. Dzięki! – bwerks

+0

* rumieniec * - dziękuję. –

3

Chciałbym użyć metody konstruktora lub jawnej konwersji.

public static explicit operator B(A typ) 
{ 

} 

Ogólnie uważam, że jest to bardzo subiektywne. Wszyscy moglibyśmy udzielić odpowiedzi za pomocą różnych metod i zobaczyć, który z nich jest najbardziej głosowany, ale tak naprawdę każdy ma inne zalety i braki. To zależy bardziej od kontekstu i tego, w jaki sposób ten schemat jest wykonywany w pozostałej części kodu.

+0

Jawna konwersja jest dokładnie tym, o czym myślałem .. –

+0

Czy ta metoda byłaby w 'A' lub' B'? –

+0

@Steven Sudit B –

0

Nie sądzę, że istnieje powszechna praktyka jako taka. Kiedy to zrobiłem, użyłem metody fabryki lub konstruktora. Prawdopodobnie faworyzowałbym fabrykę.

+0

Faworyzuję fabrykę nad konstruktorem przede wszystkim dlatego, że staram się unikać wyglądu obsady. –

3

będę rzucać się alternatywę:

public static B CreateFromA(A a) { } 

ta wykorzystuje składnię fabryki, aby sugerować, że można korby na zewnątrz B punktację A, ale unikając wszystkiego, co wygląda jak nawrócenia.

+0

Zasugerował już metodę fabryczną w pytaniu. Ale +1 za posiadanie "Utwórz" w nazwie. –

+0

@ Mark: Miało to być alternatywą dla rekomendacji Jurija. Rozumiem, że jest to całkowicie nieoryginalne. Oprócz bunkrów, Grant pobił mnie do tego. –

+0

Tak, ale napisałeś to lepiej, niż zrobiłem! Nadal nie daje ci powtórzyć .. –