JavaRush /Blogue Java /Random-PT /O que é programação de interface? Vamos brincar de arquit...

O que é programação de interface? Vamos brincar de arquiteto

Publicado no grupo Random-PT
Talvez você já tenha ouvido falar que existe “programação de interface”. É hora de conhecer isso melhor. Haverá pouco texto e muito código (sem lógica). Não consegui encontrar quando as primeiras interfaces apareceram. Provavelmente foi há muito tempo e a Internet se esqueceu disso. De qualquer forma. A ideia da interface é simples: descrever o que faremos sem entrar em detalhes. Aqueles. não importa como você faz isso, importa o que você faz. Mas depois de escrever este artigo, encontrei um bom sobre um tema semelhante aqui em grupos. Clique no link e leia, quanto mais melhor! Contente:

Por que isso é necessário?

Quando o código consiste em uma classe, isso não é realmente necessário. Mas quando as classes precisam interagir entre si e seu número ultrapassa várias dezenas, é hora de pensar em design. Primeiro, pense em toda a estrutura do projeto de cima para baixo (da abstração máxima à implementação). Se várias pessoas estão trabalhando em um projeto, então é muito conveniente concordar, descrever as interfaces de interação das classes, desmontar essas interfaces e começar a implementá-las. O resultado é um bom paralelismo de tarefas; elas são fáceis de dividir, porque todos concordaram em tudo, mas ninguém se importa com os detalhes.

O que isso dá ao desenvolvedor?

O desenvolvedor não precisa de uma implementação da classe. Isso significa que depois que todos concordarem, ele pega as interfaces que precisa e as utiliza. A implementação será substituída quando estiver pronta. Deixe-me mostrar meu exemplo e depois conversaremos mais. Decidi escrever um pequeno projeto de caixa registradora. Ela vai ajudar a escolher as passagens, vendê-las, dar e tirar dinheiro do banco, trocar dinheiro para quem vem em grande número. Então, minha exalação arquitetônica: PS não há necessidade de copiar e criar uma estrutura, por preguiça anexei um arquivo com código no final do artigo ;) Estrutura :
O que é programação de interface?  Vamos brincar de arquiteto - 1
Vários modelos:
package cashbox.model;

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

public interface Direction {
    /**
     * @return город How цель направления, куда едем/летим/двигаемся
     */
    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 {
}
Par de exceções:
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;
    }
}
A caixa registradora é a parte mais importante:
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 если нет такой валюты, отсутствующая валюта передается How атрибут
     */
    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);
}
A primeira coisa que chama a atenção de um desenvolvedor despreparado é javadoc. Embora, provavelmente, eles sejam familiares para um desenvolvedor não treinado. Algumas pessoas às vezes são preguiçosas, mas meu código já está bom, sem documento ;) Mesmo agora não quero escrever um documento sobre algumas coisas. Bem, por que escrever para transporte que é transporte? Vamos deixar isso para depois! Tentei descrever em documentos tudo o que era necessário. Agora explicarei por que é mais conveniente escrever código dessa maneira. Olha, agora posso te dar uma interface CashBoxe pedir para você implementá-la. Ele não é difícil? Além disso, o comportamento necessário está descrito na documentação. Você não terá que esperar que alguém escreva modelos ou qualquer outra coisa. Você pega modelos de interface e começa a trabalhar com base neles. Agora você está programando em interfaces, parabéns. E agora o principal. Posso dar a você a tarefa de implementar CashBox, assim como a outra pessoa, para que tenhamos 2 implementações. Por exemplo, bilheteria suburbana e internacional. Você será capaz de escrever código em paralelo e qualquer membro da equipe que escreverá código com base CashBoxjá poderá iniciar e construir na interface. É muito confortável. Multitarefa, para o inferno com isso. Link para o código no Google Drive -> aqui
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION