ตามกฎหมายของ Demeter ชั้นเรียนได้รับอนุญาตให้ส่งคืนหนึ่งในสมาชิกหรือไม่


13

ฉันมีสามคำถามเกี่ยวกับกฎหมายของ Demeter

นอกเหนือจากคลาสที่ได้รับการแต่งตั้งเป็นพิเศษเพื่อส่งคืนวัตถุ - เช่นคลาสจากโรงงานและตัวสร้าง - มันไม่เป็นไรสำหรับวิธีการส่งคืนวัตถุเช่นวัตถุที่จัดขึ้นโดยคุณสมบัติอย่างใดอย่างหนึ่งของชั้นเรียนหรือจะละเมิดกฎของ demeter (1) ? และถ้ามันละเมิดกฏหมายของ demeter มันจะสำคัญไหมถ้าวัตถุที่ส่งคืนนั้นเป็นวัตถุที่ไม่เปลี่ยนรูปซึ่งแสดงถึงชิ้นส่วนของข้อมูลและไม่มีอะไรเลยนอกจาก getters สำหรับข้อมูลนี้ (2a) หรือ ValueObject นั้นมีรูปแบบการต่อต้านในตัวเองเพราะทุกอย่างที่ทำกับข้อมูลในคลาสนั้นถูกทำนอกคลาส (2b) หรือไม่

ในรหัสหลอก:

class A {}

class B {

    private A a;

    public A getA() {
        return this.a;
    }
}

class C {

    private B b;
    private X x;

    public void main() {
        // Is it okay for B.getA to exist?
        A a = this.b.getA();

        a.doSomething();

        x.doSomethingElse(a);
    }
}

ฉันสงสัยว่ากฎหมายของ Demeter ห้ามรูปแบบดังกล่าวข้างต้น ฉันจะทำอย่างไรเพื่อให้มั่นใจว่าdoSomethingElse()สามารถถูกเรียกได้ในขณะที่ไม่ละเมิดกฎหมาย (3)


9
ผู้คนจำนวนมาก (โดยเฉพาะโปรแกรมเมอร์ทำงาน) มองว่า Law of Demeter เป็นรูปแบบการต่อต้าน คนอื่นมองว่าเป็น "คำแนะนำที่เป็นประโยชน์ในบางโอกาสของ Demeter"
David Hammen

1
ฉันจะลบล้างคำถามนี้เพราะมันแสดงให้เห็นถึงความไร้สาระที่กฎหมายของ Demeter ใช่ LoD คือ "มีประโยชน์เป็นครั้งคราว" แต่มักจะโง่
949300

เป็นวิธีการที่xได้รับการตั้งค่า?
candied_orange

@CandiedOrange เป็นเพียงสถานที่ให้บริการที่แตกต่างกันมีค่าเป็นเพียงวัตถุบางอย่างที่สามารถที่จะเรียกx doSomethingElse
2180613

1
ตัวอย่างของคุณไม่ได้ละเมิด LOD LOD เป็นเรื่องเกี่ยวกับการป้องกันไม่ให้ไคลเอ็นต์ของวัตถุเชื่อมต่อกับรายละเอียดภายในวัตถุหรือผู้ทำงานร่วมกัน user.currentSession.isLoggedIn()คุณต้องการหลีกเลี่ยงสิ่งที่ต้องการ เพราะมันเป็นคู่ของลูกค้าที่userจะไม่เพียงuserแต่ยังเป็นผู้ทำงานร่วมกัน, session. user.isLoggedIn()แต่คุณต้องการที่จะสามารถที่จะเขียน นี้มักจะประสบความสำเร็จโดยการเพิ่มisLoggedInวิธีการเพื่อให้มีการดำเนินการที่จะได้รับมอบหมายuser currentSession
Jonah

คำตอบ:


7

ในภาษาการเขียนโปรแกรมจำนวนมากค่าที่ส่งคืนทั้งหมดคือวัตถุ อย่างที่คนอื่น ๆ พูดกันว่าการไม่สามารถใช้วิธีการของวัตถุที่คืนกลับมาได้นั้นจะบังคับให้คุณไม่ต้องคืนสิ่งใดเลย คุณควรถามตนเองว่า "ความรับผิดชอบของคลาส A, B และ C คืออะไร" นี่คือเหตุผลที่การใช้ชื่อตัวแปร metasyntactic เช่น A, B และ C มักจะขอคำตอบ "มันขึ้นอยู่กับ" เพราะไม่มีความรับผิดชอบสืบทอดในเงื่อนไขเหล่านั้น

คุณอาจต้องการดูการออกแบบที่ขับเคลื่อนด้วยโดเมนซึ่งจะให้ชุดของฮิวริสติกที่เหมาะสมยิ่งขึ้นสำหรับเหตุผลว่าฟังก์ชันการทำงานควรไปที่ใดและใครควรจะเรียกสิ่งใด

คำถามที่สองของคุณเกี่ยวกับวัตถุที่ไม่เปลี่ยนรูปจะพูดถึงความคิดของ
วัตถุที่มีค่าเมื่อเปรียบเทียบกับวัตถุที่เป็นนิติบุคคล ใน DDD คุณสามารถส่งผ่านวัตถุค่าโดยไม่มีข้อ จำกัด สิ่งนี้ไม่ได้พูดจริงสำหรับวัตถุเอนทิตี

ล็อดง่ายจะแสดงที่ดีมากใน DDD เป็นกฎสำหรับการเข้าถึงมวล ไม่มีวัตถุภายนอกควรเก็บการอ้างอิงถึงสมาชิกของมวลรวม ควรมีการอ้างอิงรูทเท่านั้น

นอกเหนือจาก DDD คุณอย่างน้อยต้องการพัฒนาชุดแบบแผนของคุณเองสำหรับคลาสที่เหมาะสมสำหรับโดเมนของคุณ บังคับใช้กฎเกี่ยวกับแบบแผนเหล่านั้นในขณะที่คุณออกแบบระบบของคุณ

โปรดจำไว้เสมอว่ากฎเหล่านี้ทั้งหมดคือการจัดการความซับซ้อนไม่ให้เอ็นร้อยหวายตัวเอง


1
DDD จัดเตรียมกฎใด ๆ ว่าสมาชิกชั้นเรียนเช่นข้อมูลสามารถเปิดเผยได้หรือไม่ (เช่นผู้ให้บริการควรมีอยู่) หรือไม่? การอภิปรายทั่วLaw of Demeter, tell, don't ask, getters are evil, object encapsulationและsingle responsibility principleดูเหมือนจะต้มลงไปคำถามนี้: เมื่อควรคณะผู้แทนไปยังวัตถุโดเมนถูกนำมาใช้เมื่อเทียบกับการได้รับค่าของวัตถุและการทำอะไรกับมันได้หรือไม่ มันจะมีประโยชน์มากในการใช้คุณสมบัติที่เหมาะสมกับสถานการณ์ที่ต้องทำการตัดสินใจ
2180613

แนวทางเช่น "getters is evil" มีอยู่เพราะหลายคนปฏิบัติต่ออินสแตนซ์ของคลาสเป็นโครงสร้างข้อมูล (ถุงข้อมูลที่จะส่งผ่าน) นี่ไม่ใช่การเขียนโปรแกรมเชิงวัตถุ วัตถุคือชุดของฟังก์ชั่น / พฤติกรรมที่ให้ผลงานจริง ขอบเขตของงานถูกกำหนดโดยความรับผิดชอบ งานนี้จะสร้างวัตถุที่รับคืนจากวิธีการอย่างชัดเจนหากคลาสของคุณกำลังทำงานที่มีความหมายซึ่งคุณสามารถกำหนดได้อย่างชัดเจนเกินกว่า "แสดงข้อมูลวัตถุ X ที่มีแอตทริบิวต์ Y และ Z" คุณก็อยู่บนเส้นทางที่ถูกต้อง . ฉันจะไม่เครียดกับมัน
Jeremy

เพื่อขยายในจุดนั้นเมื่อคุณใช้ getters / askers จำนวนมากซึ่งมักจะหมายความว่าคุณมีวิธีการขนาดใหญ่บางแห่งที่จัดการทุกอย่างซึ่งฟาวเลอร์เรียกว่าสคริปต์ธุรกรรม ก่อนที่คุณจะเริ่มใช้ผู้ทะเยอทะยานถามตัวเองว่าทำไมฉันถึงขอข้อมูลนี้จากวัตถุ เหตุใดฟังก์ชันนี้จึงไม่ทำงานในวิธีการบนวัตถุ ถ้ามันไม่ใช่ความรับผิดชอบของคลาสนี้ที่จะใช้ฟังก์ชั่นนี้ให้ไปข้างหน้าและใช้ getter หนังสือ [Refactoring] ( martinfowler.com/books/refactoring.html ) โดย Fowler เป็นหนังสือเกี่ยวกับการวิเคราะห์พฤติกรรมสำหรับคำถามดังกล่าว
Jeremy

ในหนังสือของเขาที่ใช้การออกแบบที่ขับเคลื่อนด้วยโดเมน Vaughn Vernon ได้กล่าวถึงกฎของ Demeter และ Tell, Don't Ask ใน Ch 10, pp 382 อาจดูน่าสนใจหากคุณเข้าถึง
Jeremy

6

ตามกฎหมายของ Demeter ชั้นเรียนได้รับอนุญาตให้ส่งคืนหนึ่งในสมาชิกหรือไม่

ใช่แน่นอนที่สุดคือ

ลองดูที่ประเด็นหลัก :

  • แต่ละหน่วยควรมีความรู้ที่ จำกัด เฉพาะเกี่ยวกับหน่วยอื่น ๆ : เฉพาะหน่วย "อย่างใกล้ชิด" ที่เกี่ยวข้องกับหน่วยปัจจุบัน
  • แต่ละหน่วยควรพูดคุยกับเพื่อนเท่านั้น อย่าคุยกับคนแปลกหน้า
  • พูดคุยกับเพื่อนของคุณทันที

ทั้งสามข้อนี้ทำให้คุณถามคำถามเดียว: เพื่อนคือใคร

เมื่อตัดสินใจว่าจะส่งคืนอะไรกฎของ Demeter หรือหลักการของความรู้น้อยที่สุด (LoD) ไม่ได้กำหนดว่าคุณจะป้องกันผู้เข้ารหัสที่ยืนยันการละเมิด มันบอกว่าคุณไม่ได้บังคับให้ผู้เขียนโค้ดละเมิด

การสับสนเหล่านี้คือเหตุผลที่หลายคนคิดว่าผู้ตั้งตัวต้องกลับเป็นโมฆะเสมอ ไม่ได้คุณต้องอนุญาตวิธีในการสอบถาม (getters) ที่ไม่เปลี่ยนสถานะของระบบ นั่นเป็นพื้นฐานการแยกแบบสอบถามคำสั่ง

นี่หมายความว่าคุณมีอิสระที่จะเจาะลึกลงไปในฐานรหัสผูกมัดกันทุกสิ่งที่คุณต้องการ? ไม่ได้เชนเข้าด้วยกันเฉพาะสิ่งที่ตั้งใจไว้ด้วยกัน มิฉะนั้นโซ่อาจเปลี่ยนแปลงและทันใดนั้นสิ่งของคุณก็แตก นี่คือความหมายของเพื่อน

โซ่ยาวสามารถออกแบบมาเพื่อ อินเทอร์เฟซที่คล่องแคล่ว iDSL Java8 ส่วนใหญ่และ StringBuilder เก่าที่ดีล้วนมีไว้เพื่อให้คุณสร้างเครือข่ายยาว ๆ พวกเขาไม่ได้ละเมิด LoD เพราะทุกสิ่งในโซ่มีไว้เพื่อทำงานร่วมกันและสัญญาว่าจะทำงานร่วมกันต่อไป คุณละเมิดความผิดทางอาญาเมื่อคุณรวมกลุ่มสิ่งที่ไม่เคยได้ยินซึ่งกันและกัน เพื่อนคือคนที่สัญญาว่าจะทำให้ห่วงโซ่คุณทำงานได้ เพื่อนของเพื่อนไม่ได้

นอกเหนือจากคลาสที่ได้รับการแต่งตั้งเป็นพิเศษเพื่อส่งคืนวัตถุ - เช่นคลาสจากโรงงานและตัวสร้าง - มันไม่เป็นไรสำหรับวิธีการส่งคืนวัตถุเช่นวัตถุที่จัดขึ้นโดยคุณสมบัติอย่างใดอย่างหนึ่งของชั้นเรียนหรือจะละเมิดกฎของ demeter (1) ?

สิ่งนี้จะสร้างโอกาสที่จะละเมิด Demeter เท่านั้น นี่ไม่ใช่การละเมิด มันไม่ได้เลวร้ายเสมอไป

และถ้ามันละเมิดกฏหมายของ demeter มันจะสำคัญไหมถ้าวัตถุที่ส่งคืนนั้นเป็นวัตถุที่ไม่เปลี่ยนรูปซึ่งแสดงถึงชิ้นส่วนของข้อมูลและไม่มีอะไรนอกจาก getters สำหรับข้อมูลนี้ (2)?

ไม่เปลี่ยนรูปเป็นสิ่งที่ดี แต่ไม่เกี่ยวข้องที่นี่ การทำสิ่งต่าง ๆ ผ่านสายโซ่ที่ยาวขึ้นไม่ได้ทำให้ดีขึ้น สิ่งที่ทำให้ดีขึ้นคือการแยกการได้รับจากการใช้งาน หากคุณกำลังใช้ขอสิ่งที่คุณต้องการเป็นพารามิเตอร์ อย่าไปตามล่าหามันโดยการเจาะเข้าไปในผู้บุกรุกของคนแปลกหน้า

ในรหัสหลอก:

ฉันสงสัยว่ากฎหมายของ Demeter ห้ามรูปแบบดังกล่าวข้างต้น ฉันจะทำอย่างไรเพื่อให้มั่นใจว่าสามารถเรียก doSomethingElse () ในขณะที่ไม่ละเมิดกฎหมาย (3)

ก่อนที่ฉันจะพูดเกี่ยวกับx.doSomethingElse(a)ความเข้าใจว่าคุณได้เขียนพื้นฐาน

b.getA().doSomething()

ตอนนี้LoD ไม่ได้ออกกำลังกายที่จุดนับ แต่เมื่อคุณสร้างห่วงโซ่ที่คุณกำลังจะบอกว่าคุณรู้วิธีการที่จะได้รับA(โดยการใช้B) Aและคุณรู้วิธีการใช้ ตอนนี้AและBควรเป็นเพื่อนสนิทกันดีกว่าเพราะคุณแค่จับคู่พวกเขาเข้าด้วยกัน

ถ้าคุณได้ถามเพียงแค่บางสิ่งบางอย่างที่จะถึงมือคุณAชอบสิ่งที่คุณสามารถใช้Aและจะไม่ได้รับการดูแลมันมาจากไหนและBจะมีชีวิตที่มีความสุขในชีวิตและเป็นอิสระจากความหลงใหลของคุณกับการได้รับจากAB

สำหรับx.doSomethingElse(a)รายละเอียดที่xมาจากไหน LoD ไม่มีอะไรจะพูดเกี่ยวกับมัน

LoD สามารถกระตุ้นให้การใช้งานแยกจากการก่อสร้าง แต่ฉันจะชี้ให้เห็นว่าถ้าคุณปฏิบัติต่อวัตถุทุกอย่างที่ไม่เป็นมิตรคุณจะต้องเขียนรหัสด้วยวิธีการคงที่ คุณสามารถสร้างกราฟวัตถุที่ซับซ้อนอย่างน่าอัศจรรย์ในหลักด้วยวิธีนี้ แต่ในที่สุดคุณจะต้องเรียกวิธีการในการเริ่มต้นสิ่งที่ทำงาน คุณเพียงแค่ต้องตัดสินใจว่าเพื่อนของคุณคือใคร ไม่มีการหลีกหนีจากสิ่งนั้น

ใช่คลาสได้รับอนุญาตให้ส่งคืนหนึ่งในสมาชิกภายใต้ LoD เมื่อคุณควรชัดเจนว่าสมาชิกคนนั้นเป็นมิตรกับชั้นเรียนของคุณเพราะถ้าไม่ลูกค้าบางรายอาจลองเชื่อมโยงคุณกับชั้นเรียนโดยใช้คุณเพื่อให้ได้ก่อนที่จะใช้ นั่นเป็นสิ่งสำคัญเพราะตอนนี้สิ่งที่คุณกลับมาต้องสนับสนุนการใช้งานนั้นเสมอ

มีหลายกรณีที่สิ่งนี้ไม่น่าเป็นห่วง คอลเลกชันสามารถเพิกเฉยสิ่งนี้ได้เพราะพวกเขาตั้งใจจะเป็นเพื่อนกับทุกสิ่งที่ใช้พวกเขา วัตถุที่มีคุณค่าในทำนองเดียวกันนั้นเป็นมิตรกับทุกคน แต่ถ้าคุณเขียนยูทิลิตีการตรวจสอบความถูกต้องของที่อยู่ซึ่งเรียกร้องให้พนักงานของวัตถุนั้นดึงข้อมูลที่อยู่ออกมาจากนั้นก็แค่ขอที่อยู่คุณก็หวังว่าพนักงานและที่อยู่ทั้งสองจะมาจากห้องสมุดเดียวกัน


ส่วนต่อประสานที่คล่องแคล่วไม่ได้เป็นข้อยกเว้นของ LOD เนื่องจากแนวคิดบางอย่างของความเป็นมิตร .... ในส่วนต่อประสานที่คล่องแคล่ววิธีการต่าง ๆ ในสายโซ่ถูกเรียกบนวัตถุเดียวกันเพราะพวกมันกลับมาเอง settings.darkTheme().monospaceFont()เป็นเพียงน้ำตาลประโยคสำหรับsettings.darkTheme(); settings.monospaceFont();
Jonah

3
@Jonah การกลับมาของตัวเองเป็นมิตรที่สุด และไม่ใช่อินเตอร์เฟสที่คล่องแคล่วทั้งหมดทำ iDSL หลายแห่งนั้นมีความคล่องแคล่วและมีชนิดที่แตกต่างกันกลับเพื่อเปลี่ยนวิธีการที่มีในจุดต่าง ๆ พิจารณาjOOQ , สร้างขั้นตอน , สร้างตัวช่วยสร้างและฝันร้ายของตัวเองสร้างมอนสเตอร์ ความคล่องแคล่วเป็นสไตล์ ไม่ใช่รูปแบบ
candied_orange

2

นอกเหนือจากคลาสที่ได้รับการแต่งตั้งเป็นพิเศษเพื่อส่งคืนวัตถุ [... ]

ฉันไม่ค่อยเข้าใจเรื่องนี้ วัตถุใด ๆ ที่สามารถส่งคืนวัตถุที่เป็นผลมาจากการร้องขอข้อความ โดยเฉพาะอย่างยิ่งถ้าคุณคิดว่าใน "ทุกสิ่งเป็นวัตถุ"

อย่างไรก็ตามคลาสเป็นวัตถุเดียวที่สามารถยกตัวอย่างวัตถุใหม่ด้วยตนเองโดยส่งข้อความ "ใหม่" (หรือแทนที่ด้วยคำหลักใหม่ในภาษา OOP ที่พบบ่อยที่สุด)


อย่างไรก็ตามเกี่ยวกับคำถามของคุณฉันค่อนข้างสงสัยเกี่ยวกับวัตถุที่ส่งคืนคุณสมบัติอย่างใดอย่างหนึ่งเพื่อนำไปใช้ที่อื่น อาจเป็นไปได้ว่าวัตถุนี้จะรั่วไหลออกมาข้อมูลเกี่ยวกับสถานะหรือรายละเอียดการดำเนินงานของมัน

และคุณไม่ต้องการให้วัตถุ C รู้เกี่ยวกับรายละเอียดการใช้งานของ B. นี่คือการพึ่งพาที่ไม่พึงประสงค์ในวัตถุ A จากมุมมองวัตถุ C

ดังนั้นคุณอาจต้องการถามตัวเองว่า C โดยการรู้ A ไม่ได้รู้มากเกินไปสำหรับงานที่เขาต้องทำโดยไม่ขึ้นกับ LOD

มีหลายกรณีที่สิ่งนี้สามารถถูกต้องตามกฎหมายได้เช่นการขอวัตถุการรวบรวมสำหรับรายการใดรายการหนึ่งนั้นมีความเหมาะสมและไม่ทำลายกฎ Demeter ใด ๆ การขอวัตถุ Book สำหรับวัตถุ SQLConnection นั้นมีความเสี่ยงและควรหลีกเลี่ยง

LOD มีอยู่เพราะโปรแกรมเมอร์หลายคนมักจะถามข้อมูลก่อนที่จะทำงานออกมา LOD อยู่ที่นั่นเพื่อเตือนเราว่าบางครั้ง (ถ้าไม่เสมอไป) เราแค่ทำสิ่งที่ซับซ้อนเกินไปโดยต้องการให้วัตถุของเราทำมากเกินไป บางครั้งเราต้องขอวัตถุอื่นเพื่อทำงานให้เรา LOD อยู่ที่นั่นเพื่อทำให้เราคิดสองครั้งเกี่ยวกับที่ที่เราวางพฤติกรรมในวัตถุของเรา


0

นอกเหนือจากคลาสที่ได้รับการแต่งตั้งเป็นพิเศษเพื่อส่งคืนวัตถุ - เช่นคลาสจากโรงงานและตัวสร้าง - มันเป็นวิธีการที่จะส่งคืนวัตถุหรือไม่?

ทำไมถึงไม่เป็นเช่นนั้น? คุณดูเหมือนจะแนะนำว่าจำเป็นต้องส่งสัญญาณไปยังโปรแกรมเมอร์ของคุณว่าชั้นมีความหมายเฉพาะในการส่งคืนวัตถุหรือจะต้องไม่ส่งคืนวัตถุเลย ในภาษาที่ทุกอย่างเป็นวัตถุสิ่งนี้จะ จำกัด ตัวเลือกของคุณอย่างรุนแรงเนื่องจากคุณจะไม่สามารถส่งคืนสิ่งใดเลย


ตัวอย่างนี้เป็นเรื่องเกี่ยวกับนัยb.getA().doSomething()และx.doSomethingElse(b.getA())
user2180613

A a = b.getA(); a.DoSomething();- กลับไปที่หนึ่งจุด
Robert Harvey

2
@ user2180613 - หากคุณต้องการถามเกี่ยวกับb.getA().doSomething()และx.doSomethingElse(b.getA())คุณควรถามอย่างชัดเจนเกี่ยวกับเรื่องนั้น มันยืน, this.b.getA()คำถามของคุณดูเหมือนจะเป็นเรื่องเกี่ยวกับ
David Hammen

1
ในฐานะที่Aไม่ได้เป็นสมาชิกของCไม่ได้ถูกสร้างขึ้นCและไม่ได้ให้ไปCมันก็ดูเหมือนว่าใช้AในC(ในลักษณะใด) ละเมิด LoD การนับจุดไม่ใช่สิ่งที่ LoD เกี่ยวข้อง แต่เป็นเพียงเครื่องมืออธิบายเท่านั้น เป็นไปได้ที่จะแปลงDriver().getCar().getSteeringWheel().getFrontWheels().toRight()เป็นคำสั่งแยกกันซึ่งแต่ละอันมีหนึ่งจุด แต่การละเมิด LoD ยังคงอยู่ที่นั่น tell don't askผมอ่านในโพสต์จำนวนมากในฟอรั่มนี้ว่าการกระทำที่มีประสิทธิภาพควรจะมอบหมายให้วัตถุที่ดำเนินการเช่นพฤติกรรมที่เกิดขึ้นจริง ค่าที่ส่งคืนดูเหมือนจะขัดแย้งกับสิ่งนั้น
user2180613

1
ฉันคิดว่ามันเป็นเรื่องจริง แต่ไม่ตอบคำถาม
user2180613

0

ขึ้นอยู่กับสิ่งที่คุณกำลังทำ หากคุณเปิดเผยสมาชิกของชั้นเรียนของคุณเมื่อไม่มีใครทำธุรกิจว่านี่เป็นสมาชิกในชั้นเรียนของคุณหรือสมาชิกประเภทนั้นเป็นสิ่งที่ไม่ดี หากคุณเปลี่ยนประเภทของสมาชิกนั้นและประเภทของฟังก์ชันที่ส่งคืนสมาชิกและทุกคนต้องเปลี่ยนรหัสนั่นเป็นความชั่ว

ในทางกลับกันถ้าอินเทอร์เฟซของคลาสของคุณระบุว่าจะให้อินสแตนซ์ของคลาส A ที่รู้จักกันดีนั่นเป็นเรื่องปกติ หากคุณโชคดีและคุณสามารถทำสิ่งนี้ได้โดยการส่งสมาชิกในชั้นเรียนของคุณทำดีกับคุณ หากคุณเปลี่ยนสมาชิกจากการเป็น A ไปเป็น B คุณจะต้องเขียนวิธีที่ส่งกลับ A ใหม่อีกครั้งซึ่งแน่นอนว่าตอนนี้จะต้องสร้างหนึ่งรายการและเติมด้วยข้อมูลที่มีอยู่แทนการส่งคืนแบบครั้งเดียว สมาชิก. อินเทอร์เฟซของคลาสของคุณจะไม่เปลี่ยนแปลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.