Учитывая, что изменения в сигнатуре API / публичного метода должны быть минимальными, чтобы не допустить взлома тех клиентских кодов, которые используют эти методы, мне было интересно, не применим ли закон Деметры к ним.
Простой пример:
class Account() {
double balance;
public void debit(Transaction t) {
balance -= t.getAmount();
}
}
Обратите внимание, что метод дебетования передает объект транзакции, а не просто двойную сумму («Закон Деметры», как я понимаю, сказал бы просто передать необходимую информацию, в данном случае только сумму, а не объект транзакции ...) ). Причина этого заключается в том, что метод в будущем может потребовать некоторые другие свойства транзакции помимо суммы. Насколько я понимаю, это предотвратит нарушение сигнатуры метода, добавив новый параметр в будущем.
Делает ли это разумный выбор? Или я что-то упустил?
источник
Если вы планируете расширять
Account
класс в будущем, я бы сказал, что это ситуация, когда созданиеTransaction
объекта более общего назначения будет хорошим отклонением от норм Закона.Например:
Я думаю, что я немного отклонился от первоначального вопроса, но я хочу сказать, что, хотя вы можете быть обеспокоены тем, что отклоняетесь от закона Деметры, преимущества этого перевешивают негативы.
источник