ฉันขอแนะนำให้ทำไม่
การพยายามบังคับใช้เลเยอร์ทางเทคนิคพร้อมโครงสร้างแพ็กเกจนำไปสู่ความยุ่งเหยิงมากมายในแอปพลิเคชันของคุณ ไม่ต้องพูดถึงความจริงที่ว่าเราพยายามอย่างหนักเพื่อที่ซ่อนอยู่เบื้องหลังทุกอย่างที่มีอินเตอร์เฟซการบริการและสิ่งแรกที่เราทำ (ส่วนใหญ่เนื่องจากการบรรจุภัณฑ์) public class
คือการทำทุกอย่าง สิ่งนี้จะเจ็บปวดเมื่อมีการแยกทางเทคนิคระหว่าง a x.y.z.service
และx.y.z.repository
แพ็คเกจตอนนี้ทุกอย่างสามารถเข้าถึงที่เก็บได้ บูมมีการห่อหุ้มของคุณภายในเลเยอร์บริการ
แต่คุณควรปฏิบัติตามแนวทางการทำงานและหัวหอมมากขึ้น ( สถาปัตยกรรมสะอาด , สถาปัตยกรรมหกเหลี่ยม ) สิ่งนี้สอดคล้องกับหลักการความรับผิดชอบเดี่ยว (เมื่อใช้กับแพ็คเกจ) และสอดคล้องกับหลักการบรรจุภัณฑ์
- สิ่งที่เปลี่ยนแปลงด้วยกันจะถูกรวมเข้าด้วยกัน
- สิ่งที่ใช้ร่วมกันจะถูกรวมเข้าด้วยกัน
Oliver Gierke ได้เขียนบทความที่ดีเกี่ยวกับส่วนประกอบบรรจุภัณฑ์เข้าด้วยกันใน Java Simon Brown ได้เขียนเรื่องทั่วไปมากขึ้นในเรื่อง
ฉันจะพยายามหาโครงสร้างแพ็คเกจหลักดังต่อไปนี้เพื่อเก็บแกนของแอปพลิเคชันของคุณ:
x.y.z.area1
x.y.z.area2
ตอนนี้ถ้าคุณมีเว็บอินเตอร์เฟสที่คุณเพิ่มตัวอย่างเช่นweb
subpackage สำหรับเว็บเซอร์วิซws
หรือrest
แพ็คเกจเพื่อเก็บไว้เท่านั้น มันเชื่อมต่อกับแกนกลางเป็นหลัก
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
ตอนนี้คุณสามารถลองนำวัตถุจากภายในแกนของคุณกลับมาใช้เป็นเลเยอร์อื่นได้ แต่ IMHO จะเป็นการดีกว่าถ้าใช้โดเมนเฉพาะสำหรับเลเยอร์นั้น เช่นเดียวกับการแมป Object to SQL มี (ไม่บ่อย) ในสิ่งที่เราต้องการแสดงบนหน้าจอหรือใช้เป็น XML ในเว็บเซอร์วิซและวิธีการใช้ตรรกะทางธุรกิจ ทั้งนี้ขึ้นอยู่กับความซับซ้อนของธุรกิจและเว็บโดเมนที่คุณอาจคิดว่าพวกเขาเป็นโดเมนปัญหาแยกที่จะแก้ปัญหาซึ่งจะต้องมีการเชื่อมต่อโดยทั่วไป 2 ที่แตกต่างกันบริบทล้อมรอบ
หากต้องการใช้เครื่องหมายคำพูดจากทรัพยากร CQRS
ไม่สามารถสร้างโซลูชันที่ดีที่สุดสำหรับการค้นหาการรายงานและการประมวลผลธุรกรรมโดยใช้แบบจำลองเดียว
อย่าพยายามวางทุกสิ่งไว้ในรูปแบบเดียว (โดเมน) แยกความรับผิดชอบออกจากกัน คุณอาจจบลงด้วยคลาสที่เล็กกว่า แต่มีการแบ่งแยกที่ชัดเจนระหว่างเลเยอร์ของแอปพลิเคชันของคุณ
หมายเหตุสุดท้าย
โปรดจำไว้ว่าการสร้างสถาปัตยกรรมกำลังตัดสินใจเกี่ยวกับการแลกเปลี่ยนโซลูชันหนึ่งไปยังอีกโซลูชันหนึ่ง ขึ้นอยู่กับความซับซ้อนของโดเมนเป็นหลักและควรได้รับแรงผลักดันจากข้อกำหนดการทำงานของแอปพลิเคชันของคุณเป็นหลัก อย่างไรก็ตามมันได้รับอิทธิพลจากข้อ จำกัด ด้านประสิทธิภาพ, ความปลอดภัยและสิ่งแวดล้อม (ภาษาที่ใช้, แพลตฟอร์ม, ประสบการณ์) และสถาปัตยกรรมเช่นเดียวกับการเขียนโค้ดไม่เคยทำข้อกำหนดใหม่ให้เสร็จสมบูรณ์แต่ละข้อ (และอาจจะควร) นำไปสู่การออกแบบแอปพลิเคชันใหม่
คำปฏิเสธ
ใช่ฉันพยายามใส่ทุกอย่างไว้ในแบบจำลองเดียวและใช่ฉันยังพยายามใช้การแยกทางเทคนิคในแอปพลิเคชันของฉันด้วย อย่างไรก็ตามหลังจากสองสามปีของประสบการณ์ในการสร้าง layering แอพพลิเคชั่นที่ยุ่งเหยิง (ตอนแรกมันเป็นความคิดที่ดีจากนั้นแอพพลิเคชั่นก็เริ่มที่จะเติบโต ... ) ฉันคิดว่าต้องมีวิธีอื่น
การเชื่อมโยง
- สถาปัตยกรรมสะอาดลุงบ็อบมาร์ติน
- สถาปัตยกรรมหกเหลี่ยม (อาคาพอร์ตและอะแดปเตอร์), Alistair Cockburn
- โอลิเวอร์ Gierke ของฉันไปทางไหน
- หลักการของ OOD ลุง Bob Martin
- ข้อผิดพลาดเมื่อใช้ DDD, Udi Dahan
- บริบทที่ถูก จำกัด มาร์ตินฟาวเลอร์
- สไตล์การเข้ารหัสที่เห็นได้ชัดในเชิงสถาปัตยกรรม, Simon Brown
หนังสือ
- การพัฒนาซอฟต์แวร์เชิงวัตถุนำโดยการทดสอบ
- Java Application Architecture: รูปแบบ Modularity พร้อมตัวอย่างโดยใช้ OSGi (Robert C. Martin Series)
- การออกแบบที่ขับเคลื่อนด้วยโดเมน: การแก้ปัญหาความซับซ้อนในใจกลางของซอฟต์แวร์
- สถาปัตยกรรมซอฟต์แวร์สำหรับนักพัฒนา
- การใช้การออกแบบโดเมนขับเคลื่อน