::. napisał(a)
Pierwszy z brzegu: http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/
Nie mowie ze to jest religia i nalezy tego zawsze przestrzegac, po prostu dalem komentarz.
Co do Scali to nie jest tutaj mowa o Scali ;d Ale masz racje.
Przebrnąłem przez to. Wygląda to jak jedna wielka reklama Guice :P Sam jestem fanem DI, jest to świetna sprawa, powinno to być wbudowane w język, a nawet i maszynę wirtualną, a wszelkie statyczne pola powinny być wywalone.
Jednak nie do końca się z tym artykułem zgadzam. W komentach podali mu trochę argumentów, np klasa Triangle(int, int, int) powinna w konstruktorze sprawdzać spójność.
Tu: http://misko.hevery.com/2009/02/09/to-assert-or-not-to-assert/ koleś zachęca do tworzenia osobnego API i do używania nulli. Ja jestem bardzo przeciwko nullom. Poza tym do testowania można tanio robić mocki.
W przykładzie lipkersona do którego tyczyły się nasze komentarze to metoda przypiszDane(String) była po prostu zakamuflowaną metodą inicjalizuj(), którą Misko też odradza. Tak, że aby zadowolic Hevery'ego kodem Javowym tutaj to pasowałoby zrobić chyba fabrykę. Ale wg mnie to trochę na wyrost, bo tutaj nie korzysta się ani z zewnętrznego, ani z globalnego stanu, a sama logika nie jest ciężka. W tym przypadku przesunięcie kodu z przypiszDane do konstruktora nie tylko polepszy jakość kodu (obiekt będzie zawsze spójny), ale i w ogóle nie utrudni testowania.
Edit:
Zapomniałem o czymś. Jednak wg Misko, pisanie takiej logiki jak ta z przypiszDane w konstruktorze jest akceptowalne:
Note: Constructing value objects may be acceptable in many cases (examples: LinkedList; HashMap, User, EmailAddress, CreditCard). Value objects key attributes are:
- Trivial to construct
- are state focused (lots of getters/setters low on behavior)
- do not refer to any service object.