- الحصول على الرابط
- X
- بريد إلكتروني
- التطبيقات الأخرى
- الحصول على الرابط
- X
- بريد إلكتروني
- التطبيقات الأخرى
ما هو ال Dependency injection وما هى المشكله التى يحلها؟
لو عندنا Class A و Class B و Class A بتستخدم object من نوع B وبتعمل Create للـ Object.
كدا بنقول :Class A depends on Class B
لو عملنا تغيير فى ال constructor الخاص ب B هنضطر نعدل الكود في A لأنها تعتمد على B.
وكدا بنقول على A و B انهم tightly coupled ودا بسبب ان التغيير فى B يضطرنا ان احنا نغير فى الكود فى A.
المثال السابق كان بسيط مجرد اتنين Class , تخيل بقى لو الـ البرنامج فيه modules مختلفة وفى Classes كتير وفى dependency مختلفة بين الكلاسات والتغير فى حاجه بسيطه ممكن يضطرنا نعدل فى classes تانيه كتير وهكذا.
مثال آخر لو عندنا Class ولنفترض انها HomeController وفى ال HomeController محتاجين تستعلم عن البيانات وحفظ بيانات جديدة فى ال database.
فى Class اسمها SQLServer اللى من خلالها نقدر نتعامل مع ال Database.
وبكدا يبقى HomeController تعتمد على SQLServer.
وهنا ال HomeController هتحتاج تعرف Object من SQLServer والاتنين classes بنقول عليهم tightly coupled.
ماذا لو احتجنا نتعامل مع Database مختلفة وأنشأنا class اسمها MySql من خلالها نقدر نتعامل مع MySql Database.
لو محتاجين نغير ال SqlServer Class ونستخدم ال MySql Class هنضطر نروح نغير فى ال HomeController بدل استخدام object من نوع SqlServer هنستخدم object من MySql.
تصور لو احنا كنا بنستخدم ال SqlServer Class فى Modules كتير هنضطر نعدل بنفسنا ال code فى الـ Modules المختلفة.
.
The Dependency Inversion Principle
Dependency Inversion Principle هو اقتراح او ممكن نقول قاعدة اللى لو نفذناها هنقدر نحل مشكله ال Dependency Injection والاقتراح هو:
High-level modules should not depend on low-level modules. Both should depend on
abstractions
Abstractions should not depend on details. Details should depend on abstractions
لو طبقنا الحل على المثال السابق هيبقى كالتالى بدل اعتماد ال HomeController على SqlServer او Mysql بشكل مباشر
هتعتمد على Interface موجود فيها ال methods اللى هستخدمها. وعلشان نطبق الحل هنعمل 3 خطوات
1-يعنى هنعمل Interface اسمها IDatabase وفيها ال Methods الرئيسيه اللى بنستخدمها زى update وال Delete وال select وهكذا الخ.
2-هنخلى MySql Class و SqlServer Class يعملوا Implementation لـ IDatabase وكل Class هتعمل ال implementation الخاص بها لل methods الموجودة فى ال IDatabase.
3-
ال HomeController هتعتمد على Object من نوع IDatabase , ,وال IDatabase Object ممكن يكون Object من اى class بتعمل implement لل IDatabase.
بالتالي ال HomeController ممكن تستخدم object من نوع SQLServer Class أو MySQL Class لأنهم بيعملوا Impemnent لل IDatabase.
وكدا نقدر نقول على HomeController و SQlServer انهم loosely coupled لان ال HomeController تعتمد على Interface وهى IDatabase ولا تعتمد على Details اللى هى MySql Class أو SQLServer Class.
بس هل كدا قدرنا نحقق ال Loosely coupled بين الـ HomeController وبين ال dependencies اللى بتستخدمها بشكل كامل؟
- الحصول على الرابط
- X
- بريد إلكتروني
- التطبيقات الأخرى
تعليقات
إرسال تعليق