วิธีจัดโครงสร้างวัตถุที่ซับซ้อนด้วยฟิลด์ที่เกี่ยวข้องซึ่งจำเป็นต้องเริ่มต้นในเวลาเดียวกัน

ฉันกำลังใช้ 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;
    }
    // ...
}

person Tristan Sparks    schedule 11.07.2019    source แหล่งที่มา
comment
ทำไมไม่ดึงส่วนประกอบที่จำเป็นจาก API ภายนอกล่วงหน้าแล้วส่งต่อไปยังตัวสร้าง (การแยกข้อกังวล &การผกผันของการควบคุม)? เมื่อใช้ร่วมกับ Builder pattern สิ่งนี้สามารถนำไปสู่โค้ดที่ค่อนข้างอ่านง่าย นอกจากนั้น ดูเหมือนว่าคำถามนี้น่าจะเหมาะกับการตรวจสอบโค้ดมากกว่า   -  person Turing85    schedule 12.07.2019


คำตอบ (1)


ประการแรก ฉันจะแยก ClothingClient ออกจากวัตถุ Person ให้โรงงานทำการกำหนดประชากรแอ็ตทริบิวต์แล้วส่งคืนคลาสบุคคล https://en.wikipedia.org/wiki/Factory_method_pattern#Java

person Arpan Kanthal    schedule 11.07.2019
comment
ฉันขอยืนยันว่าการดำเนินการนี้ซับซ้อนเกินไปสำหรับโรงงานจึงต้องใช้ช่างก่อสร้างแทน - person Turing85; 12.07.2019