Biorąc pod uwagę, że zmiany w sygnaturze API / metody publicznej powinny być minimalne, aby zapobiec łamaniu kodów klientów korzystających z tych metod, zastanawiałem się, czy prawo Demetera w mniejszym stopniu się do nich stosuje.
Prosty przykład:
class Account() {
double balance;
public void debit(Transaction t) {
balance -= t.getAmount();
}
}
Zauważ, że metoda debetowa przekazuje obiekt Transakcji zamiast podwójnej kwoty („Prawo Demetera”, jak rozumiem, powiedziałoby, aby przekazać wymagane informacje, w tym przypadku tylko kwotę, a nie obiekt Transakcji ... ). Powodem tego jest to, że metoda w przyszłości może wymagać innych właściwości Transakcji oprócz kwoty. Z tego, co rozumiem, zapobiegnie to złamaniu podpisu metody przez dodanie nowego parametru w przyszłości.
Czy to sprawia, że jest to rozsądny wybór? A może coś mi brakuje?
źródło
Jeśli planujesz poszerzyć
Account
klasę w przyszłości, powiedziałbym, że jest to sytuacja, w której uczynienieTransaction
obiektu bardziej ogólnym celem byłoby dobrym zgięciem przepisów Prawa.Na przykład:
Myślę, że trochę zbaczam z pierwotnego pytania, ale mam na myśli to, że chociaż możesz się martwić, że zbłądzisz z Prawa Demetera, zalety takiego postępowania przeważają nad negatywnymi.
źródło