Сделайте интерфейсы простыми в использовании, правильными и трудными для неправильного использования - пример - PullRequest
1 голос
/ 25 апреля 2019

Я читал лучшие практики для разработчиков и обнаружил одно предложение:

Сделать интерфейсы простыми в использовании, правильными и трудными в использовании неправильно

Может кто-нибудь описать с минимальнымиПример кода, чтобы понять принцип.Я попытался выполнить поиск в Интернете, но не нашел ни одного примера.

class Account{
    void process(){}
}

interface IBankAccountService {

    boolean check(Account acc);
    void process(Account acc);
}

class ScbAccountService implements IBankAccountService {

    @Override
    public boolean check(Account acc) {
        return true; // check account consistency
    }

    @Override
    public void process(Account acc) {
        acc.process(); // proceed operation
    }
}

Этот пример нарушает принцип?Я так, как я могу применить этот принцип в этом примере.

1 Ответ

2 голосов
/ 25 апреля 2019

Простой ответ: вы не можете сделать это легко.Вы должны сделать так, чтобы различные типы в системе зависели так или иначе.В моем первом примере я использую исключение в сигнатуре perform methdod, чтобы указать, что может произойти что-то ужасное, если будет вызван perform.Это необходимо реализовать.

interface Account {

    double getBalance();

    /**
     * Indicates if an order can be performed by the account.
     *
     * @retrun {@code true} if the balance is bigger than the order's amount, {@code false} else.
     */
    boolean canPerform(Order order);

    /**
     * @param order The order to apply.
     * @throws Exception when the amount of the order is higher than the value returned by #getBalance.
     */
    boolean perform(Order order) throws Exception;
}

interface Order { double getAmount(); }

interface Transaction { boolean transact(Account account, Order order) }

Другой способ моделирования зависимостей, избегая исключения и (мы надеемся) создавать новые Transaction экземпляры, когда perform вызывается:

interface Account {

    double getBalance();

    /**
     * @param order The order to apply.
     * @throws Exception when the amount of the order is higher than the value returned by #getBalance.
     */
    Transaction perform(Order order);
}

interface Order { double getAmount(); }

interface Transaction { TransactionState getState(); }

enum TransactionState { SUCCESS, ERROR }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...