ฉันควรใส่ตรรกะการคำนวณใน Entity หรือในเลเยอร์ธุรกิจหรือไม่


15

เมื่อเร็ว ๆ นี้ฉันได้พบกับคำถามเกี่ยวกับการคำนวณอย่างง่าย ๆ ที่ควรจะใส่ใน Entity layer หรือ Entity นั้นบริสุทธิ์สำหรับการเก็บข้อมูลดิบและทิ้ง logics การคำนวณไว้ในชั้นธุรกิจ

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

คำตอบ:


21

ขึ้นอยู่กับประเภทของสถาปัตยกรรมที่คุณต้องการ

  • ในการออกแบบโดเมนขับเคลื่อนคุณจะสร้างรูปแบบโดเมนที่จะมีทั้งข้อมูลและฟังก์ชันการทำงาน

นี้จะหมายถึงว่าOrderมีคุณสมบัติ (หรือวิธีการ) OrderLinesที่จะกลับราคารวมของการสั่งซื้อขึ้นอยู่กับ Orderก็จะมีวิธีการAddOrderItem(Product product, int amount)และOrderจะตรวจสอบว่ามีอยู่แล้วOrderLineสำหรับผลิตภัณฑ์เฉพาะที่

ในรูปแบบดังกล่าวคุณจะมีวัตถุที่ไม่ใช่เอนทิตีจริงเช่นRepositoryสำหรับการเข้าถึงข้อมูลหรือFactoryสำหรับการสร้างเอนทิตี เหล่านี้เรียกว่าบริการโดเมน Application Layer มีหน้าที่เรียก Domain Services (ตัวอย่างเช่นการดึงเอนทิตีจากฐานข้อมูล) จากนั้นจะทำการใช้งานฟังก์ชันในเอนทิตี Application Layerควรจะเป็นบางที่สุดเท่าที่ทำได้

นี่เป็นบทความที่ดีเกี่ยวกับ DDDซึ่งอธิบายแนวคิดเหล่านี้อย่างละเอียดยิ่งขึ้น

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

มีความคิดเห็นที่แตกต่างกันไม่ว่าจะเป็น Anemic Domain Model เป็นสิ่งที่ไม่ดี ส่วนตัวฉันชอบรูปแบบโดเมนจริง

บทความนี้อธิบายความแตกต่างระหว่างแบบจำลองโดเมน Anemic และแบบที่ไม่ใช่ Anemic


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

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

สำหรับ DDD จะเป็นอย่างไรถ้าตรรกะการคำนวณราคามีความซับซ้อน? ตัวอย่างเช่นราคาขึ้นอยู่กับสถานที่ (ภาษี) ข้อมูลผู้ใช้ (ส่วนลดวันเกิดส่วนลดสมาชิก) คูปองบัตรเครดิต (ส่วนลดพิเศษบัตรเครดิต) ฯลฯ เราจะวางตรรกะดังกล่าวไว้ในOrderชั้นเรียนได้อย่างไร
Sher10ck

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

โลหิตจาง ... อาณาเขตที่ไม่ดีฟังดูเหมือนว่ามันกำลังทุกข์ทรมานจากความเจ็บป่วย คุณไม่อยากถูกขับเคลื่อนหรือไม่! ใช่
Matt Jenkins

1

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

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

สิ่งสำคัญที่ต้องจำคือเอนทิตีจะมีตัวตนอยู่เสมอ แต่วัตถุทางธุรกิจนั้นเป็นเอนทิตีที่ไม่มีการระบุตัวตน ตัวอย่างผลิตภัณฑ์เป็นนิติบุคคล แต่เงินจะไม่มีตัวตน 1,000 อินสแตนซ์ที่แตกต่างกันของเงินจะเหมือนกัน


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