عندما بدأت الغوص في عالم تطوير البرمجيات لأول مرة، غالبًا ما وجدت نفسي غارقًا في كل الكلمات الطنانة والمفاهيم المتطايرة. إحدى المفاهيم التي بدت مخيفة بشكل خاص هي المبادئ الصلبة. لقد بدا الأمر وكأنه شيء يجب على المطورين "الجادين" فقط القلق بشأنه. ولكن عندما أصبحت أكثر ارتياحًا للبرمجة، أدركت أن هذه المبادئ لا تتعلق بالخيال بقدر ما تتعلق بكتابة التعليمات البرمجية التي لا تجعلك ترغب في سحب شعرك بعد بضعة أشهر.
لذا، إليك وجهة نظري حول مبادئ SOLID في JavaScript - وهو دليل عملي لا معنى له وأتمنى لو كان لدي عندما بدأت.
ينص مبدأ المسؤولية الفردية على أن الفصل يجب أن يكون لديه سبب واحد فقط للتغيير، وهذا يعني أنه يجب أن يكون لديه وظيفة أو مسؤولية واحدة فقط.
فكر في باريستا في المقهى المفضل لديك. وظيفتهم هي صنع القهوة. إذا اضطروا فجأة إلى البدء في إصلاح ماكينة الإسبريسو، وتقديم المعجنات، وإخراج القمامة، فستصبح الأمور فوضوية. تمامًا كما يجب أن يركز صانع القهوة على صنع القهوة، يجب أن يركز فصلك على القيام بشيء واحد بشكل جيد.
تخيل أن لديك فئة مستخدم تتعامل مع مصادقة المستخدم والتحقق من صحة البيانات وتخزين قاعدة البيانات. إنه يفعل الكثير! من خلال تقسيم هذه المسؤوليات إلى فئات منفصلة، يمكنك تسهيل إدارة التعليمات البرمجية الخاصة بك وصيانتها.
class UserAuthenticator { login(user) { // handle login } } class UserDataValidator { validate(user) { // validate user data } } class UserDatabase { save(user) { // save user to the database } }
ينص المبدأ المفتوح/المغلق على أن الكيانات البرمجية يجب أن تكون مفتوحة للتوسيع ولكنها مغلقة للتعديل. بمعنى آخر، يجب أن تكون قادرًا على إضافة وظائف جديدة دون تغيير التعليمات البرمجية الموجودة.
تخيل وحدة التحكم في الألعاب المفضلة لديك. يمكنك إضافة ألعاب وأجهزة تحكم وملحقات جديدة، ولكن لا يتعين عليك فتحها وإعادة توصيلها للقيام بذلك. وبالمثل، يجب أن تكون قادرًا على إضافة ميزات جديدة إلى التعليمات البرمجية الخاصة بك دون تغيير بنيتها الأساسية.
لنفترض أن لديك فئة شكل مع طريقة لحساب المساحة. إذا كنت بحاجة إلى إضافة شكل جديد، مثل المثلث، فلن تضطر إلى تعديل الفئة الحالية. بدلاً من ذلك، قم بتوسيع نطاقه.
class Shape { area() { throw "Area method not implemented"; } } class Rectangle extends Shape { constructor(width, height) { super(); this.width = width; this.height = height; } area() { return this.width * this.height; } } class Circle extends Shape { constructor(radius) { super(); this.radius = radius; } area() { return Math.PI * this.radius * this.radius; } }
ينص مبدأ استبدال ليسكوف على أن كائنات الفئة الفائقة يجب أن تكون قابلة للاستبدال بكائنات فئة فرعية دون التأثير على صحة البرنامج.
تخيل استئجار سيارة. سواء حصلت على سيارة سيدان أو سيارة دفع رباعي، فإنك تتوقع أن تتمتع بالوظائف الأساسية للسيارة: يجب أن تقود، وتوجه، وتتوقف. إذا كانت سيارتك المستأجرة تتطلب مجموعة مختلفة تمامًا من أدوات التحكم، فستكون في مشكلة! وبالمثل، يجب أن تتصرف الفئات الفرعية بطريقة لا تخالف التوقعات التي حددتها الفئة الأم.
إذا كان لديك فئة الطيور وفئة البطريق التي تمددها، فيجب أن يظل البطريق يتصرف مثل الطائر حتى لو لم يكن قادرًا على الطيران. يجب أن يستمر في المشي، وتناول الطعام، وربما حتى السباحة.
class Bird { move() { console.log("Flies in the sky"); } } class Penguin extends Bird { move() { console.log("Swims in the water"); } } const myBird = new Bird(); const myPenguin = new Penguin(); myBird.move(); // Flies in the sky myPenguin.move(); // Swims in the water
يقترح مبدأ فصل الواجهة أنه لا ينبغي إجبار العملاء على تنفيذ واجهات لا يستخدمونها. بدلاً من أن يكون لديك واجهة واحدة كبيرة، يجب عليك إنشاء واجهات أصغر وأكثر تحديدًا.
تخيل مطعمًا حيث يجب أن يكون الطاهي أيضًا هو النادل والنادل وغسالة الأطباق. إنه أمر ساحق وغير فعال! وبدلا من ذلك، يجب أن يكون لكل دور مهامه المحددة. وبالمثل، يجب أن تكون واجهاتك متخصصة ومركزة.
إذا كانت لديك واجهة عاملة تتضمن أساليب مثل buildHouse، وpainHouse، وdesignHouse، فلا ينبغي للعامل الذي يقوم بطلاء المنازل فقط أن ينفذ جميع الطرق الأخرى. قم بتقسيمها إلى واجهات أصغر.
class Builder { build() { console.log("Building house..."); } } class Painter { paint() { console.log("Painting house..."); } } class Designer { design() { console.log("Designing house..."); } }
ينص مبدأ انعكاس التبعية على أن الوحدات عالية المستوى لا ينبغي أن تعتمد على الوحدات منخفضة المستوى. كلاهما يجب أن يعتمد على التجريدات.
فكر في كيفية توصيل شاحن هاتفك بمقبس الحائط. لا تحتاج إلى معرفة تفاصيل الأسلاك الكهربائية داخل الجدران، كل ما تحتاجه هو الواجهة (المقبس) لتشغيل جهازك. وبالمثل، يجب أن يعتمد الكود الخاص بك على التجريدات (الواجهات)، وليس على التطبيقات الملموسة.
إذا كان لديك فئة LightBulb التي تتحكم بشكل مباشر في فئة Switch، فأنت تقوم بإنشاء اقتران محكم. بدلاً من ذلك، يجب أن يعتمد كلاهما على واجهة مثل PowerSource.
class LightBulb { turnOn(powerSource) { powerSource.provideElectricity(); console.log("Light is on"); } } class Switch { constructor(powerSource) { this.powerSource = powerSource; } operate() { this.powerSource.togglePower(); } } class PowerSource { provideElectricity() { console.log("Providing electricity"); } togglePower() { console.log("Toggling power"); } }
إن إتقان مبادئ SOLID يشبه تعلم الطبخ باستخدام مجموعة من الوصفات المثبتة. بمجرد فهمها، يمكنك إعداد تعليمات برمجية ليست عملية فحسب، بل أنيقة وسهلة الصيانة. لذا، في المرة القادمة التي تجد فيها نفسك في معضلة تتعلق بالبرمجة، تذكر: هناك مبدأ لذلك!
ترميز سعيد! ?
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3