GO-DDD: قالب تصميم مدفوع بالمجال في Golang
مرحبًا بك في go-ddd ، مستودع تنفيذ/قالب مرجعي يوضح نهج التصميم المدفوع بالمجال (DDD) في Golang. يهدف هذا المشروع إلى مساعدة المطورين والمهندسين المعماريين على فهم بنية DDD ، وخاصة في سياق GO ، وكيف يمكن أن يؤدي إلى قواعد الكود الأنظف ، والأكثر قابلية للصيانة ، وقابلة للتطوير.
ملخص
يعد التصميم الذي يحركه المجال منهجية ونمط تصميم يستخدم لإنشاء برامج مؤسسة معقدة من خلال توصيل التنفيذ بنموذج متطور. تعرض go-ddd هذا عن طريق إنشاء سوق بسيط حيث يمكن Sellers بيع Products .
لماذا DDD؟
- اللغة في كل مكان : تعزز لغة مشتركة بين المطورين وأصحاب المصلحة.
- عزل منطق المجال : منطق المجال منفصل عن طبقات البنية التحتية والتطبيق ، مما يعزز المبادئ الصلبة.
- قابلية التوسع : يتيح انتقالات بنية الخدمات الصغيرة.
هيكل المستودع

-
domain : قلب البرنامج ، الذي يمثل منطق الأعمال والقواعد.-
entities : الأشياء الأساسية داخل نظامنا ، مثل Product Seller . يحتوي على منطق التحقق الأساسي.
-
application : يحتوي على عمليات محددة لحالة الاستخدام التي تتفاعل مع طبقة المجال. -
infrastructure : تدعم الطبقات العليا مع القدرات الفنية مثل الوصول إلى قاعدة البيانات.-
db : الوصول إلى قاعدة البيانات والنماذج. -
repositories : التطبيقات الملموسة لاحتياجات التخزين لدينا.
-
interface : الطبقة الخارجية التي تتفاعل مع العالم الخارجي ، مثل نقاط نهاية API.-
api/rest : معالجات أو وحدات تحكم لإدارة طلبات HTTP والاستجابات.
مبادئ أخرى
- اِختِصاص
- يجب ألا تعتمد على طبقات أخرى.
- يوفر البنية التحتية مع واجهات ، ولكن يجب عدم الوصول إلى البنية التحتية.
- ينفذ منطق العمل والقواعد.
- ينفذ عمليات التحقق على الكيانات. يتم تمرير الكيانات التي تم التحقق من صحتها إلى طبقة البنية التحتية.
- تحدد طبقة المجال الافتراضية للكيانات (مثل UUID للمعرف أو الطابع الزمني لإنشاء). لا تقم بتعيين الافتراضات في طبقة البنية التحتية أو حتى قاعدة البيانات!
- لا تسرب الكائنات المجال إلى العالم الخارجي.
- طلب
- رمز الغراء بين المجال وطبقة البنية التحتية.
- بنية تحتية
- المستودعات مسؤولة عن ترجمة كيان المجال إلى نموذج قاعدة البيانات واسترداده. لا يتم تنفيذ منطق العمل هنا.
- ينفذ واجهات محددة بواسطة طبقة المجال.
- ينفذ منطق الثبات مثل الوصول إلى قاعدة بيانات Postgres أو MySQL.
- عند الكتابة إلى التخزين ، اقرأ البيانات المكتوبة قبل إعادتها. هذا يضمن أن البيانات مكتوبة بشكل صحيح.
أفضل الممارسات
- لا تُرجع الكيانات التي تم التحقق من صحتها من طرق القراءة في المستودع. بدلاً من ذلك ، أعد نوع كيان المجال مباشرة.
- قد تتغير عمليات التحقق في المستقبل ، ولا ترغب في تغيير جميع البيانات في قاعدة البيانات الخاصة بك.
- خلاف ذلك ، لن تتمكن من قراءة البيانات من قاعدة البيانات التي تمت كتابتها مع منطق التحقق من الصحة المختلفة.
- لا تضع القيم الافتراضية (على سبيل المثال الطابع الزمني الحالي أو المعرف) في قاعدة البيانات. اضبطها في طبقة المجال (المصنع!) لعدة أسباب:
- من الخطير للغاية أن يكون لديك مصدران للحقيقة.
- من الأسهل اختبار طبقة المجال.
- يمكن استبدال قواعد البيانات ، ولا ترغب في تغيير كل القيم الافتراضية.
- اقرأ دائمًا الكيان بعد الكتابة في طبقة البنية التحتية.
- هذا يضمن كتابة البيانات بشكل صحيح ، ونحن لا نعمل أبدًا على بيانات قديمة.
-
find vs get :-
find طرق يمكن أن تعيد NULL أو قائمة فارغة. -
get الأساليب يجب إرجاع القيمة. إذا لم يتم العثور على القيمة ، رمي خطأ.
- الحذف: استخدم دائمًا الحذف الناعم. قم بإنشاء عمود
deleted_at في قاعدة البيانات الخاصة بك وقم بتعيينه على الطابع الزمني الحالي عند حذف الكيان. بهذه الطريقة ، يمكنك دائمًا استعادة الكيان إذا لزم الأمر.
ابدء
- استنساخ هذا المستودع:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
مساهمات
المساهمات والقضايا وطلبات الميزات مرحب بها! لا تتردد في التحقق من صفحة المشكلات.
رخصة
موزعة تحت رخصة معهد ماساتشوستس للتكنولوجيا. انظر الترخيص لمزيد من المعلومات.