Layered design in software engineering

0-Dependency injection: The Big Picture

ما هو ال 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 اللى بتستخدمها بشكل كامل؟






تعليقات