บางทีคุณอาจเคยได้ยินว่ามีสิ่งที่เรียกว่า "การเขียนโปรแกรมอินเทอร์เฟซ" ถึงเวลาที่จะทำความรู้จักสิ่งนี้ให้ดีขึ้นแล้ว จะมีข้อความน้อยและโค้ดเยอะ (ไม่มีตรรกะ) ฉันหาไม่เจอว่าอินเทอร์เฟซแรกปรากฏขึ้นเมื่อใด มันอาจจะนานมาแล้วและอินเทอร์เน็ตก็ลืมมันไป ถึงอย่างไร. แนวคิดของอินเทอร์เฟซนั้นเรียบง่าย: อธิบายสิ่งที่เราจะทำโดยไม่ต้องลงรายละเอียด เหล่านั้น. มันไม่สำคัญว่าคุณจะทำอย่างไร มันสำคัญว่าคุณทำอะไร แต่หลังจากที่ฉันเขียนบทความนี้ ฉันพบบทความดีๆ ในหัวข้อที่คล้ายกันที่นี่เป็นกลุ่ม คลิกที่ลิงค์แล้วอ่านยิ่งดี! เนื้อหา:
พวงของรุ่น:
เหตุใดจึงจำเป็น?
เมื่อโค้ดประกอบด้วยคลาสเดียว สิ่งนี้ก็ไม่จำเป็นจริงๆ แต่เมื่อคลาสต้องมีปฏิสัมพันธ์กันและมีจำนวนเกินหลายสิบคลาส ก็ถึงเวลาคิดเกี่ยวกับการออกแบบ ขั้นแรก ให้คิดผ่านโครงสร้างทั้งหมดของโครงการจากบนลงล่าง (จากสิ่งที่เป็นนามธรรมสูงสุดไปจนถึงการนำไปปฏิบัติ) หากมีหลายคนกำลังทำงานในโครงการ จะสะดวกมากที่จะตกลง อธิบายอินเทอร์เฟซการโต้ตอบของคลาส จากนั้นแยกส่วนอินเทอร์เฟซเหล่านี้และเริ่มนำไปใช้งาน ผลลัพธ์ที่ได้คือความเท่าเทียมที่ดีของงานซึ่งแบ่งได้ง่ายเพราะว่า ทุกคนเห็นพ้องต้องกันทุกเรื่องแต่ไม่มีใครใส่ใจในรายละเอียดสิ่งนี้ให้อะไรกับนักพัฒนา?
นักพัฒนาไม่จำเป็นต้องมีการใช้งานคลาส ซึ่งหมายความว่าหลังจากที่ทุกคนเห็นพ้องต้องกันแล้ว เขาก็นำอินเทอร์เฟซที่ต้องการไปใช้ การใช้งานจะถูกทดแทนเมื่อพร้อม ผมขอแสดงตัวอย่างให้คุณดู แล้วเราจะพูดคุยกันต่อไป ฉันตัดสินใจเขียนโครงการเครื่องบันทึกเงินสดขนาดเล็ก เธอจะช่วยเลือกตั๋ว ขาย ให้เงิน และเอาเงินจากธนาคาร แลกเงิน ให้กับผู้ที่มาเป็นจำนวนมาก ดังนั้นการหายใจออกทางสถาปัตยกรรมของฉัน: ป.ล. ไม่จำเป็นต้องคัดลอกและสร้างโครงสร้างเพื่อความเกียจคร้านฉันได้แนบไฟล์เก็บถาวรพร้อมโค้ดไว้ที่ท้ายบทความ ;) โครงสร้าง :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);
}
สิ่งแรกที่ดึงดูดสายตาของ Developer ที่ไม่ได้เตรียมตัวไว้javadoc
คือ แม้ว่าพวกเขาอาจจะคุ้นเคยกับนักพัฒนาที่ไม่ได้รับการฝึกฝนก็ตาม บางคนก็ขี้เกียจบ้างเป็นบางครั้ง แต่ Code ของฉันก็ดีอยู่แล้วโดยไม่ต้องมีเอกสาร ;) ถึงตอนนี้ฉันก็ไม่อยากเขียนเอกสารเกี่ยวกับบางสิ่งแล้ว แล้วทำไมเขียนถึงขนส่งว่าเป็นขนส่งล่ะ? ทิ้งไว้ทีหลังเถอะ! ฉันพยายามอธิบายทุกสิ่งที่จำเป็นในเอกสาร ตอนนี้ฉันจะอธิบายว่าทำไมการเขียนโค้ดด้วยวิธีนี้จึงสะดวกกว่า ดูสิ ตอนนี้ฉันสามารถให้อินเทอร์เฟซแก่คุณCashBox
และขอให้คุณนำไปใช้ เขาไม่ยากใช่ไหม? รวมถึงลักษณะการทำงานที่จำเป็นได้อธิบายไว้ในเอกสารประกอบ คุณไม่ต้องรอใครสักคนมาเขียนโมเดลหรืออะไรอย่างอื่น คุณใช้โมเดลอินเทอร์เฟซและเริ่มทำงานตามโมเดลเหล่านั้น ตอนนี้คุณกำลังเขียนโปรแกรมในส่วนต่อประสาน ขอแสดงความยินดีด้วย และตอนนี้สิ่งสำคัญ ฉันสามารถมอบหมายงานให้คุณนำไปใช้ได้CashBox
เช่นเดียวกับคนอื่น เพื่อให้เรามีการใช้งาน 2 แบบ เช่น สำนักงานขายตั๋วชานเมืองและต่างประเทศ คุณจะสามารถเขียนโค้ดแบบคู่ขนานได้ และสมาชิกในทีมที่จะเขียนโค้ดแบบพื้นฐานก็CashBox
สามารถเริ่มต้นและสร้างบนอินเทอร์เฟซได้แล้ว มันสะดวกสบายมาก มัลติทาสก์ไปนรกด้วย ลิงก์ไปยังโค้ดบน Google Drive -> ที่นี่
GO TO FULL VERSION