也许你曾经听说过“接口编程”这样的东西。是时候更好地了解这一点了。将会有很少的文本和大量的代码(没有逻辑)。 我找不到第一个界面何时出现。这可能是很久以前的事了,互联网已经忘记了这件事。反正。界面的想法很简单:描述我们将要做什么,而不需要深入细节。那些。你怎么做并不重要,重要的是你做什么。但在我写完这篇文章后,我在小组中找到了一篇关于类似主题的好文章。点击链接阅读,越多越好! 内容:
一堆模型:
为什么这是必要的?
当代码由一个类组成时,这并不是真正必要的。但是,当类必须相互交互,并且类的数量超过几十个时,就需要考虑设计了。首先,从上到下(从最大抽象到实现)思考项目的整个结构。如果几个人在做一个项目,那么非常方便的做法是达成一致,描述类的交互接口,然后拆解这些接口并开始实现它们。结果是任务具有良好的并行性;它们很容易划分,因为 每个人都同意一切,但没有人关心细节。这给开发商带来了什么?
开发人员不需要该类的实现。这就是说,大家都同意之后,他就拿他需要的接口来使用。该实现将在准备就绪后被替换。让我向您展示我的示例,然后我们将进一步讨论。我决定写一个小型收银机项目。她会帮助选票、卖票、向银行取钱或从银行取钱、为大量前来的人兑换钱。所以,我的建筑感叹: PS,不需要复制和创建结构,为了懒惰,我在文章末尾附上了带有代码的存档;)结构 :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 云端硬盘上的代码 ->这里
GO TO FULL VERSION