2015-04-21 40 views
6

UWAGA: Wszystkie konstruktory służą wyłącznie do testowania jednostek.Który z nich jest bardziej skuteczny podczas budowania budowniczych?

Tak więc tworzyłem konstruktorów i tak jak je tworzyłem, zacząłem zauważać, że niektórzy z pozostałych budowniczych, już na miejscu, podążają nieco inną drogą.

Myślałem, że pytam, który z nich jest skuteczniejszy.

Mój sposób to zrobić to:

public class Builder 
{ 
    public Builders() 
    { 
     SetDefaults(); 
    } 

    private void SetDefaults() 
    { 
     // Setting my defaults 
    } 
} 

Innym sposobem, który jest na miejscu:

public class Builder 
{  
    public Builder WithDefaults() 
    { 
     // Setting my defaults 
    } 
} 

Moim zdaniem pierwsza jest bardziej skuteczne, ponieważ po prostu stworzyć swój budowniczy i automatycznie ustawia to ustawienie domyślne.

W drugim przypadku musisz wyraźnie wywołać metodę WithDefaults, aby ustawić wszystkie wartości domyślne, zanim przystąpisz do jej budowania.

Drugi wydaje się bardziej podatny na błędy, ponieważ niektóre obiekty, które trzeba zbudować, mogą generować wyjątki null, jeśli nie mają skonfigurowanych wszystkich pól.

Może brakuje mi czegoś subtelnego, więc zdecydowałem się zapytać o to, który z nich jest skuteczniejszy.

Dziękuję.

+5

Jeśli musisz zadzwonić "WithDefaults", to nie są to wartości domyślne, prawda? –

+0

@JonSkeet to świetny punkt, dziękuję! – AvetisG

+0

Dobrze, gdybym naprawdę chciał znaleźć profesjonalistę dla drugiej metody, to byłby ten: WithDefault nadal może być użyty do przywrócenia domyślnych atrybutów budowniczych .... – Sidewinder94

Odpowiedz

0

Chciałbym zasugerować trzecią opcję. Ponieważ konstruktor ma zmniejszyć ilość kodu testowego przez usunięcie obiektu inicjalizacji w jasny i znaczący sposób - dlaczego deklarować, że używasz wartości domyślnych? Własne nic nie mówi o tym, jakie są rzeczywiste wartości domyślne i istnieje ryzyko, że autor testu zapomni zadzwonić do "WithDefaults".

Spójrz na this post for example on how it's done

Zamiast użyć konstruktora, aby ustawić wartości domyślne (pól) i przechowując je jedynie zmienić je, jeśli wyraźnie poproszony. W ten sposób otrzymasz zainicjowany obiekt z minimalnymi i znaczącymi wywołaniami budowniczymi.