ชุดไลบรารีที่จะช่วยให้นักพัฒนานำโมเดลโดเมนไปใช้ใน Java เก่าธรรมดาที่ปราศจากสิ่งรบกวน
แสดงแนวคิดทางสถาปัตยกรรมอย่างชัดเจนเพื่อให้การอ่านและเขียนโค้ดง่ายขึ้น
รักษาโค้ดเฉพาะโดเมนให้ปราศจากการพึ่งพาทางเทคนิค ลดรหัสสำเร็จรูป
สร้างเอกสารประกอบและตรวจสอบโครงสร้างการใช้งานและสถาปัตยกรรมของคุณโดยอัตโนมัติ
ทำให้ชีวิตของนักพัฒนาง่ายขึ้น
แสดงว่าโค้ดชิ้นหนึ่ง (แพ็คเกจ คลาส หรือเมธอด) นำแนวคิดทางสถาปัตยกรรมไปใช้
ทำให้เป็นเรื่องง่ายสำหรับผู้อ่านที่เป็นมนุษย์ในการพิจารณาว่าโค้ดที่กำหนดเป็นแนวคิดทางสถาปัตยกรรมประเภทใด
อนุญาตให้รวมเครื่องมือ:
การเพิ่มรหัส (ตัวอย่างเครื่องมือ: ByteBuddy พร้อมการรวม Spring และ JPA)
ตรวจสอบกฎทางสถาปัตยกรรม (ตัวอย่างเครื่องมือ: jQAssistant, ArchUnit)
ตัวอย่าง: โดเมนธนาคาร
import org . jmolecules . ddd . annotation .*;
@ Entity
class BankAccount {
@ Identity
final IBAN iban ;
/* ... */
}
@ ValueObject
class IBAN { /* ... */ }
@ ValueObject
record Currency { /* ... */ }
@ Repository
class Accounts { /* ... */ }
เมื่อเราถือว่า Ubiquitous Language เป็นเรื่องจริงจัง เราต้องการชื่อ (สำหรับคลาส วิธีการ ฯลฯ) ที่มีเฉพาะคำจากภาษาโดเมนเท่านั้น นั่นหมายความว่าชื่อของแบบเอกสารสำเร็จรูปไม่ควรเป็นส่วนหนึ่งของชื่อ ดังนั้นในโดเมนการธนาคาร เราไม่ต้องการให้ BankAccountEntity
, CurrencyVO
หรือแม้แต่ AccountRepository
เป็นประเภท แต่เราต้องการ BankAccount
, Currency
และ Accounts
แทน เหมือนในตัวอย่างด้านบน
ถึงกระนั้น เราต้องการแสดงให้เห็นว่าคลาสที่กำหนด (หรือองค์ประกอบทางสถาปัตยกรรมอื่นๆ) นั้นเป็นแบบเอกสารสำเร็จรูปพิเศษ คือใช้รูปแบบการออกแบบ jMolecules จัดเตรียมชุดคำอธิบายประกอบมาตรฐานสำหรับ Building Block ที่รู้จักจาก DDD
นอกเหนือจากคำอธิบายประกอบที่กล่าวมาข้างต้น jMolecules ยังมีชุดอินเทอร์เฟซ ซึ่งส่วนใหญ่อิงตามแนวคิดที่นำเสนอในซีรีส์ "Advancing Enterprise DDD" ของ John Sullivan ช่วยให้สามารถแสดงความสัมพันธ์ระหว่าง Building Block ภายในระบบประเภทได้ เพื่อให้คอมไพเลอร์สามารถช่วยตรวจสอบความถูกต้องของโมเดล และข้อมูลสามารถประมวลผลโดยการสะท้อนกลับของ Java ได้ง่ายขึ้น
Identifier
— ประเภทที่ใช้แทนประเภทที่ควรทำหน้าที่เป็นตัวระบุ
Identifiable<ID>
— สิ่งใดก็ตามที่เปิดเผยตัวระบุ
Entity<T extends AggregateRoot<T, ?>, ID> extends Identifiable<ID>
— เอนทิตีที่ประกาศว่า AggregateRoot
นั้นเป็นของใดและตัวระบุใดที่เปิดเผย
AggregateRoot<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Entity<T, ID>
- รูทรวมที่เป็น Entity
ที่เป็นของตัวเองซึ่งเปิดเผย Identifier
ระบุเฉพาะ
Association<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Identifiable<ID>
— การเชื่อมโยงที่ชัดเจนกับเป้าหมาย AggregateRoot
ข้อตกลงนี้ให้คำแนะนำในการสร้างแบบจำลองและช่วยให้ตรวจสอบกฎต่อไปนี้ได้อย่างง่ายดาย โดยอาจผ่านการไตร่ตรอง:
ประเภทตัวระบุเฉพาะที่บังคับใช้ต่อการรวม เพื่อหลีกเลี่ยงตัวระบุสำหรับการรวมที่แตกต่างกันปะปนกัน
AggregateRoot
ต้องอ้างอิงถึง Entity
ที่ได้รับการประกาศว่าเป็นของเอนทิตีเท่านั้น
AggregateRoot
และ Entity
ต้องอ้างอิงถึง AggregateRoots
อื่นๆ ผ่านอินสแตนซ์ Association
เท่านั้น
สำหรับการตรวจสอบอัตโนมัติและการรวมเทคโนโลยีรันไทม์ โปรดดูการรวม jMolecules
jmolecules-ddd
- คำอธิบายประกอบและอินเทอร์เฟซเพื่อแสดงบล็อคการสร้าง DDD (วัตถุค่า เอนทิตี รูตรวม ฯลฯ) ในโค้ด
jmolecules-events
- คำอธิบายประกอบและอินเทอร์เฟซเพื่อแสดงแนวคิดของเหตุการณ์ในโค้ด
kmolecules-ddd
— รสชาติที่ใช้ Kotlin ของ jmolecules-ddd
เพื่อลดปัญหาการทำงานร่วมกันของ Kotlin/Java สำหรับโมเดลตามประเภท
jMolecules ให้คำอธิบายประกอบเพื่ออธิบายแนวคิดสถาปัตยกรรมระดับสูงกว่าตามสไตล์ของสถาปัตยกรรมแบบชั้น หัวหอม และหกเหลี่ยม ช่วยให้คุณสามารถทำเครื่องหมายแพ็คเกจทั้งหมดเป็นเลเยอร์ วงแหวน หรือแพ็คเกจที่มีพอร์ตและอะแดปเตอร์ สิ่งเหล่านี้จะปรากฏในไฟล์ package-info.java
สำหรับแต่ละแพ็คเกจที่คุณต้องการใส่คำอธิบายประกอบ เช่น:
package-info.java
สำหรับเลเยอร์โดเมน: @ DomainLayer
package org . acmebank . domain ;
import org . jmolecules . architecture . layered .*;
package-info.java
สำหรับเลเยอร์แอปพลิเคชัน: @ ApplicationLayer
package org . acmebank . application ;
import org . jmolecules . architecture . layered .*;
ด้วยวิธีนี้ คลาสทั้งหมดในแพ็คเกจที่เกี่ยวข้องจะถือว่าเป็นส่วนหนึ่งของเลเยอร์ วงแหวน หรือตัวเชื่อมต่อที่มีคำอธิบายประกอบ หรือถือเป็นพอร์ต / อะแดปเตอร์
อีกทางหนึ่ง คลาสสามารถใส่คำอธิบายประกอบได้โดยตรง:
import org . jmolecules . architecture . layered .*;
@ DomainLayer
@ Entity
public class BankAccount { /* ... */ }
@ ApplicationLayer
@ Service
public class TransferMoney { /* ... */ }
ปัจจุบัน คำอธิบายประกอบสำหรับสถาปัตยกรรมแบบเลเยอร์ หัวหอม และหกเหลี่ยมมีอยู่จริง
jmolecules-architecture
- คำอธิบายประกอบเพื่อแสดงรูปแบบสถาปัตยกรรมในโค้ด
jmolecules-cqrs-architecture
- สถาปัตยกรรม CQRS
@Command
@CommandDispatcher
@CommandHandler
@QueryModel
jmolecules-layered-architecture
- สถาปัตยกรรมแบบเลเยอร์
@DomainLayer
@ApplicationLayer
@InfrastructureLayer
@InterfaceLayer
jmolecules-onion-architecture
- สถาปัตยกรรมหัวหอม
คลาสสิค
@DomainModelRing
@DomainServiceRing
@ApplicationServiceRing
@InfrastructureRing
ประยุกต์ (ไม่แยกโมเดลโดเมนและบริการ)
@DomainRing
@ApplicationRing
@InfrastructureRing
jmolecules-hexagonal-architecture
- สถาปัตยกรรมหกเหลี่ยม
@Application
@(Primary|Secondary)Adapter
@(Primary|Secondary)Port
คำอธิบายประกอบและอินเทอร์เฟซ jMolecules สามารถใช้เพื่อสร้างโค้ดทางเทคนิคที่จำเป็นในการแสดงแนวคิดในเทคโนโลยีเป้าหมายบางอย่าง
การรวม Spring, Data JPA, Data MongoDB, Data JDBC และ Jackson — เพื่อทำให้โค้ดที่ใช้คำอธิบายประกอบ jMolecules ทำงานนอกกรอบในเทคโนโลยีเหล่านั้น
แนวคิด jMolecules ที่แสดงเป็นโค้ดสามารถใช้เพื่อตรวจสอบกฎที่เกิดจากคำจำกัดความของแนวคิดและสร้างเอกสารประกอบ
ปลั๊กอิน jQAssistant — เพื่อตรวจสอบกฎที่ใช้กับรูปแบบสถาปัตยกรรมที่แตกต่างกัน, โครงสร้าง DDD, CQRS และเหตุการณ์ต่างๆ ยังสร้างไดอะแกรม PlantUML จากข้อมูลที่มีอยู่ในโค้ดเบส
กฎ ArchUnit — อนุญาตให้ตรวจสอบความสัมพันธ์ระหว่างบล็อคการสร้าง DDD
Spring Modulith — รองรับการตรวจจับส่วนประกอบ jMolecules, Building Block และเหตุการณ์ DDD สำหรับโมเดลโมดูลและวัตถุประสงค์ด้านเอกสารประกอบ (ดูเอกสารประกอบ Spring Modulith สำหรับข้อมูลเพิ่มเติม)
หากต้องการใช้ jMolecules ในโปรเจ็กต์ของคุณ เพียงแค่ประกาศการพึ่งพา ไบนารีที่วางจำหน่ายมีให้จากพื้นที่เก็บข้อมูลส่วนกลางของ Maven เพื่อหลีกเลี่ยงการต้องประกาศทุกเวอร์ชันอย่างชัดเจน เราขอแนะนำให้ใช้ jmolecules-bom
ในส่วนการจัดการการพึ่งพาของคุณ
< dependency >
< groupId >org.jmolecules</ groupId >
< artifactId >jmolecules-ddd</ artifactId >
< version >1.9.0</ version >
</ dependency >
repositories {
mavenCentral()
}
dependencies {
implementation( " org.jmolecules:jmolecules-ddd:1.9.0 " )
}
mvn release:prepare -DscmReleaseCommitComment="$ticketId - Release version $version." -DscmDevelopmentCommitComment="$ticketId - Prepare next development iteration."
mvn release:perform -Dgpg.keyname=$keyname