DDD กับ ORM ตรรกะทางธุรกิจควรไปที่ใด


10

ฉันเคยใช้เครื่องมือ MDA (สถาปัตยกรรมที่ขับเคลื่อนด้วยโมเดล) ในอดีตที่เราทำโมเดลผ่าน UML และสิ่งนี้ได้สร้างเอนทิตีธุรกิจ (โมเดลโดเมนของเรา) และ ORM (การทำแผนที่ ฯลฯ ) ท่ามกลางสิ่งอื่น ๆ

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

อย่างไรก็ตามตอนนี้ฉันกำลังเริ่มโครงการและฉันต้องการคิดในแง่ของ DDD

จนถึงตอนนี้ฉันรู้สึกราวกับว่าฉันวางตรรกะทางธุรกิจของฉันในรูปแบบโดเมนของฉันและผ่านที่เก็บฉันจะทำงานร่วมกับ ORM (ซึ่งฉันเคยเลือก) อย่างไรก็ตามถ้าฉันต้องการใช้เครื่องมือ MDA สำหรับส่วน ORM ของแอปพลิเคชันต่อไปโมเดลที่สร้างขึ้นที่นี่จะเป็นโลหิตจางมาก (เช่นไม่มีตรรกะทางธุรกิจ) ในทำนองเดียวกันถ้าฉันใช้ Entity framework (.net) หรือ NHibernate สำหรับ ORM ของฉันมันก็จะเป็นแบบจำลองโลหิตจางด้วย? ฉันไม่แน่ใจว่าคุณจะใช้ตรรกะทางธุรกิจที่ใดถ้าฉันใช้ NHibernate

ฉันถูกต้องในการคิดแบบนี้ในคำอื่น ๆ ที่มี DDD ตรรกะทางธุรกิจทั้งหมดในโดเมนและเพียงแค่ใช้ ORM สำหรับการคงอยู่ผ่านทางที่เก็บ?

คำตอบ:


12

ดังนั้นจึงเป็นไปไม่ได้ที่จะเปลี่ยนไปใช้ ORM อื่น (ไม่ใช่ที่เราต้องการ))

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

จนถึงตอนนี้ฉันรู้สึกราวกับว่าฉันวางตรรกะทางธุรกิจของฉันในรูปแบบโดเมนของฉันและผ่านที่เก็บฉันจะทำงานร่วมกับ ORM (ซึ่งฉันเคยเลือก) อย่างไรก็ตามถ้าฉันต้องการใช้เครื่องมือ MDA สำหรับส่วน ORM ของแอปพลิเคชันต่อไปโมเดลที่สร้างขึ้นที่นี่จะเป็นโลหิตจางมาก (เช่นไม่มีตรรกะทางธุรกิจ) ในทำนองเดียวกันถ้าฉันใช้ Entity framework (.net) หรือ NHibernate สำหรับ ORM ของฉันมันก็จะเป็นแบบจำลองโลหิตจางด้วย? ฉันไม่แน่ใจว่าคุณจะใช้ตรรกะทางธุรกิจที่ใดถ้าฉันใช้ NHibernate

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

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

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

ฉันถูกต้องในการคิดแบบนี้ในคำอื่น ๆ ที่มี DDD ตรรกะทางธุรกิจทั้งหมดในโดเมนและเพียงแค่ใช้ ORM สำหรับการคงอยู่ผ่านทางที่เก็บ?

ส่วนใหญ่คุณถูกต้อง คุณควรมีรูปแบบโดเมนที่หลากหลาย โดยเฉพาะอย่างยิ่งเมื่อสิ่งต่าง ๆ มีความซับซ้อนมากขึ้นมันจะง่ายต่อการบำรุงรักษาและยืดเวลาเมื่อคุณออกแบบอย่างเหมาะสม แต่โปรดทราบว่า DDD ยังรู้ (Domain Layer และ Application Layer) บริการเพื่อใช้ตรรกะทางธุรกิจและโรงงานเพื่อห่อหุ้มตรรกะการสร้าง

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


2
+1: ฉันยังแยกชั้นตรรกะของโดเมนออกจากชั้นตรรกะของแอปพลิเคชัน ฉันใส่ข้อมูล ORM และฐานข้อมูลทั้งหมดลงในเลเยอร์ตรรกะของโดเมน ชั้นตรรกะของแอปพลิเคชันไม่รู้อะไรเลยเกี่ยวกับ ORM ธุรกรรมและสิ่งต่าง ๆ : มันเห็นแค่คลาสตรรกะทางธุรกิจและเรียกวิธีการของพวกเขา ฉันพบว่าวิธีการนี้มีประสิทธิภาพมากในการมีชั้นตรรกะแอปพลิเคชันที่เรียบง่ายและสะอาดยิ่งขึ้น
Giorgio

@ Falcon: ขอบคุณสำหรับข้อมูล เมื่อฉันพูดถึงรูปแบบของโลหิตจางสิ่งที่ฉันหมายถึงคือถ้าฉันสร้างโดเมนโดยใช้ DDD รุ่นหนึ่งของที่เก็บของฉันอาจเป็นรุ่น mda ที่ฉันจะย้ายเอนทิตีของฉันไปยังเอนทิตี mda (เช่นรูปแบบของโรคโลหิตจาง) ในการทำธุรกรรม ฯลฯ สิ่งนี้จะโอเคไหม ฉันสงสัยว่าฉันจะใช้เครื่องมือ MDA แต่เพียงพยายามที่จะเข้าใจว่าฉันจะทำได้อย่างไรถ้าฉันต้องการ เสียงนี้ใช่ไหม
JD01

@ JD01: ฉันไม่ค่อยเข้าใจคุณ แต่ดูเหมือนว่าคุณต้องการเปลี่ยนเอนทิตีโมเดลโดเมนเพื่อให้คุณสามารถคงไว้ได้อย่างง่ายดาย มันค่อนข้างเหมือนกับการใช้ DTO และ automapper (google it) อาจเป็นเครื่องมือที่มีประโยชน์สำหรับงานดังกล่าว วิธีการดังกล่าวไม่จำเป็นต้องแทรกแซงแนวทางปฏิบัติที่ดีที่สุดของ DDD ท้ายที่สุดแล้วที่เก็บมีไว้เพื่อซ่อน Data Access Logic คุณสามารถเปลี่ยนวัตถุธุรกิจของคุณให้กลายเป็น MDA DTO จากนั้นยืนยันและผู้ใช้ API จะไม่สังเกตเห็น ฉันคิดว่าไม่เป็นไร
Falcon

1
@ JD01: ฉันขอแนะนำให้คุณดูที่ลิงค์ต่อไปนี้เพื่อดูว่ามีจาวา Enterprise Enterprise จำนวนเท่าใด โดยพื้นฐานแล้วพวกเขามี DAO, DTO และ BO (วัตถุทางธุรกิจ) สำหรับฉันมันเป็นเลเยอร์มากเกินไป แต่การออกแบบก็โอเค java.sun.com/blueprints/corej2eepatterns/Patterns/…
Falcon

@ เหยี่ยว: ใช่ฉันกำลังคิดตามแนวของ DTO ที่เป็นวัตถุ MDA ของฉันไม่ใช่ว่าฉันจะไปทางนั้น เพิ่งเข้าใจสิ่งที่แต่ละส่วนของเครื่องเล่น DDD d0 ขอบคุณอีกครั้ง
JD01

3

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

ฉันไม่ทราบว่าเครื่องมือ MDA ใดที่คุณใช้ แต่คนที่ฉันเคยทำงานด้วยมักจะสร้างคลาสบางส่วนเพื่อให้คุณมีอิสระในการดำเนินการกับตรรกะทางธุรกิจให้มากที่สุดเท่าที่คุณต้องการ

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

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

นอกเหนือจากนั้นฉันคิดว่า Falcon บอกว่ามันไม่มีอะไรแน่นอนในเครื่องมือ ORM หรือ MDA ที่ป้องกันไม่ให้คุณมีเอนทิตีโดเมนที่หลากหลาย


สวัสดีฉันกำลังใช้ ECO (ออบเจกต์แกนองค์กร) จากที่มีความสามารถobjects.comและเป็นไปตามที่คุณอธิบายไว้
JD01

1

สิ่งที่ฉันทำในทีมคือการสร้างแบบจำลองวัตถุโดเมนและเพิ่มตรรกะทางธุรกิจของฉันในเวลาเดียวกัน ฉันไม่ได้ใช้การพัฒนาแบบจำลองที่ขับเคลื่อนด้วยซึ่งจะสร้างรหัสจากแบบจำลอง แต่ต้องการวิธีการเพิ่มความคิดเห็น ฉันหมายถึงว่าที่ระดับวัตถุในแผนภาพคลาสฉันเพิ่มแบบแผน ORM สิ่งนี้จะเพิ่มคำอธิบายประกอบแบบติดตาโดยตรงในรหัสที่เข้ากันได้กับ EJB3 / hibernate การสร้างฐานข้อมูลจะดำเนินการโดย Hibernate และไม่ใช่โดยเทมเพลต UML สิ่งนี้ดีกว่ามากเพราะหากการเปลี่ยนแปลงรหัสและคำอธิบายประกอบที่เพิ่มไม่ตรงกับสิ่งที่ผู้เชี่ยวชาญจำศีลเขา / เธอสามารถเปลี่ยนได้ แต่รูปแบบยังดีอยู่ ฉันสามารถเปลี่ยนข้อกำหนดของฉันและแบบจำลองโดเมนของฉันก็ยังใช้ได้

นักพัฒนาสามารถเพิ่มตรรกะทางธุรกิจภายในแต่ละวิธีและเพิ่มความคิดเห็นฉันยังสามารถสร้างแบบจำลองและเพิ่มข้อ จำกัด ตัวอย่างเช่นยอดขายควรมากกว่า 50k หากไม่ใช่ ฯลฯ .... ฉันไม่จำเป็นต้องใช้รหัส แต่เพียงเขียนในโมเดลและข้อมูลนี้จะปรากฏต่อทีมนักพัฒนา UML ที่เท่ห์และยืดหยุ่นจริงๆ

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