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