Ciągły refaktoring nawet przy dokumentacji
Coś się dzisiaj rozpisałem. W każdym bądź razie dzieje się dużo więc warto notować.
Generalnie piszę obecnie dokumentację dla jednego z projektów. Zwyczajne javadoc’i, swoją drogą wie ktoś jak dodać sekcję „Direct Know Subclasses” do javadoc’a, takie w których klient ma znaleźć opis co, kto i jak robi. Jednak i tu dorwała mnie refaktoryzacja kodu.
Problem:
Mamy sobie interfejs:
Listing 1. Omawiany interfejs – definicja
/**
* Interfejs reprezentujący obiekty odbiorców dla modelu.
*
* @author Koziołek
*
*/
public interface ModelRecipient {
/**
* Metoda pozwala na przekazanie modelu.
* @param model model danych
*/
public void setModel(Model model);
/**
* Metoda powinna być wywołana wtedy gdy chcemy, żeby odbiorca zaktualizował swój stan
*/
public void update();
}
Przeczytajcie dokładnie dokumentację. Prawidłowe użycie tego interfejsu powinno wyglądać mniej więcej tak:
Listing 2. Omawiany interfejs – użycie
modelRecipient.setModel(model);
modelRecipient.update();
Nie ma w tym nic złego, ale dziwnym wydaje się wymuszanie na kliencie wywołania metody update()
jeżeli wywołał już setModel()
. Rzecz w tym, że jako klient nie będę miał interesu w tym by tak naprawdę podwójnie informować odbiorcę, że zaszło jakieś zdarzenie. Pierwszy raz ustawiając model, a drugi wymuszając aktualizację stanu. Można zatem spokojnie wywalić metodę update()
:
Listing 3. Omawiany interfejs – po porawkach
/**
* Interfejs reprezentujący obiekty odbiorców dla modelu.
*
* @author Koziołek
*
*/
public interface ModelRecipient {
/**
* Metoda pozwala na przekazanie modelu.
* @param model model danych
*/
public void setModel(Model model);
}
Co jednak w sytuacji gdy chcemy jawnie wywoływać aktualizację? Można zawsze rozszerzyć interfejs o odpowiednią metodę.
Listing 4. Omawiany interfejs – rozszerzony pod interfejs
/**
* Interfejs reprezentujący obiekty odbiorców dla modelu z jawną aktualizacją.
*
* @author Koziołek
*
*/
public interface ModelRecipientLazyUpdate extends ModelRecipient {
/**
* Metoda powinna być wywołana wtedy gdy chcemy, żeby odbiorca zaktualizował swój stan
*/
public void update();
}
I to wszytko pisząc dokumentację…