التصميم المدفوع بالمجال.
نهج في تطوير البرمجيات يضع نموذجًا غنيًا لمجال الأعمال في صميم التصميم، معبَّرًا عنه بلغة مشتركة بين المهندسين وخبراء المجال.
##Intent
معالجة التعقيد في قلب البرمجيات من خلال نمذجة مجال الأعمال بصورة صريحة، والحرص على أن يظل هذا النموذج — والشيفرة التي تعبّر عنه — متوائمًا بشكل وثيق مع اللغة التي يستخدمها من يفهمون المجال.
##Problem
مع نمو النظام، تميل قواعد العمل إلى التشتت عبر المتحكمات والخدمات واستعلامات قاعدة البيانات. تبتعد الشيفرة عن الطريقة التي تتحدث بها الشركة فعليًا عن عملها، مما يجعل كل محادثة تحتاج إلى ترجمة وكل تغيير يخاطر بكسر قاعدة لم يتذكرها أحد.
يجعل التصميم المحوري على البيانات الأمور أسوأ: تصبح النماذج مجرد حاويات هزيلة من المُحصِّلات والمُعيِّنات، ولا تُطبَّق الثوابت في أي مكان بعينه، ويتحول النظام تدريجيًا إلى "كرة طين ضخمة" لا يجرؤ سوى قلة على لمسها.
##Solution
يُعالج التصميم المدفوع بالمجال المشكلة على مستويين.
التصميم الاستراتيجي يقسّم مجالًا كبيرًا إلى سياقات محدودة — حدود صريحة تكون داخلها النموذج ولغته متسقَين — ويرسم العلاقات بينها. كل سياق حر في نمذجة المفهوم ذاته بشكل مختلف إذا كان العمل يراه بالفعل بشكل مختلف.
التصميم التكتيكي يبني نموذجًا غنيًا داخل السياق من مجموعة صغيرة من الوحدات البنائية، ويصرّ على لغة شاملة: المصطلحات ذاتها تظهر في المحادثات وفي النموذج وفي الشيفرة.
##Structure
الوحدات البنائية التكتيكية:
- الكيانات — كائنات تُعرَّف بهويتها التي تستمر عبر الزمن (مثل
Customer، وOrder). - كائنات القيمة — كائنات غير قابلة للتغيير تُعرَّف بصفاتها (مثل
Money، وAddress). - التجمّعات — مجموعات من الكيانات وكائنات القيمة مع جذر تجميعي واحد يحرس ثوابت المجموعة ويكون نقطة الدخول الوحيدة للتغييرات.
- المستودعات — واجهات شبيهة بالمجموعات تحمّل التجمّعات وتُثبتها بأكملها، مخفيةً تفاصيل التخزين.
- خدمات المجال — عمليات عديمة الحالة لا تنتمي طبيعيًا إلى كيان واحد.
- أحداث المجال — سجلات لشيء ذي معنى حدث في المجال.
الوحدات الاستراتيجية — السياق المحدود وخريطة السياق — تنظّم هذه النماذج عبر الفرق والأنظمة الفرعية.
##Applicability
- استخدمه عندما تكمن التعقيدات الجوهرية في قواعد العمل لا في التقنية — كاللوجستيات، والتمويل، والتأمين، والجدولة.
- استخدمه عندما يحتاج عدة فرق إلى الاتفاق على فهم مشترك ومتطور لمجال ما.
- تجنّبه في تطبيقات CRUD البسيطة أو إدخال البيانات، حيث لا يستحق الجهد المبذول في النمذجة.
##How to Implement
- تحدّث إلى خبراء المجال واستخلص اللغة الشاملة؛ سجّل المصطلحات ومعانيها.
- حدّد المجال الجوهري — الجزء الذي يمنح الميزة التنافسية — وركّز جهود النمذجة عليه.
- قسّم المجال إلى سياقات محدودة وارسم خريطة سياقية تُبيّن العلاقات بينها.
- ضمن كل سياق، نمذج التجمّعات بحيث يُطبّق كل منها ثوابته الخاصة في معاملة واحدة.
- حمّل التجمّعات واحفظها عبر المستودعات؛ وانشر أحداث المجال للأشياء التي تهم السياقات الأخرى.
- نقّح باستمرار — النموذج لا يكون "مكتملًا" أبدًا، بل يتطور مع تعمّق الفهم.
##Pros & Cons
- تبقي الشيفرة متوائمة مع الأعمال، بحيث تتناظر التغييرات بوضوح مع المتطلبات.
- تعزل التعقيد خلف السياقات المحدودة.
- اللغة المشتركة تقلل سوء التواصل بين المهندسين وخبراء المجال.
- منطق المجال الغني مفصول عن البنية التحتية وسهل اختباره بالوحدات.
- منحنى تعلّم شديد الانحدار واستثمار حقيقي في نمذجة المجال.
- مُبالَغ فيه للتطبيقات البسيطة أو تلك القائمة أساسًا على CRUD.
- يتطلب وصولًا مستمرًا إلى خبراء المجال.
- إذا طُبِّق بشكل خاطئ، تصبح الوحدات البنائية مجرد طقوس دون فائدة.