JavaRush /Blog Java /Random-PL /Co to jest programowanie interfejsu? Pobawimy się w archi...

Co to jest programowanie interfejsu? Pobawimy się w architekta

Opublikowano w grupie Random-PL
Być może kiedyś słyszałeś, że istnieje coś takiego jak „programowanie interfejsu”. Czas poznać to lepiej. Będzie mało tekstu i dużo kodu (bez logiki). Nie udało mi się znaleźć, kiedy pojawiły się pierwsze interfejsy. To było chyba bardzo dawno temu i internet o tym zapomniał. W każdym razie. Idea interfejsu jest prosta: opisz co będziemy robić bez wchodzenia w szczegóły. Te. nie ma znaczenia jak to robisz, ważne co robisz. Ale po napisaniu tego artykułu znalazłem dobry artykuł na podobny temat tutaj w grupach. Kliknij w link i czytaj, im więcej, tym lepiej! Treść:

Dlaczego jest to konieczne?

Gdy kod składa się z jednej klasy, nie jest to tak naprawdę konieczne. Kiedy jednak klasy muszą ze sobą współdziałać, a ich liczba przekracza kilkadziesiąt, wówczas czas pomyśleć o projektowaniu. Najpierw przemyśl całą strukturę projektu od góry do dołu (od maksymalnej abstrakcji po realizację). Jeśli nad projektem pracuje kilka osób, bardzo wygodnie jest uzgodnić, opisać interfejsy interakcji klas, a następnie zdemontować te interfejsy i rozpocząć ich wdrażanie. Rezultatem jest dobra równoległość zadań, łatwo je podzielić, ponieważ wszyscy co do wszystkiego się zgodzili, ale nikt nie przejmuje się szczegółami.

Co to daje deweloperowi?

Deweloper nie potrzebuje implementacji klasy. Oznacza to, że gdy wszyscy się zgodzą, wybiera potrzebne mu interfejsy i z nich korzysta. Implementacja zostanie wymieniona, gdy będzie gotowa. Pokażę ci mój przykład, a potem porozmawiamy dalej. Postanowiłem napisać projekt małej kasy fiskalnej. Pomoże w wyborze biletów, sprzeda je, będzie przekazywać i odbierać pieniądze z banku, rozmieniać pieniądze dla licznie przybyłych. A więc mój architektoniczny wydech: PS nie ma potrzeby kopiować i tworzyć konstrukcji, dla lenistwa załączyłem archiwum z kodem na końcu artykułu ;) Struktura:
Co to jest programowanie interfejsu?  Pobawmy się w architekta - 1
Garść modeli:
package cashbox.model;

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

public interface Direction {
    /**
     * @return город Jak цель направления, куда едем/летим/двигаемся
     */
    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 {
}
Para wyjątków:
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;
    }
}
Najważniejszą częścią kasy jest:
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 если нет такой валюты, отсутствующая валюта передается Jak атрибут
     */
    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);
}
Pierwszą rzeczą, która rzuca się w oczy nieprzygotowanemu programiście, jest javadoc. Chociaż prawdopodobnie są znane nieprzeszkolonemu programiście. Niektórzy czasem są leniwi, ale mój kod jest już dobry, bez dokumentu ;) Nawet teraz nie chce mi się o niektórych rzeczach pisać dokumentu. No bo po co pisać do transportu, że to transport? Zostawmy to na później! Wszystko, co było potrzebne, starałem się opisać w dokumentach. Teraz wyjaśnię, dlaczego wygodniej jest pisać kod w ten sposób. Słuchaj, teraz mogę dać ci interfejs CashBoxi poprosić o jego wdrożenie. Czy on nie jest trudny? Ponadto wymagane zachowanie jest opisane w dokumentacji. Nie będziesz musiał czekać, aż ktoś napisze modele lub cokolwiek innego. Bierzesz modele interfejsów i zaczynasz w oparciu o nie pracować. Teraz programujesz w interfejsach, gratulacje. A teraz najważniejsze. Mogę zlecić Tobie zadanie do wykonania CashBox, a także komuś innemu, tak że mamy 2 wdrożenia. Na przykład kasa biletowa podmiejska i międzynarodowa. Będziesz mógł pisać kod równolegle, a każdy członek zespołu, który będzie pisał kod na jego podstawie, CashBoxbędzie mógł już rozpocząć i budować interfejs. To jest bardzo wygodne. Wielozadaniowość, do diabła z tym. Link do kodu na Dysku Google -> tutaj
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION