ฉันกำลังใช้ API และพบปัญหานี้อยู่เรื่อยๆ ฉันคิดว่ามีบางอย่างผิดปกติกับการออกแบบหลักของฉัน แต่ฉันไม่แน่ใจว่าเกิดอะไรขึ้น และฉันรู้สึกหนักใจกับหลักการออกแบบ
โดยพื้นฐานแล้ว ฉันจะมีออบเจ็กต์ที่มีฟิลด์ที่เกี่ยวข้องมากมาย การเติมข้อมูลที่เหมาะสมลงในฟิลด์นั้นไม่ใช่เรื่องเล็กน้อย และอาศัยการเรียก API ภายนอกอย่างน้อยหนึ่งรายการโดยใช้ไคลเอนต์ที่ฉันส่งผ่านไปยังตัวสร้าง การเรียก API เหล่านี้ยังให้ข้อมูลที่เกี่ยวข้องกับมากกว่าหนึ่งฟิลด์ด้วย ดังนั้นจึงเป็นที่พึงปรารถนา เติมข้อมูลหลายช่องพร้อมกัน ฉันต้องการให้ Constructor เรียบง่าย/เร็ว และให้ Object ของฉันทดสอบได้ ดังนั้นฉันจึงไม่ใส่ตรรกะใดๆ ลงไป แค่มอบหมายงานเท่านั้น อย่างไรก็ตาม สิ่งที่ฉันทำคือสร้างวิธีการเดียวเพื่อเติมฟิลด์ทั้งหมดและเรียกสิ่งนี้ใน getters ทั้งหมดของฉันหลังจากการตรวจสอบค่าว่าง นั่นคือ การเติมฟิลด์อ็อบเจ็กต์อย่างเกียจคร้าน
ฉันคิดว่าสิ่งนี้ไม่ดีเพราะมันละเมิดหลักการ "ล้มเหลวเร็ว" โดยเฉพาะอย่างยิ่งเพราะฉันใช้ไคลเอนต์เพื่อโทรหาบริการภายนอก ซึ่งอาจล้มเหลวหากกล่าวคือ ข้อมูลรับรองไคลเอนต์ไม่ถูกต้อง อย่างไรก็ตาม ฉันประสบปัญหาในการปรับโครงสร้างโค้ดใหม่
ฉันคิดที่จะแยกตรรกะของไคลเอ็นต์ออกเป็นบริการ/ตัวเชื่อมต่อ ตัวอย่างเช่น ClothingConnector
แต่ฉันไม่แน่ใจว่าสิ่งนี้จะช่วยแก้ปัญหาของฉันได้ เพราะฉันยังไม่ต้องการเรียกสิ่งนี้ในตัวสร้าง และมันก็จะยังคงมีประโยชน์ เพื่อเติมข้อมูลหลายช่องพร้อมกัน
class Person {
ClientToGetClothing clothingClient;
Pants pants;
Shirt shirt;
Fabric shirtFabric;
Fabric pantsFabric;
public Person(ClientToGetClothing clothingClient) {
this.clothingClient = clothingClient;
}
private void populateClothing() {
PantsResponse pantsInfo = clothingClient.retrievePantsInfo();
this.pants = pantsInfo.getPants();
ShirtResponse shirtInfo = clothingClient.retrieveShirtInfo();
this.shirt = pantsInfo.getShirt();
// do some more things with my pants + shirt and assign results to more fields, calculate the fabric in this example
}
public Shirt getShirt() {
if (shirt == null) {
populateClothing;
}
return this.shirt;
}
// ...
}
Builder
pattern สิ่งนี้สามารถนำไปสู่โค้ดที่ค่อนข้างอ่านง่าย นอกจากนั้น ดูเหมือนว่าคำถามนี้น่าจะเหมาะกับการตรวจสอบโค้ดมากกว่า - person Turing85   schedule 12.07.2019