ทำไมประเภทจะควบคู่ไปกับการสร้าง?


20

ฉันเพิ่งลบคำตอบของฉันในการตรวจสอบรหัสที่เริ่มต้นเช่นนี้:

private Person(PersonBuilder builder) {

หยุด. ธงแดง PersonBuilder จะสร้างบุคคล มันรู้เกี่ยวกับบุคคล คลาส Person ไม่ควรรู้อะไรเกี่ยวกับ PersonBuilder - เป็นเพียงประเภทที่ไม่เปลี่ยนรูป คุณสร้างคัปปลิ้งแบบวงกลมตรงนี้โดยที่ A ขึ้นอยู่กับ B ซึ่งขึ้นอยู่กับ A

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

ฉันถูกตบด้วย downvote และบอกว่า (อ้างถึง) การตั้งค่าสถานะสีแดงทำไม? การใช้งานที่นี่มีรูปร่างเดียวกับที่ Joshua Bloch แสดงในหนังสือ "Effective Java" ของเขา (รายการ # 2)

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

private StreetMap(Builder builder) {
    // Required parameters
    origin      = builder.origin;
    destination = builder.destination;

    // Optional parameters
    waterColor         = builder.waterColor;
    landColor          = builder.landColor;
    highTrafficColor   = builder.highTrafficColor;
    mediumTrafficColor = builder.mediumTrafficColor;
    lowTrafficColor    = builder.lowTrafficColor;
}

https://en.wikipedia.org/wiki/Builder_pattern#Java_example

หน้า Wikipedia เดียวกันสำหรับรูปแบบ Builder เดียวกันนั้นมีการปรับใช้ (และยืดหยุ่นมากกว่า) สำหรับ C #:

//Represents a product created by the builder
public class Car
{
    public Car()
    {
    }

    public int Wheels { get; set; }

    public string Colour { get; set; }
}

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

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

ดังนั้นการจัดการคืออะไร? ทำไมต้องคิดหาวิธีแก้ปัญหาที่เกินความคาดหมายเพื่อแก้ปัญหาที่ไม่ควรมีอยู่ในตอนแรก? หากเราถอด Joshua Bloch ออกจากแท่นเป็นเวลาหนึ่งนาทีเราจะคิดหาเหตุผลที่ดีและเป็นเหตุผลเดียวสำหรับการเชื่อมต่อคอนกรีตสองประเภทและเรียกมันว่าเป็นแนวปฏิบัติที่ดีที่สุดหรือไม่?

ทั้งหมดนี้เป็นการเขียนโปรแกรมการขนส่งสินค้าทางศาสนาให้ฉัน


12
นี้และ "คำถาม" ของ Reeks เพียงการพูดจาโผงผาง ...
ฟิลิปเคนดอล

2
@PhilipKendall อาจจะนิดหน่อย แต่ฉันสนใจที่จะเข้าใจอย่างแท้จริงว่าเหตุใดการใช้ตัวสร้าง Java ทุกครั้งจึงมีการเชื่อมต่อที่แน่นหนา
Mathieu Guindon

19
@PhilipKendall ฉันอยากรู้อยากเห็น
เสา

8
@PhilipKendall มันอ่านเหมือนพูดจาโผงผางใช่ แต่ที่หลักของมันมีคำถามในหัวข้อที่ถูกต้อง อาจจะพูดจาโผงผางแก้ไขได้ไหม?
Andres F.

ฉันไม่ประทับใจกับอาร์กิวเมนต์ "ตัวสร้างคอนสตรัคชันมากเกินไป" แต่ฉันก็ประทับใจน้อยลงด้วยตัวอย่างของผู้สร้างทั้งสองนี้ อาจเป็นเพราะตัวอย่างง่ายเกินไปที่จะแสดงให้เห็นถึงพฤติกรรมที่ไม่น่าสนใจ แต่ตัวอย่าง Java อ่านเช่นอินเทอร์เฟซที่คล่องแคล่วที่ซับซ้อนและตัวอย่าง C # เป็นเพียงวิธีวงเวียนในการใช้คุณสมบัติ ทั้งสองตัวอย่างทำการตรวจสอบความถูกต้องของพารามิเตอร์ทุกรูปแบบ คอนสตรัคเตอร์อย่างน้อยจะตรวจสอบประเภทและจำนวนของอาร์กิวเมนต์ที่ระบุซึ่งหมายความว่าตัวสร้างที่มีอาร์กิวเมนต์มากเกินไปจะชนะ
Robert Harvey

คำตอบ:


22

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

สำหรับฉันมีคำถามหนึ่งข้อ: ตัวสร้างเป็นส่วนที่จำเป็นของ API ประเภทหรือไม่ นี่เป็น PersonBuilder เป็นส่วนที่จำเป็นของคน API?

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

หากเป็นกรณีที่จำเป็นต้องสร้างบุคคลผ่าน PersonBuilder ที่ให้มาซึ่งเป็นส่วนหนึ่งของการออกแบบ API ระดับแพ็กเกจเดียวการเชื่อมต่อแบบวงกลมนั้นทำได้ดีและไม่ได้รับการรับประกันธงสีแดงที่นี่ โดยเฉพาะอย่างยิ่งคุณระบุว่ามันเป็นความจริงที่ไม่สามารถเพิกถอนได้และไม่ใช่ความคิดเห็นหรือการออกแบบ API เพื่อให้อาจตอบสนองได้ไม่ดี ฉันจะไม่ได้ downvoted คุณ แต่ผมไม่โทษคนอื่นสำหรับการทำเช่นนั้นและฉันจะออกจากส่วนที่เหลือของการอภิปรายของ "สิ่งที่ใบสำคัญแสดงสิทธิ downvote" เพื่อที่ศูนย์ช่วยเหลือรหัสตรวจสอบและเมตา Downvotes เกิดขึ้น; มันไม่ใช่ "ตบ"

แน่นอนว่าถ้าคุณต้องการเปิดหลายวิธีในการสร้างวัตถุบุคคลจากนั้น PersonBuilder อาจกลายเป็นผู้บริโภคหรือยูทิลิตี้ของคลาสบุคคลซึ่งบุคคลไม่ควรพึ่งพาโดยตรง ตัวเลือกนี้ดูเหมือนยืดหยุ่นมากขึ้น - ใครไม่ต้องการตัวเลือกการสร้างวัตถุมากขึ้น - แต่เพื่อรับประกัน (เช่นความไม่สามารถเปลี่ยนแปลงได้หรือต่อเนื่องไม่ได้) ในทันใดบุคคลนั้นต้องเปิดเผยเทคนิคการสร้างสาธารณะแบบต่าง ๆ เช่นคอนสตรัคเตอร์ที่ยาวมาก ๆ . หาก Builder หมายถึงการแสดงหรือแทนที่นวกรรมิกด้วยฟิลด์ที่เป็นตัวเลือกจำนวนมากหรือตัวสร้างที่เปิดให้มีการปรับเปลี่ยนคอนสตรัคเตอร์แบบยาวของคลาสอาจเป็นรายละเอียดของการใช้งานที่ดีกว่า (โปรดจำไว้ว่าผู้สร้างที่เป็นทางการและจำเป็นต้องไม่กีดกันคุณจากการเขียนยูทิลิตีการก่อสร้างของคุณเองเพียงแค่ว่ายูทิลิตี้การก่อสร้างของคุณอาจใช้ตัวสร้างเป็น API ตามคำถามเดิมของฉันด้านบน)


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


ฉันคิดว่าฉันเห็นจุดของคุณเกี่ยวกับการปฏิบัติต่อตัวสร้างเป็นรายละเอียดการใช้งาน ดูเหมือนว่าประสิทธิผลของ Javaจะสื่อข้อความนี้ไม่ถูกต้อง (ฉันไม่มี / ไม่ได้อ่านหนังสือเล่มนั้น) ออกจากรุ่นน้องจูเนียร์ (?) Java devs สมมติว่า "นั่นเป็นวิธีการที่ทำ" โดยไม่คำนึงถึงสามัญสำนึก . ฉันยอมรับว่าตัวอย่างวิกิพีเดียนั้นไม่ดีสำหรับการเปรียบเทียบ .. แต่นี่คือวิกิพีเดีย .. และ FWIW ฉันไม่สนใจเรื่อง downvote จริงๆ คำตอบที่ถูกลบคือการนั่งด้วยคะแนนสุทธิบวกอยู่แล้ว (และในที่สุดก็มีโอกาสของฉันที่จะได้คะแนน [badge: peer-pressure])
Mathieu Guindon

1
ถึงกระนั้นฉันก็ไม่สามารถสลัดความคิดที่ว่าประเภทที่มีตัวสร้างคอนสตรัคชันมากเกินไปเป็นปัญหาการออกแบบ
Mathieu Guindon

3
@ โพสต์ Mat'sMug ของฉันข้างต้นใช้มันให้เป็นที่ตอบสนองความต้องการระดับที่สร้างอาร์กิวเมนต์หลาย ฉันก็ถือว่ามันเป็นกลิ่นของการออกแบบถ้าเรากำลังพูดถึงองค์ประกอบทางตรรกะทางธุรกิจโดยพลการ แต่สำหรับวัตถุข้อมูลมันไม่ได้เป็นคำถามสำหรับประเภทที่มีแอตทริบิวต์โดยตรงสิบหรือยี่สิบ มันไม่มีการละเมิด SRP สำหรับวัตถุที่จะแสดงระเบียนที่พิมพ์อย่างยิ่งเดียวในบันทึกตัวอย่างเช่น
Jeff Bowman สนับสนุน Monica

1
ยุติธรรมพอสมควร ฉันยังไม่ได้รับตัวString(StringBuilder)สร้างซึ่งดูเหมือนว่าจะเชื่อฟัง "หลักการ" ที่เป็นเรื่องปกติสำหรับประเภทที่มีการพึ่งพาผู้สร้าง ฉันรู้สึกงุนงงเมื่อเห็นว่าคอนสตรัคเตอร์โอเวอร์โหลด มันไม่ได้เหมือนStringมี 42 พารามิเตอร์คอนสตรัค ...
Mathieu Guindon

3
@Luaan Odd แท้จริงฉันไม่เคยเห็นมันใช้และไม่รู้ว่ามันมีอยู่จริง; toString()เป็นสากล
chrylis -on strike-

7

ฉันเข้าใจว่ามันน่ารำคาญเพียงใดเมื่อใช้ 'การอุทธรณ์ถึงอำนาจ' ในการอภิปราย ข้อโต้แย้งควรยืนอยู่บน IMO ของตัวเองและในขณะที่มันไม่ผิดที่จะชี้ไปที่คำแนะนำของบุคคลที่ได้รับความเคารพนับถือเช่นนี้จริง ๆ แล้วมันไม่สามารถพิจารณาข้อโต้แย้งทั้งหมดในตัวเองได้ Ala เรารู้ว่าดวงอาทิตย์ .

ต้องบอกว่าฉันคิดว่าหลักฐานของการโต้แย้งของคุณเหมือนกัน เราไม่ควรมีเพศสัมพันธ์สองประเภทที่เป็นรูปธรรมและเรียกมันว่าเป็นแนวปฏิบัติที่ดีที่สุดเพราะ ... มีคนพูดอย่างนั้นหรือ

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

Offhand ฉันพยายามดิ้นรนเพื่อดูว่าทั้งสองวิธีจะสร้างปัญหาได้อย่างไร ชั้นเรียนมีการเชื่อมโยงอย่างสมบูรณ์แน่นอน แต่ผู้สร้างอยู่เพียงเพื่อสร้างอินสแตนซ์ของชั้นเรียน อีกวิธีในการดูมันจะเป็นส่วนเสริมของตัวสร้าง


ดังนั้น ... การมีเพศสัมพันธ์ที่สูงขึ้นการทำงานร่วมกันที่ลดลง => ตอนจบที่มีความสุข? อืม ... ผมเห็นจุดเกี่ยวกับการสร้าง "การขยายตัวสร้าง" แต่เพื่อนำมาขึ้นอีกตัวอย่างหนึ่งที่ผมไม่เห็นว่าสิ่งที่Stringจะทำกับเกินตัวสร้างการStringBuilderพารามิเตอร์ (แม้ว่ามันเป็นที่ถกเถียงกันว่าStringBuilderเป็นผู้สร้างแต่ที่ของ อีกเรื่องหนึ่ง)
Mathieu Guindon

4
@ Mat'sMug เพื่อความชัดเจนฉันไม่มีความรู้สึกที่แข็งแกร่งเกี่ยวกับวิธีนี้ ฉันมักจะไม่ใช้รูปแบบตัวสร้างเพราะฉันไม่ได้สร้างคลาสที่มีอินพุตของรัฐมากมาย ฉันมักจะย่อยสลายชั้นเรียนด้วยเหตุผลที่คุณพาดพิงถึงที่อื่น ทั้งหมดที่ฉันพูดคือถ้าคุณสามารถแสดงให้เห็นว่าวิธีการนี้นำไปสู่ปัญหามันจะไม่สำคัญว่าพระเจ้าลงมาและมอบรูปแบบการสร้างนั้นแก่โมเสสบนแผ่นศิลา คุณชนะ'. ในทางตรงกันข้ามถ้าคุณไม่สามารถ ...
JimmyJames

รูปแบบการใช้ตัวสร้างที่ถูกต้องอย่างหนึ่งที่ฉันได้รับในฐานรหัสของฉันคือการเยาะเย้ย VBIDE API; โดยพื้นฐานแล้วคุณจะจัดหาเนื้อหาสตริงของโมดูลโค้ดและตัวสร้างจะให้คุณVBEจำลองเต็มไปด้วย windows บานหน้าต่างโค้ดที่ใช้งานโครงการและส่วนประกอบที่มีโมดูลที่มีสตริงที่คุณให้ไว้ ถ้าไม่มีมันฉันไม่รู้ว่าฉันจะสามารถเขียนการทดสอบ 80% ในRubberduckได้อย่างน้อยก็โดยไม่ต้องแทงตัวเองทุกครั้งที่มอง
Mathieu Guindon

@ Mat'sMug มันจะมีประโยชน์จริง ๆ สำหรับการแยกข้อมูลออกเป็นวัตถุที่ไม่เปลี่ยนรูป วัตถุประเภทนี้มีแนวโน้มที่จะเป็นถุงสมบัติเช่นไม่ใช่ OO จริงๆ พื้นที่ทั้งหมดของปัญหานั้นเป็น PITA ที่สิ่งใดก็ตามที่ช่วยให้ทำสำเร็จจะถูกนำไปใช้ไม่ว่าพวกเขาจะปฏิบัติตามแนวทางปฏิบัติที่ดีหรือไม่ก็ตาม
JimmyJames

4

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

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

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


แปลกครั้งเดียวที่ฉันต้องการผู้สร้างคือเมื่อฉันมีประเภทที่ไม่มีรูปร่างที่ชัดเจนเช่นMockVbeBuilderนี้ซึ่งสร้างจำลองของ API ของ IDE การทดสอบหนึ่งอาจต้องการโมดูลรหัสอย่างง่ายการทดสอบอื่นอาจต้องการสองรูปแบบและโมดูลคลาส - IMO นั่นคือรูปแบบตัวสร้างของ GoF ที่กล่าวว่าฉันอาจเริ่มใช้มันสำหรับชั้นเรียนอื่นด้วยตัวสร้างบ้า ... แต่การมีเพศสัมพันธ์ก็ไม่รู้สึกเลย
Mathieu Guindon

1
@ Mat's Mug คลาสที่คุณนำเสนอดูเหมือนจะเป็นตัวแทนของรูปแบบการออกแบบ Builder (จาก Design Patterns โดย Gamma, et al.) ไม่จำเป็นต้องเป็นคลาสบิลเดอร์ธรรมดา พวกเขาทั้งคู่สร้างสิ่งต่าง ๆ แต่พวกเขาไม่เหมือนกัน นอกจากนี้คุณไม่เคย "ต้องการ" ผู้สร้างมันทำให้สิ่งอื่น ๆ ง่ายขึ้น
Old Fat Ned

1

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

Personชั้นไม่ได้รู้ว่าสิ่งที่สร้างมัน มันมีเพียงนวกรรมิกที่มีพารามิเตอร์ดังนั้นอะไร ชื่อประเภทของพารามิเตอร์ลงท้ายด้วย... Builderซึ่งไม่ได้บังคับอะไรเลย มันเป็นเพียงชื่อหลังจากทั้งหมด

ตัวสร้างเป็นวัตถุการกำหนดค่าที่ได้รับเกียรติ1 และวัตถุการกำหนดค่าเป็นเพียงการจัดกลุ่มคุณสมบัติเข้าด้วยกันที่เป็นของกันและกัน หากพวกเขาเป็นของกันและกันเพื่อจุดประสงค์ในการส่งผ่านไปยังผู้สร้างชั้นเรียนดังนั้นไม่ว่าจะเป็น! ทั้งสองoriginและdestinationของตัวอย่างเป็นประเภทStreetMap Pointเป็นไปได้ไหมที่จะส่งพิกัดแต่ละจุดของแต่ละจุดบนแผนที่ แน่นอนว่า แต่คุณสมบัติของสิ่งนั้นPointอยู่ด้วยกันรวมทั้งคุณสามารถมีวิธีการทุกอย่างที่ช่วยในการก่อสร้าง:

1ความแตกต่างคือตัวสร้างไม่ได้เป็นเพียงวัตถุข้อมูลธรรมดา แต่อนุญาตให้มีการเรียกตัวตั้งค่าที่ถูกล่ามโซ่เหล่านี้ เป็นห่วงส่วนใหญ่กับวิธีการสร้างตัวเองBuilder

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

  1. มันสรุปการกระทำ: เรียกวิธีการของชั้นเรียนอื่น
  2. มันเก็บข้อมูลที่จำเป็นในการดำเนินการนั้น: ค่าสำหรับพารามิเตอร์ของวิธีการ

ส่วนพิเศษสำหรับผู้สร้างคือ:

  1. วิธีการที่จะเรียกว่าเป็นตัวสร้างของชั้นเรียน ดีกว่าเรียกว่ารูปแบบ Creationalในขณะนี้
  2. ค่าสำหรับพารามิเตอร์คือตัวสร้าง

สิ่งที่ถูกส่งไปยังตัวPersonสร้างสามารถสร้างได้ แต่ไม่จำเป็นต้องทำ มันอาจเป็นวัตถุการกำหนดค่าเก่าธรรมดาหรือตัวสร้าง


0

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


4
ขอบคุณ ... ฉันแน่ใจว่าคำตอบนี้จะรวบรวมคะแนนเสียงมากขึ้นถ้ามันขยายมากขึ้นอีกนิดดูเหมือนว่าคำตอบที่ยังไม่เสร็จ =)
มาติเยอ Guindon

ใช่ฉันต้องการ +1 วิธีการอื่นในการสร้างที่ให้การป้องกันและการรับประกันแบบเดียวกันโดยไม่ต้องมีเพศสัมพันธ์
matt freake

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