JavaRush /Java Blog /Random-JA /インターフェースプログラミングとは何ですか? 建築家で遊ぼう

インターフェースプログラミングとは何ですか? 建築家で遊ぼう

Random-JA グループに公開済み
「インターフェースプログラミング」というものがあることを聞いたことがあるかもしれません。このことをもっとよく知る時期が来ました。テキストは少なく、コードは (ロジックなしで) 多くなります。 最初のインターフェースがいつ登場したかはわかりませんでした。それはおそらく非常に昔のことであり、インターネットはそれを忘れていました。ともかく。インターフェイスのアイデアはシンプルです。詳細には触れずに、これから何をするかを説明します。それらの。どのようにするかは問題ではなく、何をするかが重要です。しかし、この記事を書いた後、グループで同様のトピックに関する良い記事を見つけました。リンクをクリックして読んでください。多ければ多いほどお得です! コンテンツ:

なぜこれが必要なのでしょうか?

コードが 1 つのクラスで構成されている場合、これは実際には必要ありません。しかし、クラスが相互にやり取りする必要があり、その数が数十を超えた場合は、デザインについて考える時期が来ます。まず、プロジェクトの全体構造を上から下まで (最大限の抽象化から実装まで) 検討します。複数の人がプロジェクトに取り組んでいる場合、合意してクラスの対話インターフェイスを記述し、これらのインターフェイスを逆アセンブルして実装を開始すると非常に便利です。その結果、タスクの並列性が向上し、分割が容易になります。誰もがすべてに同意していますが、誰も詳細を気にしません。

これは開発者に何をもたらすでしょうか?

開発者はクラスの実装を必要としません。これは、全員が同意した後、必要なインターフェイスを取得して使用することを意味します。実装は準備ができたら置き換えられます。私の例を示してから、さらに詳しく説明します。私は小さなレジプロジェクトを書くことにしました。彼女はチケットの選択、販売、銀行へのお金の授受、大勢で来る人の両替を手伝ってくれます。それで、私のアーキテクチャに関する吐露: PS 構造をコピーして作成する必要はありません。怠惰のため、記事の最後にコードを含むアーカイブを添付しました ;) 構造 :
インターフェースプログラミングとは何ですか?  建築家で遊ぼう - 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。おそらく、訓練を受けていない開発者にとってはよく知られたものでしょう。時々怠け者もいますが、ドキュメントがなくても私のコードはすでに優れています ;) 今でも、いくつかのことについてはドキュメントを書きたくないです。さて、なぜtransportをtransportと書くのでしょうか?それは後回しにしておきましょう!必要なことはすべて文書に記載しようとしました。ここで、この方法でコードを記述する方が便利な理由を説明します。ほら、これでインターフェースを提供してCashBox、それを実装してもらいます。彼は難しくないですか?さらに、必要な動作についてはドキュメントに記載されています。誰かがモデルやその他のものを書いてくれるのを待つ必要はありません。インターフェイス モデルを取得し、それに基づいて作業を開始します。これでインターフェイスでプログラミングができるようになりました。おめでとうございます。そして今がメインです。CashBoxあなたと他の誰かに を実装するタスクを与えることができるので、2 つの実装ができます。たとえば、郊外のチケット売り場や国際線のチケット売り場などです。コードを並行して作成できるようになり、それに基づいてコードを作成するチーム メンバーは、CashBoxすでにインターフェイスを開始して構築することができます。とても快適です。マルチタスク、本当に大変です。Google ドライブ上のコードへのリンク ->ここ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION