مجموعة من المكتبات لمساعدة المطورين على تنفيذ نماذج المجال بلغة 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 { /* ... */ }
عندما نأخذ اللغة الشاملة على محمل الجد، نريد أسماء (للفئات والأساليب وما إلى ذلك) تحتوي فقط على كلمات من لغة المجال. وهذا يعني أن عناوين العناصر الأساسية لا ينبغي أن تكون جزءًا من الأسماء. لذا، في المجال المصرفي، لا نريد BankAccountEntity
أو CurrencyVO
أو حتى AccountRepository
كأنواع. بدلاً من ذلك، نريد BankAccount
Currency
Accounts
- كما في المثال أعلاه.
ومع ذلك، نريد التعبير عن أن فئة معينة (أو أي عنصر معماري آخر) هي لبنة بناء خاصة؛ أي يستخدم نمط التصميم. توفر jMolecules مجموعة من التعليقات التوضيحية القياسية لوحدات البناء المعروفة من DDD.
كبديل للتعليقات التوضيحية المذكورة أعلاه، توفر jMolecules أيضًا مجموعة من الواجهات، تعتمد إلى حد كبير على الأفكار المقدمة في سلسلة John Sullivan "Advancing Enterprise DDD". إنها تسمح بالتعبير عن العلاقات بين الكتل البرمجية الإنشائية مباشرة داخل نظام الكتابة، بحيث يمكن للمترجم المساعدة في التحقق من صحة النموذج ويمكن أيضًا معالجة المعلومات عن طريق انعكاس 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
- نكهة jmolecules-ddd
المستندة إلى Kotlin للتخفيف من مشكلات التشغيل المتداخل لـ 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 وكتل بناء 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