JavaRush /Java Blog /Random-KO /인터페이스 프로그래밍이란 무엇입니까? 건축가 놀이를 해보자

인터페이스 프로그래밍이란 무엇입니까? 건축가 놀이를 해보자

Random-KO 그룹에 게시되었습니다
아마도 "인터페이스 프로그래밍"이라는 것이 있다는 것을 들어본 적이 있을 것입니다. 이제 이것을 더 잘 알아야 할 때입니다. 텍스트는 거의 없고 코드는 많습니다(논리 없음). 첫 번째 인터페이스가 언제 나타났는지 찾을 수 없었습니다. 아마도 아주 오래 전 일이었고 인터넷은 그것을 잊어 버렸습니다. 그래도. 인터페이스의 아이디어는 간단합니다. 세부 사항을 설명하지 않고 무엇을 할지 설명하는 것입니다. 저것들. 어떻게 하느냐가 중요한 것이 아니라 무엇을 하느냐가 중요합니다. 그런데 이 글을 쓴 후 여기 그룹에서 비슷한 주제에 관한 좋은 글을 발견했습니다. 링크를 클릭해서 읽어보세요. 많을수록 좋습니다! 콘텐츠:

이것이 왜 필요한가요?

코드가 하나의 클래스로 구성되면 실제로는 이것이 필요하지 않습니다. 그러나 클래스가 서로 상호 작용해야 하고 그 수가 수십 개를 초과하는 경우에는 디자인에 대해 생각할 때입니다. 먼저, 프로젝트의 전체 구조를 위에서 아래로(최대 추상화부터 구현까지) 생각해 보세요. 여러 사람이 프로젝트를 진행하는 경우 동의하고 클래스의 상호 작용 인터페이스를 설명한 다음 이러한 인터페이스를 분해하고 구현을 시작하는 것이 매우 편리합니다. 결과적으로 작업의 병렬성이 향상되고 분할하기가 쉽습니다. 모두가 모든 것에 동의했지만 아무도 세부 사항에 관심이 없습니다.

이것이 개발자에게 무엇을 제공합니까?

개발자는 클래스를 구현할 필요가 없습니다. 이는 모든 사람이 동의한 후 필요한 인터페이스를 가져와 사용한다는 의미입니다. 구현이 준비되면 대체됩니다. 내 예를 보여주고 더 이야기하겠습니다. 나는 작은 금전 등록기 프로젝트를 작성하기로 결정했습니다. 그녀는 티켓을 선택하고, 판매하고, 은행에 돈을주고 받고, 많은 사람들이 오는 사람들을 위해 돈을 바꾸는 데 도움을 줄 것입니다. 따라서 건축학적 호기: 추신: 구조를 복사하고 생성할 필요가 없습니다. 게으름을 위해 기사 끝에 코드가 포함된 아카이브를 첨부했습니다. ;) 구조:
인터페이스 프로그래밍이란 무엇입니까?  건축가 놀이를 해보자 - 1
다양한 모델:
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 {
}
예외 쌍:
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 если нет такой валюты, отсутствующая валюта передается 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);
}
준비되지 않은 개발자의 시선을 가장 먼저 사로잡는 것은 javadoc. 아마도 훈련받지 않은 개발자에게는 친숙할 것입니다. 어떤 사람들은 때때로 게으르지만 내 코드는 문서 없이도 이미 훌륭합니다. ;) 지금도 나는 어떤 것에 대한 문서를 작성하고 싶지 않습니다. 글쎄요, 왜 교통수단이라고 교통수단에 쓰는 걸까요? 그건 나중을 위해 남겨두자! 나는 필요한 모든 것을 문서에 설명하려고 노력했습니다. 이제 왜 이렇게 코드를 작성하는 것이 더 편리한지 설명하겠습니다. 이제 인터페이스를 제공 CashBox하고 구현하도록 요청할 수 있습니다. 그 사람은 어렵지 않나요? 또한 필요한 동작은 설명서에 설명되어 있습니다. 누군가가 모델이나 다른 것을 작성할 때까지 기다릴 필요가 없습니다. 인터페이스 모델을 선택하고 이를 기반으로 작업을 시작합니다. 이제 인터페이스에서 프로그래밍을 하고 계십니다. 축하합니다. 그리고 이제 가장 중요한 것입니다. 구현 작업을 CashBox다른 사람과 마찬가지로 귀하에게 제공하여 2가지 구현을 수행할 수 있습니다. 예를 들어 교외 및 국제 매표소가 있습니다. 코드를 병렬로 작성할 수 있으며, 이를 기반으로 코드를 작성하는 모든 팀원은 CashBox이미 인터페이스를 시작하고 구축할 수 있습니다. 매우 편안합니다. 멀티태스킹, 정말이지. Google 드라이브의 코드 링크 -> 여기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION