Вы, кажется, предполагаете, что сложность интерфейса измеряется количеством элементов, которые он имеет (методы, в данном случае). Многие утверждают, что необходимость помнить, что charge
метод может использоваться для возврата баланса, Client
добавляет гораздо больше сложности, чем наличие дополнительного элемента getBalance
метода. Делать вещи более явными гораздо проще, особенно до такой степени, что это не оставляет двусмысленности, независимо от большего количества элементов в интерфейсе.
Кроме того, вызов charge(0)
нарушает принцип наименьшего удивления , также известный как показатель WTFs в минуту (из «Чистого кода», изображение ниже), что затрудняет работу новых членов команды (или текущих, через некоторое время вдали от кода) до они понимают, что звонок фактически используется для получения баланса. Подумайте, как отреагируют другие читатели:
Кроме того, сигнатура charge
метода идет вразрез с рекомендациями делать одно и только одно и разделение команд и запросов , потому что это заставляет объект изменять свое состояние, а также возвращать новое значение.
В общем, я считаю, что самым простым интерфейсом в этом случае будет:
public class Client {
private float bal;
float getBalance() { return bal; }
void charge(float c) { bal -= c; }
}