تكرار السؤال: …
الإجابة المختصرة
ينص القانون على أن المكون البرمجي يجب أن يتحدث فقط مع أصدقائه المقربين المباشرين، ولا ينبغي له معرفة الهيكل الداخلي للكائنات الفرعية التي يتعامل معها.
الشرح
تعتبر استدعاءات 'Train Wrecks' مثل a.getB().getC().getD().doSomething() انتهاكاً صارخاً لقانون ديميتر؛ لأنها تجعل الكائن A معتمداً بشدة على تفاصيل الهيكلة الداخلية لـ B و C و D. إذا تغيرت تركيبة C ينهار كود A. الحل هو تفويض المسؤولية (Tell, Don't Ask) بإضافة دالة وسيطة في B تقوم بالمطلوب مباشرة a.getB().doActionOnD().
مثال بالكود
// انتهاك صارخ: a.getInvoice().getCustomer().getAddress().getCity();
// متوافق مع قانون ديميتر:
const city = invoice.getCustomerCity();أخطاء شائعة
- تطبيق قانون ديميتر على الـ Fluent Interfaces أو الـ Builder Pattern أو استعلامات LINQ/Streams، حيث أن تلك السلاسل ترجع نفس السياق ولا تنتهك التغليف.