也許你曾經聽過「介面程式設計」這樣的東西。是時候更好地了解這一點了。將會有很少的文字和大量的程式碼(沒有邏輯)。 我找不到第一個介面何時出現。這可能是很久以前的事了,網路已經忘記了這件事。反正。介面的想法很簡單:描述我們將要做什麼,而不需要深入細節。那些。你怎麼做並不重要,重要的是你做什麼。但在我寫完這篇文章後,我在小組中找到了一篇關於類似主題的好文章。點擊連結閱讀,越多越好! 內容:
一堆模型:
為什麼這是必要的?
當程式碼由一個類別組成時,這並不是真正必要的。但是,當類別必須相互交互,並且類別的數量超過幾十個時,就需要考慮設計了。首先,從上到下(從最大抽像到實現)思考專案的整個結構。如果幾個人在做一個項目,那麼非常方便的做法是達成一致,描述類別的交互接口,然後拆解這些接口並開始實現它們。結果是任務具有良好的並行性;它們很容易劃分,因為 每個人都同意一切,但沒有人在乎細節。這為開發商帶來了什麼?
開發人員不需要該類別的實作。這就是說,大家都同意之後,他就拿他需要的介面來使用。該實作將在準備就緒後被替換。讓我向您展示我的範例,然後我們將進一步討論。我決定寫一個小型收銀機專案。她會幫助選票、賣票、向銀行取錢或從銀行領錢、為大量前來的人兌換錢。所以,我的建築感嘆: 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