x32x01
أدارة أكتب كود
- بواسطة x32x01 ||
بص، تخيل إنك شغال مدير في كافيه، وعايز تقدم مشروبات زي القهوة والشاي. المفروض كمدير، ما تبقاش مسؤول إنك تعمل القهوة بنفسك أو حتى تعرف التفاصيل الصغيرة زي طحن البن أو غلي المية. كل اللي يهمك إنك تقول للموظف اللي عندك: “اعمل مشروب”.
هنا اللي حصل:
• انت بتتعامل مع موظف بيقدم لك خدمة (الواجهة أو الـ interface).
• ما بتدخلش في التفاصيل بتاعته، وده بيخليك كمدير ما تعتمدش على التفاصيل اللي جوه طريقة عمل المشروب.
ليه المبدأ ده مهم؟
1. سهولة التغيير
لو النهارده قررت بدل ما تقدم قهوة تقدم عصير، مش هتحتاج تغير شغلك كمدير. كل اللي هتعمله، هتجيب موظف جديد متخصص في العصير. الدنيا بسيطة.
2. إعادة استخدام
الموظف اللي بيعرف يعمل مشروبات ممكن تستخدمه في فروع تانية للكافيه. لأنك بتتعامل مع الخدمة بشكل عام، مش بتقول له يعمل حاجة واحدة بس.
3. سهولة الصيانة
لو في مشكلة في القهوة، هتصلح الموظف بتاع القهوة من غير ما تأثر على باقي الشغل.
مثال بسيط بالكود
بدون تطبيق المبدأ: تخيل عندك برنامج العميل بيتعامل مباشرة مع ماكينة القهوة:
المشكلة هنا إن العميل (Customer) مرتبط ارتباط كامل بماكينة القهوة (CoffeeMaker). لو حبيت تغير ماكينة القهوة بماكينة شاي، لازم تعدل في الكود كله.
فمبدأ Dependency Inversion من أهم مبادئ الـ SOLID لأنه بيركز على فصل التفاصيل عن الهيكل الرئيسي للبرنامج. وده بيساعد في جعل الكود أكثر مرونة وقابلية للصيانة.
خلينا نبسط أكتر:
شرح المبدأ
المبدأ بيقول: “الوحدات الكبيرة والمهمة (High-Level Modules) مش المفروض تعتمد على التفاصيل الصغيرة (Low-Level Modules). الاتنين لازم يعتمدوا على abstraction (التجريد)”
بمعنى:
1. الوحدات الكبيرة لازم تتعامل مع الأشياء بشكل عام ومجرد (abstract interface)، مش تدخل في التفاصيل الدقيقة.
2. التفاصيل الدقيقة لازم تكون معزولة وراء abstraction بحيث يمكن استبدالها أو تعديلها بدون التأثير على الكود الكبير.
من أهمية المبدأ
1. سهولة التغيير
لو عايز تغير التفاصيل مش هتحتاج تعدل الكود الرئيسي، بس هتعدل الـ Low-Level Class (المسؤولة عن التفاصيل).
2. إعادة الاستخدام
الـ Interfaces اللي بتتعامل مع الـ abstraction ممكن تستخدمها في أي مكان بدون قلق من التفاصيل المختلفة لكل تنفيذ.
3. سهولة الاختبار
لأن التفاصيل منفصلة عن التطبيق الرئيسي، هتقدر تختبر كل جزء لوحده بسهولة (Unit Testing).
مبدأ Dependency Inversion بيشجعنا دايمًا على كتابة كود مرن وقابل للتغيير بدون كسر الأجزاء الأخرى. وده بيحصل لما نعزل التفاصيل الصغيرة عن الكود الرئيسي باستخدام abstraction.
هنا اللي حصل:
• انت بتتعامل مع موظف بيقدم لك خدمة (الواجهة أو الـ interface).
• ما بتدخلش في التفاصيل بتاعته، وده بيخليك كمدير ما تعتمدش على التفاصيل اللي جوه طريقة عمل المشروب.
ليه المبدأ ده مهم؟
1. سهولة التغيير
لو النهارده قررت بدل ما تقدم قهوة تقدم عصير، مش هتحتاج تغير شغلك كمدير. كل اللي هتعمله، هتجيب موظف جديد متخصص في العصير. الدنيا بسيطة.
2. إعادة استخدام
الموظف اللي بيعرف يعمل مشروبات ممكن تستخدمه في فروع تانية للكافيه. لأنك بتتعامل مع الخدمة بشكل عام، مش بتقول له يعمل حاجة واحدة بس.
3. سهولة الصيانة
لو في مشكلة في القهوة، هتصلح الموظف بتاع القهوة من غير ما تأثر على باقي الشغل.
مثال بسيط بالكود
بدون تطبيق المبدأ: تخيل عندك برنامج العميل بيتعامل مباشرة مع ماكينة القهوة:
Java:
class CoffeeMaker {
public void makeCoffee() {
System.out.println("بيعمل قهوة...");
}
}
class Customer {
private CoffeeMaker coffeeMaker;
public Customer() {
coffeeMaker = new CoffeeMaker();
}
public void serveCoffee() {
coffeeMaker.makeCoffee();
}
}
فمبدأ Dependency Inversion من أهم مبادئ الـ SOLID لأنه بيركز على فصل التفاصيل عن الهيكل الرئيسي للبرنامج. وده بيساعد في جعل الكود أكثر مرونة وقابلية للصيانة.
خلينا نبسط أكتر:
شرح المبدأ
المبدأ بيقول: “الوحدات الكبيرة والمهمة (High-Level Modules) مش المفروض تعتمد على التفاصيل الصغيرة (Low-Level Modules). الاتنين لازم يعتمدوا على abstraction (التجريد)”
بمعنى:
1. الوحدات الكبيرة لازم تتعامل مع الأشياء بشكل عام ومجرد (abstract interface)، مش تدخل في التفاصيل الدقيقة.
2. التفاصيل الدقيقة لازم تكون معزولة وراء abstraction بحيث يمكن استبدالها أو تعديلها بدون التأثير على الكود الكبير.
من أهمية المبدأ
1. سهولة التغيير
لو عايز تغير التفاصيل مش هتحتاج تعدل الكود الرئيسي، بس هتعدل الـ Low-Level Class (المسؤولة عن التفاصيل).
2. إعادة الاستخدام
الـ Interfaces اللي بتتعامل مع الـ abstraction ممكن تستخدمها في أي مكان بدون قلق من التفاصيل المختلفة لكل تنفيذ.
3. سهولة الاختبار
لأن التفاصيل منفصلة عن التطبيق الرئيسي، هتقدر تختبر كل جزء لوحده بسهولة (Unit Testing).
مبدأ Dependency Inversion بيشجعنا دايمًا على كتابة كود مرن وقابل للتغيير بدون كسر الأجزاء الأخرى. وده بيحصل لما نعزل التفاصيل الصغيرة عن الكود الرئيسي باستخدام abstraction.