DDD และวัตถุค่า Object Value ที่ไม่แน่นอนเป็นตัวเลือกที่ดีสำหรับ Non Aggr เอนทิตีรูทหรือไม่


9

นี่เป็นปัญหาเล็กน้อย

มีเอนทิตีที่มีค่าวัตถุ ไม่ใช่ปัญหา. ฉันแทนที่วัตถุค่าสำหรับวัตถุใหม่จากนั้น nhibernate จะแทรกค่าใหม่และกำพร้าของเก่าแล้วลบทิ้ง ตกลงนั่นเป็นปัญหา

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

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

คุณจะแนะนำอะไรให้ฉันในกรณีนี้ วิธีที่ฉันเห็นมัน ValueObjects จะมีประโยชน์ก็ต่อเมื่อคุณต้องการสรุปแค็ปซูลกลุ่มของคอลัมน์ของตารางฐานข้อมูล (คอมโพเนนต์ใน nhibernate) ทุกอย่างที่มีรหัสการคงอยู่ในฐานข้อมูลจะดีกว่าถ้าจะให้เป็น Entity (ไม่จำเป็นต้องเป็น root รวม) เพื่อให้คุณสามารถอัปเดตสมาชิกโดยไม่ต้องสร้างกราฟวัตถุทั้งหมดใหม่โดยเฉพาะหากเป็นวัตถุที่ซ้อนกันลึก

คุณเห็นด้วยไหม นายอีแวนส์ได้รับอนุญาตให้มีวัตถุค่าที่ไม่แน่นอนหรือไม่? หรือเป็นค่าที่ไม่แน่นอนวัตถุผู้สมัครสำหรับนิติบุคคลหรือไม่

ขอบคุณ


2
มีสิ่งเช่น "วัตถุค่าที่ไม่แน่นอน" หรือไม่? ฉันมักจะมีวัตถุค่าการแสดงผลที่ไม่เปลี่ยนรูป
herby

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

คำตอบ:


8

ทุกอย่างที่มีเอกลักษณ์ควรจะเป็นกิจการและทุกอย่างที่ไม่ได้มีตัวตนเป็นค่าง่ายด้วยเหตุนี้วัตถุที่คุ้มค่า

เพื่ออ้าง Martin Fowler (ซึ่งในทางกลับกัน Eric อีแวนส์)

  • เอนทิตี:ออบเจ็กต์ที่มีตัวตนที่แตกต่างกันซึ่งทำงานตลอดเวลาและเป็นตัวแทนที่ต่าง คุณยังได้ยินสิ่งเหล่านี้เรียกว่า "วัตถุอ้างอิง"
  • ค่าวัตถุ:วัตถุที่มีความสำคัญเท่านั้นที่มีการรวมกันของคุณลักษณะของพวกเขา

เหตุผลที่ทำให้ที่อยู่ของคุณเป็นวัตถุที่มีคุณค่า:

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

รายการ MailingHistory เราจัดส่ง A764 ไปยังที่อยู่ 657อาจหมายถึงเราจัดส่งบทความ A764 ไปยังบอสตันเมื่อวานนี้และเราส่งบทความ A764 ไปยังนิวยอร์กในวันพรุ่งนี้

หากมีการเปลี่ยนแปลงที่อยู่ทางไปรษณีย์ไม่จำเป็นต้องลบที่อยู่เก่า ให้มันและทำเครื่องหมายว่าไม่ได้ใช้งานและเป็นคนใหม่ที่ใช้งานอยู่


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

หากคุณมั่นใจว่าสามารถมั่นใจได้ว่าการใช้ Entity นั้นเป็นไปได้


แต่ทางออกที่ดีที่สุด IMHO คือการไม่อ้างอิงที่อยู่ Entity ในประวัติการส่งจดหมาย แต่ควรบันทึกที่อยู่เฉพาะไว้ในตารางประวัติจดหมายของคุณโดยตรง (โดยทั่วไปการคัดลอกข้อมูลของที่อยู่)

ด้วยวิธีนี้คุณจะรู้ได้เสมอว่าคุณส่งสิ่งของของคุณไปที่ไหน (หรืออะไรก็ตามที่คุณส่งจดหมาย) และเนื่องจากคุณจะใช้ Entity ที่ไม่แน่นอนตารางที่อยู่ของคุณจึงไม่รก

ฉันทำงานกับ / ในระบบ ERP หลายระบบและเกือบทั้งหมดใช้วิธีนี้

คุณจะมีความซ้ำซ้อนในฐานข้อมูลของคุณ แต่เป็นวิธีที่ IMHO ใช้งานได้จริงมากที่สุด


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

@Timo "เข้าร่วมที่อยู่ใหม่ล่าสุด / โทรศัพท์ / อีเมล" ไม่ยากหากคุณทำข้อมูลของคุณให้ปกติเล็กน้อยเพียงแค่เพิ่มactive-flag แน่นอนคุณต้องแน่ใจว่าจะใช้and active = trueในการเข้าร่วมของคุณอยู่เสมอรักษาสถานะล่าสุดและเพิ่มความขัดแย้งลงในตารางของคุณเพื่อให้เช่นอีเมลเดียวเท่านั้นสำหรับลูกค้าแต่ละรายสามารถตั้งค่าสถานะนี้เป็นจริง
เฉื่อยชา

สิ่งนี้จะแนะนำปัญหาในการปิดการใช้งานก่อนหน้านี้ หากคุณได้แทนที่วัตถุที่อยู่ "ปัจจุบัน" ของอินสแตนซ์ในรหัสและคุณไปที่รหัสการเข้าถึงข้อมูลของคุณจะไม่ทราบว่า (1) ไม่ว่าจะมีที่อยู่ใหม่หรือไม่ (2) สิ่งที่อาจเกิดขึ้น หนึ่งคือ ดังนั้นทุกครั้งที่บันทึกการดำเนินการจะต้องทำบางสิ่งบางอย่างที่ซับซ้อนเช่น "ครั้งแรกที่ไปและที่อยู่ deactive ที่เกี่ยวข้องทั้งหมดในฐานข้อมูล" active=trueและจากนั้นให้บันทึกหนึ่งในปัจจุบันที่มี นี่ไม่ใช่สิ่งที่ฉันจะเรียกง่าย ๆ ซึ่งเป็นสาเหตุที่ฉันชอบทางออกของคุณ
Timo

2

ฉันเห็น 2 สิ่ง:

  1. การเปลี่ยนรหัสไปรษณีย์มีผลต่อการบันทึกประวัติหรือไม่ ฉันคิดว่ามันคงเป็นเหตุผลที่บันทึกประวัติชี้ไปยังที่อยู่เดิมที่ไม่เปลี่ยนแปลงดังนั้นคุณจึงรู้ว่าคุณส่งไปยังที่อยู่ผิด

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


2

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

อีแวนส์พูดว่า:

วัตถุที่ถูกกำหนดโดยตัวตนของมันนั้นเรียกว่าเอนทิตี


เพื่อความเข้าใจตัวตนโดเมนของฉันไม่มีอะไรเกี่ยวข้องกับการคงอยู่ของตัวตน ตามหนังสือของนายอีวาน
Pepito Fernandez

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

1
"วัตถุที่อยู่ ... มีตัวตนเป็นของตัวเอง" - คุณลักษณะใดของที่อยู่ที่ไม่ซ้ำกันที่ระบุ ไม่มีแอตทริบิวต์เดียวของที่อยู่ที่ไม่ซ้ำกัน แต่การรวมกันของแอตทริบิวต์ทำหน้าที่เป็นตัวตน นี่คือคำจำกัดความของวัตถุค่า
MattDavey

@ MattDavey: มันเป็นข้อสรุปที่ดี แต่ฉันสับสนเมื่อโทนี่บอกว่า "เราไม่ต้องการที่จะลบแถวเจ้าเพราะ PK ของที่อยู่นั้นคือ FK ในตาราง MailingHistory" นี่หมายความว่าวัตถุที่อยู่นั้นมีความหมายภายนอก 'ผู้ประกันตน' ด้วย สิ่งใดชี้ให้ฉันเห็นว่าวัตถุ 'ที่อยู่' ไม่ควรเป็น ValueObject คุณคิดอย่างไร?
Margabit

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