Вы, кажется, предполагаете, что сложность интерфейса измеряется количеством элементов, которые он имеет (методы, в данном случае). Многие утверждают, что необходимость помнить, что chargeметод может использоваться для возврата баланса, Clientдобавляет гораздо больше сложности, чем наличие дополнительного элемента getBalanceметода. Делать вещи более явными гораздо проще, особенно до такой степени, что это не оставляет двусмысленности, независимо от большего количества элементов в интерфейсе.
Кроме того, вызов charge(0)нарушает принцип наименьшего удивления , также известный как показатель WTFs в минуту (из «Чистого кода», изображение ниже), что затрудняет работу новых членов команды (или текущих, через некоторое время вдали от кода) до они понимают, что звонок фактически используется для получения баланса. Подумайте, как отреагируют другие читатели:

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