To jest tak pewne jak to, że po dniu nadchodzi noc a po pijackiej nocy nadchodzi kac - prędzej czy później w większości projektów pojawiają się klasy o znajomo brzmiącej nazwie cosTamUtils. Na osobny artykuł zasługuje wytłumaczenie dlaczego klasy "Utils" psują model obiektowy i dlaczego jest to bardzo niedobry i bardzo bardzo zły antywzorzec.
Jeśli ktoś chce zbadać ten temat to niech się zastanowi lub poszuka na necie informacji o tym czy lepiej stworzyć klasę Money czy też MoneyUtils ( ewentualnie kliknie tutaj : Utils antipattern )
Dla tych którzy wierzą, ze trzeba się pozbyć utilsowego brzemiona (tak to się chyba odmienia) poniższy tekst.
Geneza
Zaczyna się niewinnie od klasy :
class User{
private String phoneNumber;
}
Mija tydzień, ceny paliwa idą w górę a w międzyczasie pojawia się nowe wymaganie aby określić numer kierunkowy.
class User{
private String phoneNumber;
public Object doSomething(){
...
String directional=resolveDirectional();
...
}
private String resolveDirectional(){
doSomethingWith(phoneNumber)
}
}
Mija kilka miesięcy nadchodzi wiosna, w drogach zaczynają pojawiać się dziury a tymczasem w naszej aplikacji pojawia się pojęcie Biura.
class Office{
private String phoneNumber;
public Object doSomething(){
...
String directional=resolveDirectional();
...
}
private String resolveDirectional(){
doSomethingWith(phoneNumber)
}
}
I w tym momencie doświadczony programista wzdryga się od obrzydzenia - nastąpiło powtórzenie w kodzie! Trzeba by to gdzieś wynieść ale gdzie? Ani to nie pasuje dla klasy User ani do klasy Office. To może by to gdzieś zawiesić w przestrzeni aby każdy mógł sobie korzystać - taka samotna procedurka pośród obiektów.
[IRONIA]
Niestety okazuje się, że twórcy Javy byli debilami i wymyślili sobie, że każdy koncept musi być wyrażony za pomocą jakiejś klasy. Na całe szczęście jest to słówko static...
[/IRONIA]
Chwytamy się brzytwy i głośne fanfary obwieszczają narodziny klasy PhoneUtils :
class abstract PhoneUtils{
public static String resolveDirectional(phoneNumber){
doSomethingWith(phoneNumber)
}
}
Rozwiązanie
Jeden Kod jest wart więcej niz 1000 słów...
class User{
private PhoneNumber phoneNumber;
public Object doSomething(){
...
DirectionalNumber directionalToUsersPlace=phoneNumber.directional()
...
}
}
W zależności od problemu Można nawet pójść dalej i stworzyć lepszą enkapsulację:
class User{
private PhoneNumber phoneNumber;
public Object doSomething(){
...
City cityToContact=phoneNumber.toCity()
...
}
}
Obsesja zajętości pamięci
Wczoraj na coderetreat miało miejsce ciekawe zachowanie. Pomimo, że cel ćwiczenia był jasno sprecyzowany (chyba - mam nadzieję, że te wszystkie tłumaczenia i metafory coś dały :) ) - "uczymy się pisać doskonały kod" to jednak kilka grup jasno uzasadniło swój projekt słowami - "to zajmie mniej pamięci". Jeszcze raz głośno i wyraźnie :) Do momentu kiedy ograniczenia sprzętowe staną się problemem - nie są one problemem (i nie, nie będzie ku*wa wtedy za późno aby się o to martwić)
Dodatkowe materiały
- http://c2.com/cgi/wiki?PrimitiveObsession
- http://c2.com/cgi/wiki?ValueObject
- do pogoglwania : object calisthenics
Brak komentarzy:
Prześlij komentarz