شرح Open Closed Principle في مبادئ ال Solid لكتابة كود منظم
في هذا الدرس الثاني سوف نشرح فكرة ال Open Closed في solid وكما نعلم ان هذه المبادئ مهمه جدا في التطوير باستخدام احد لغات البرمجه وهيا مبادئ ثابته عليك معرفتها , وهذا يعد الدرس الثاني وسوف نحاول في هذه السلسله تقديم لكم جميع الدروس بابسط صورة في ال soild من اجل فهم المبادئ بشكل صحيح وسليم وتعد فكرة ال Open Closed من الاقكار التي تسهل عليك التعديل في الكود الخاص بك بشكل بسيط بدلا من المرور على كثير من المتغيرات والعناصر من اجل التعديل عليها وسوف نقوم بشرحها لكم في الجزء التالي .
ربما تكون قد سمعت عن هذا المبدأ واستخدمته ، حتى لو لم تسمع من قبل عن روبرت سي مارتن أو أعماله الشهيرة. إنها إحدى الأفكار الأساسية التي يستخدمها معظم المبرمجين لإنشاء برامج موثوقة وقابلة للصيانة. يمكنك استخدامه مع الفئات ومكونات البرامج والخدمات المصغرة بالإضافة إليها. قبل أن نتعمق أكثر في فكرة التصميم هذه إن تبرير مبدأ المسؤولية الفردية واضح ومباشر: فهو يجعل إنشاء برنامجك أسهل ويحمي من الآثار الجانبية غير المتوقعة للتغييرات المستقبلية. يدرك الجميع أن المتطلبات تتطور بمرور الوقت. بالإضافة إلى ذلك ، يقوم كل منهم بتعديل التزام فئة واحدة على الأقل.
Bad code
في المثال الاول نلاحظ انه يوجد لدينا اكثر من class كل class منهم يعتمد على وجود بعض المتغيرات بداخله ولدينا class في النهايه يحتاج منا الى ادخال اي object وبناء على ال object المدخل سوف يخرج لنا اذا كان الشكل مستطيل او دائره , المشكلة التي تواجهنا انه عندما نريد اضافة اي class لاي شكل اخر نحتاج الى اضافة if else وهذا يكون خطأ لانه اذا كان مشروع كبير سوف يكون الامر مزعج ولحل هذه المشكلة شاهد الكود التاليه في مرحلة ال good .
good code
في هذه المرحلة قمنا بعمل abstract class بداخل ال drawing وهو عباره عن نص يتم طباعته وكل class نحتاج ان يكون يرث من abstract class بحيث يظهر له الdraw() , وبداخله قم بتفنيذ اي امر ترغب به ويمكنك عمل في النهايه class يحتاج منك ال shape وهو الclass الذي يرث منه باقي ال classes , ويقوم بتنفيذ الامر ال draw لكل class , في عملية التنفيذ قمنا بتنفيذه بكلا الطريقتين يمكنك استخدام الطريقة التي تناسبك في التنفيذ .
How to use Open Closed Principle In Flutter
imp.dart
abstract class Shape {
String draw();
}
class Rectangle implements Shape {
double length;
double width;
Rectangle(this.length, this.width);
@override
String draw() {
return 'Rectangle ${length * width}';
}
}
class Square implements Shape {
double side;
Square(this.side);
@override
String draw() {
return 'Square ${side * side}';
}
}
class ShapeDraw {
void drawer(Shape shape) {
shape.draw();
}
}
// implication
Shape shape = Square(2);
print(shape.draw());
// OR ---
print(Square(2).draw());
// out put :- Square 4.0