2013-03-22 18 views
18

Czytałem grono blogposts przedstawiając zalety wzorca konstruktora danych testowych. Wydaje się, że to dobry pomysł, ale wszystkie posty mają lata.Jakie są zalety wzorca Konstruktora danych testowych nad Inicjatorami obiektów?

Po wprowadzeniu C# Object Initializes, spowodowało to, że wzorzec Konstruktora danych testowych stał się przestarzały?

Przed inicjatorów obiektu, to musiałaby poniższy kod, żeby zainicjować obiekt osoba:

Person p = new Person("John", "Doe", "555-555-1234"); 

W czasie, o budowniczego by oczyścić kod tak:

Person person = new PersonBuilder() 
     .WithFirstName("John") 
     .WithLastName("Doe") 
     .WithPhoneNumber("555-555-1234"); 

Teraz z inicjalizatorami obiektów może wyglądać tak bez pisania metod konstruktora:

Person p = new Person() {FirstName="John", LastName="Doe", Phone="555-555-1234"}; 

W tym prostym przykładzie wydaje się, że wzorzec budowniczego nie jest potrzebny. Czy czegoś brakuje? Czy ludzie nadal używają wzorca budowniczego? Jeśli tak, jakie są korzyści?

+2

Konstruktorzy są nadal dobrym rozwiązaniem, gdy mamy do czynienia np. Z niezmiennymi obiektami. –

+8

Dlaczego głosować, aby zamknąć to pytanie? To dobrze napisane i ciekawe IMO. – ken2k

+2

@RogerAlsing, jeśli rozwinąłeś w tym punkcie, byłaby to dobra odpowiedź. – AlexFoxGill

Odpowiedz

2

W wielu przypadkach można wymieniać konstruktory za pomocą inicjalizatorów obiektów.

Jednak istnieje kilka przypadków, w których konstruktorzy nadal są dobrym rozwiązaniem.

Jednym z przykładów są niezmienne obiekty. np. Implementacja protobuffów Jona Skeetsa jest dobrym przykładem wzorców budujących prawdziwy świat dla niezmiennych obiektów. (https://codeblog.jonskeet.uk/2008/08/20/lessons-learned-from-protocol-buffers-part-1-messages-builders-and-immutability/)

Person john = new Person.Builder() 
    .SetFirstName("John") 
    .SetLastName("Doe") 
    .Build(); //creates an immutable person 

Inne przypadki mogą mieć zastosowanie wartości ustawionych. np.

Rectangle rect = RectangleBuilder.MakeSquare(10).Build(); 
Car car = CarBuilder.MakeVolvo().PimpIt().SetColor(Color.Red).Build(); 

W tym przypadku można ustawić wiele właściwości naraz, dzięki czemu można rozpocząć od pewnego rodzaju prototypu i kontynuować.

1

Weźmy na przykład StringBuilder. nadal jest przydatny i wymagany do zbudowania nowego ciągu znaków o wysokiej wydajności (ponieważ optymalizacje w kompilatorze nie obejmą wszystkich scenariuszy). To samo dotyczy innych niezmiennych obiektów, tak jak już zostało wydane.

Ponadto, przy użyciu wzorca budowniczego, łatwiej jest zastąpić typ initalized, który daje luźne sprzężenie (dla wtrysku zależności). Nie zawsze może być wymagane do celów testowych, ale czasami może się przydać czasami.

+2

Aby rozwinąć w drugim punkcie, zawsze mądrze jest (dla celów luźnego sprzężenia i testów jednostkowych) delegować tworzenie obiektów do dedykowanych fabryk i budowniczych. W ten sposób, kiedy przystąpisz do pisania testów, możesz wstrzyknąć fabryki produkujące mocks/stubs. – AlexFoxGill

Powiązane problemy