Ви, здається, припускаєте, що складність інтерфейсу вимірюється кількістю елементів, які він має (методи, в даному випадку). Багато хто стверджує, що, якщо пам'ятати, що chargeметод може бути використаний для повернення балансу, Clientдодає набагато більшу складність, ніж наявність додаткового елемента getBalanceметоду. Зробити речі більш явними набагато простіше, особливо до того, що це не залишає двозначності, незалежно від більшої кількості елементів в інтерфейсі.
Крім того, виклик charge(0)порушує принцип найменшого здивування , відомий також як показник WTF за хвилину (з чистого коду, зображення нижче), що ускладнює новим членам команди (або поточним, через деякий час далеко від коду) до вони розуміють, що дзвінок насправді використовується для отримання балансу. Подумайте, як реагували б інші читачі:

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