JavaRush /Java блог /Random UA /Що таке програмування на інтерфейсах? Пограємо в архітект...

Що таке програмування на інтерфейсах? Пограємо в архітектора

Стаття з групи Random UA
Можливо, колись ти чув, є така штука як програмування на інтерфейсах. Час познайомитися з цим ближче. Тут буде мало тексту та багато коду (без логіки). Я не міг знайти, коли з'явабося перші інтерфейси. Напевно, це було дуже давно, і інтернет про це забув. Ну та гаразд. Ідея інтерфейсу проста: описати, що ми робитимемо без подробиць. Тобто. байдуже, як ви це зробите, важливо, що ви зробите. Проте після того, як я написав цю статтю, я знайшов хорошу, на схожу тему, тут у групах. Тисніть за посиланням і читай, чим більше, тим краще! Вміст:

Навіщо це потрібно?

Коли код складається з одного класу, це нафіг не потрібно. Але коли класи повинні взаємодіяти між собою, а їхня кількість — перевалювати за кілька десятків, тут можна задуматися про проектування. Спочатку продумати всю структуру проекту згори донизу (від максимальної абстракції до реалізації). Якщо над проектом працює кілька людей, то дуже зручно домовитись, описати інтерфейси взаємодії класів, потім розібрати ці інтерфейси та почати реалізовувати. Виходить хороша паралельність завдань, легко ділити, т.к. всі про все домовабося, а подробиці нікого не турбують.

Що це дає розробнику?

Розробнику не потрібна реалізація класу. Це означає, що після того, як всі домовабося, він бере потрібні йому інтерфейси і користується ними. Реалізацію буде підставлено, коли буде готова. Давай я покажу свій приклад і потім поговоримо далі. Я вирішив написати невеликий проект каси. Вона допомагатиме вибирати квитки, продавати їх, здавати гроші в банк і брати з банку, міняти гроші для тих, що понаїхали. Отже, мій архітектурний видих: PS не треба копіювати і створювати структуру, для ліги ліні я доклав архівник з кодом наприкінці статті;) Структура:
Що таке програмування на інтерфейсах?  Пограємо в архітектора - 1
Купа моделей:
package cashbox.model;

public enum Currency {
    USD,
    EUR,
    RUR
}
package cashbox.model;

public interface Direction {
    /**
     * @return город як цель направления, куда едем/летим/двигаемся
     */
    String getCity();
}
package cashbox.model;

/**
 * модель денег
 */
public interface Money {
    /**
     * @return тип валюты
     */
    Currency getCurrency();

    /**
     * @return сумма денег
     */
    long getAmount();
}
package cashbox.model;

public interface Ticket {
    /**
     * @return направление куда двигаемся
     */
    Direction getDirection();

    /**
     * @return цена билета
     */
    Money getPrice();

    /**
     * @return транспорт на котором передвигаемся
     */
    Transport getTransport();
}
package cashbox.model;

public interface Transport {
}
Пара exception:
package cashbox.exception;

public class NoSoMuchMoneyException extends RuntimeException {
}
package cashbox.exception;

import cashbox.model.Money;

public class NoSuchCurrencyException extends RuntimeException {
    private Money money;

    public NoSuchCurrencyException(Money money) {
        this.money = money;
    }

    public NoSuchCurrencyException(String message, Money money) {
        super(message);
        this.money = money;
    }

    public Money getMoney() {
        return money;
    }
}
Каса - найважливіша частина:
package cashbox;

import cashbox.exception.NoSoMuchMoneyException;
import cashbox.exception.NoSuchCurrencyException;
import cashbox.model.*;
import javafx.util.Pair;

import java.util.List;
import java.util.Map;

public interface CashBox {

    /**
     * @param direction направление билета
     * @return Стоимость проезда по видам транспорта
     */
    Map<Transport, Money> getPrice(Direction direction);

    /**
     * Продать билет
     * @param money деньги за билет
     * @return пару из билета и сдачи
     */
    Pair<Ticket, Money> sellTicket(Money money);

    /**
     * обмен валюты
     * @param moneyFrom валюта, которую передает клиент
     * @param currency валюта, которую клиент хочет получить, тут будет учитываться только тип валюты,
     *                 количество будет проигнорировано
     * @return Требуемая валюта
     * @throws NoSoMuchMoneyException если недостаточно денег в кассе для обмена
     * @throws NoSuchCurrencyException если нет такой валюты, отсутствующая валюта передается як атрибут
     */
    Money change(Money moneyFrom, Currency currency) throws NoSoMuchMoneyException, NoSuchCurrencyException;

    /**
     * Инкасация - отправить деньги в банк
     * @param money - сумма и валюта, можно передать несколько
     */
    void sendToBank(Money... money);

    /**
     * Запрос денег из банка
     * @param money - сумма и валюта необходимая кассе
     */
    void requestFromBank(Money... money);

    /**
     * Подбор билета.
     * В метод передается либо одно, либо другое, либо вместе.
     * Если оба атрибута null значит вызов некорректный
     * @param transport - желаемый транспорт
     * @param direction - желаемое направление
     * @return список подходящих билетов
     */
    List<Ticket> chooseBy(Transport transport, Direction direction);
}
Перше, що впадає у вічі не підготовленому розробнику, це javadoc. Хоча, мабуть, непідготовленому розробнику якраз вони звичні. Це деякі іноді ледащо, мій же код і так хороший, без доки ;) Мені навіть зараз на деякі речі не хочеться писати доку. Ну, навіщо писати транспорту, що це транспорт? Облишмо це на потім! Я постарався доками описати все, що треба. Тепер поясню, чому так писати код зручніше. Дивись, я зараз можу дати тобі інтерфейс CashBoxта попросити його реалізувати. Він не важкий? Плюс необхідну поведінку описано у документації. Тобі не треба буде чекати, поки хтось напише моделі чи ще щось. Ти береш моделі інтерфейсів і починаєш працювати на їхній основі. Тепер ти програмуєш на інтерфейсах, вітаю. А тепер головне. Я можу дати тобі завдання реалізувати CashBox, а також ще комусь, щоб у нас було 2 реалізації. Наприклад, приміська та міжнародна каса. Ви зможете писати код паралельно і будь-який член команди, який писатиме код на основі CashBox, може вже починати і спиратися на інтерфейс. Це дуже зручно. Багатозадачність, щоб її. Посилання на код на гугл диску -> тут
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ