domain driven design - driven - ما هي فوائد استمرار الجهل؟



domain-driven-design persistence-ignorance (2)

أنا مبتدئ في DDD + TDD World. لكني كنت في برمجة لمدة 9 سنوات.

هل يمكن لأي أحد أن يشرح لي فوائد استمرار الجهل؟ تطبيق nHibernate نموذجي فقط يدفع التبعية بين الطبقة وقاعدة البيانات إلى ملفات التعيين.

إذا قمت بتغيير ملفات Class أو قاعدة البيانات ، يجب تغيير ملفات التعيين. فهل ليس مجرد دفع التبعية عن طريق إضافة طبقة تجريد أخرى؟ في رأيي حتى الآن لا أعتقد أنه شيء ثوري. لكنني لست متأكداً مما إذا كنت أفتقد شيئاً ما.

أخيرا كيف يمكنني اختبار ملفات الخرائط؟ هناك فرص ظهور الأخطاء من ملفات الخرائط ، كيف يمكنني اختبارها؟

https://ffff65535.com


PI ليست حول استخدام NHibernate. PI لتجاهل كيف سيتم تخزين البيانات تطوير نموذج المجال. ونعم ، هو دفع التبعية عن طريق إضافة طبقة تجريد أكثر واحدة. DDD ليست ثورية - إنها أشبه بالفكرة ، وهي طريقة لكيفية استخدام الكود باستخدام أنماط مألوفة بالفعل (معظمها). أي - نمط المصنع أو نمط الوحدة النمطية ليس جديدًا أيضًا ، ولكنه جزء مهم جدًا من DDD.

لقد بدأت استخدام NHibernate في الآونة الأخيرة أيضًا ، لذا - لا يمكنني تقديم الكثير من التفاصيل حول هذا الموضوع. ولكن حصلت على نصيحة واحدة قد تكون مفيدة لك - حاول Fluent NHibernate إذا لم تكن قد فعلت ذلك بالفعل.


اسمحوا لي أن أشرح هذا مع مثال. لنفترض أنك تنفذ تطبيقًا باستخدام منهج SQL الكلاسيكي. يمكنك فتح مجموعات السجلات وتغيير البيانات وتعيينها.

رمز زائف:

trx = connection.CreateTransaction();
query = connection.CreateQuery("Select * from Employee where id = empid");
resultset = query.Run();
resultset.SetValue("Address_Street", "Bahnhofstrasse");
resultset.SetValue("Address_City", "Zürich");
trx.Commit();

مع NHibernate سيبدو شيء من هذا القبيل:

emp = session.Get<Employee>(empid);

// persistence ignorant 'logic'
emp.Address.Street = "Bahnhofstrasse";
emp.Address.City = "Zürich";

session.Commit();

يعني استمرار الجهل أن منطق الأعمال نفسه لا يعرف عن الثبات. أو بعبارة أخرى ، يتم فصل المثابرة عن المنطق. هذا يجعله أكثر قابلية لإعادة الاستخدام.

انقل "المنطق" إلى طريقة قابلة لإعادة الاستخدام:

void MoveToZuerichBahnhofstrasse(Employee emp)
{
  // doesn't have anything to do with persistence
  emp.Address.Street = "Bahnhofstrasse";
  emp.Address.City = "Zürich";
}

محاولة كتابة مثل هذه الطريقة باستخدام resultsets وأنت تعرف ما هو الجهل المستمر.

إذا لم تكن مقتنعًا ، فراجع مدى بساطة اختبار الوحدة ، لأنه لا توجد أية اعتمادات لاستمرار الأشياء ذات الصلة:

Employee emp = new Employee();
MovingService.MoveToZuerichBahnhofstreasse(emp);
Assert.AreEqual("Bahnhofstrasse", emp.Address.Street);
Assert.AreEqual("Zürich", emp.Address.City);

DDD شيء مختلف. هناك يمكنك بناء نموذج المجال الخاص بك أولا (نموذج فئة) وإنشاء تصميم قاعدة البيانات وفقا لذلك. مع NH يكون ذلك بسيطًا جدًا ، لأنه - بفضل جهل الثبات - يمكنك كتابة الوحدة واختبار النموذج والمنطق قبل وجود نموذج قاعدة بيانات (نهائي).

الاختبار: نحن نختبر التعيينات عن طريق إنشاء مثيل للكيان ، وتخزينه في قاعدة البيانات ، وإعادته ومقارنته. يتم ذلك تلقائيا مع الكثير من التفكير. لكنك لست بحاجة للذهاب إلى هذا الحد. تظهر معظم الأخطاء النموذجية عند محاولة تخزين كيان ما.

يمكنك أن تفعل الشيء نفسه مع الاستعلامات. استفسارات معقدة تستحق اختبار. من المثير للاهتمام أكثر إذا تم تجميع الاستعلام على الإطلاق. لا تحتاج حتى إلى أي بيانات لهذا.

لاختبارات تكامل قاعدة البيانات ، نحن نستخدم Sqlite . هذا سريع جدا. ينتج NH قاعدة البيانات في الذاكرة على الطاير باستخدام SchemaExport (قبل كل اختبار).