سؤال

ينص مبدأ فصل الواجهة (ISP) على أن العديد من الواجهات الخاصة بالعميل أفضل من واجهة واحدة للأغراض العامة.لماذا هذا مهم؟

هل كانت مفيدة؟

المحلول

ينص مزود خدمة الإنترنت على ما يلي:

لا ينبغي إجبار العملاء على الاعتماد على الأساليب التي لا يستخدمونها.

مزود خدمة الإنترنت يتعلق بخصائص مهمة - تماسك و اقتران.
من الناحية المثالية، يجب أن تكون مكوناتك مصممة بشكل عالي.يعمل على تحسين قوة الكود وقابلية صيانته.

يمنحك فرض مزود خدمة الإنترنت المكافآت التالية:

  • عالي تماسك - فهم أفضل، والمتانة
  • قليل اقتران - صيانة أفضل، مقاومة عالية للتغييرات

إذا كنت ترغب في معرفة المزيد عن مبادئ تصميم البرامج ، احصل على نسخة من تطوير البرمجيات الرشيقة والمبادئ والأنماط والممارسات كتاب.

نصائح أخرى

فصل الواجهة هو "أنا" وفقًا لمبدأ SOLID، قبل التعمق في الأول، دعنا نشرح ما يعنيه الأخير.

يمكن اعتبار SOLID مجموعة من أفضل الممارسات والتوصيات المقدمة من الخبراء (بمعنى أنه تم إثباتها من قبل) من أجل توفير أساس موثوق في كيفية تصميم التطبيقات.تسعى هذه الممارسات إلى تسهيل صيانة تطبيقاتنا وتوسيعها وتكييفها وتوسيع نطاقها.

لماذا يجب أن أهتم ببرمجة SOLID؟

أولاً، عليك أن تدرك أنك لن تبقى حيث أنت إلى الأبد.إذا استخدمنا المعايير والبنيات المعروفة، فيمكننا التأكد من أن الكود الخاص بنا سيكون من السهل صيانته بواسطة المطورين الآخرين الذين يأتون بعدنا، وأنا متأكد من أنك لن ترغب في التعامل مع مهمة إصلاح الكود الذي لم يحدث لم يتم تطبيق أي منهجية معروفة لأنه سيكون من الصعب جدًا فهمها.

مبدأ فصل الواجهة.

اعلم أننا نعرف ما هي مبادئ SOLID، حيث يمكننا الحصول على مزيد من التفاصيل حول مبدأ فصل الواجهة، ولكن ما الذي يقوله فصل الواجهة بالضبط؟

"لا ينبغي إجبار العملاء على تنفيذ أساليب غير ضرورية لن يستخدموها"

هذا يعني أننا في بعض الأحيان نميل إلى إنشاء واجهات تحتوي على الكثير من الأساليب، والتي يمكن أن تكون جيدة إلى حد ما، ولكن يمكن إساءة استخدام ذلك بسهولة، ويمكن أن ينتهي بنا الأمر بفئات تنفذ أساليب فارغة أو غير مجدية مما يضيف بالطبع تعليمات برمجية وعبء إضافيين إلى تطبيقاتنا.تخيل أنك تعلن عن الكثير من الأساليب في واجهة واحدة، إذا كنت تحب المساعدات المرئية، فإن الفصل الذي يقوم بتنفيذ واجهة ولكنه يحتاج بالفعل إلى طريقتين سيبدو كما يلي:

enter image description here

من ناحية أخرى، إذا قمت بتطبيق فصل الواجهة بشكل صحيح وقسمت واجهتك إلى مجموعات فرعية أصغر، فيمكنك التأكد من تنفيذ تلك المطلوبة فقط:

enter image description here

يرى!هل هو أفضل بكثير!إن تطبيق هذا المبدأ سيسمح لك بالحصول على اقتران منخفض مما يساعد على تحسين قابلية الصيانة ومقاومة عالية للتغييرات.لذلك يمكنك حقًا الاستفادة من استخدام الواجهات وتنفيذ الأساليب عندما ينبغي عليك فعل ذلك.لنراجع الآن مثالًا أقل تجريدًا، لنفترض أنك أعلنت عن واجهة تسمى Reportable

public interface Reportable {

        void printPDF();
        void printWord();
        void printExcel();
        void printPPT();
        void printHTML();


}

ولديك عميل سيقوم فقط بتصدير بعض البيانات بتنسيق Excel، ويمكنك تنفيذ الواجهة، ولكن هل سيتعين عليك فقط تنفيذ طريقة Excel؟الإجابة هي لا، سيتعين عليك برمجة التنفيذ لجميع الطرق حتى إذا كنت لن تستخدمها، فقد يتسبب ذلك في وجود الكثير من التعليمات البرمجية غير المرغوب فيها، مما يجعل صيانة الكود صعبة.

تذكر أن تبقي الأمر بسيطًا ولا تكرر نفسك وستجد أنك تستخدم هذا المبدأ بالفعل دون أن تدري.

فهو يبسط الواجهة التي سيستخدمها أي عميل ويزيل التبعيات التي قد يطورها على أجزاء من الواجهة التي لا يحتاج إليها.

أحد الأسباب هو أن وجود العديد من الواجهات مع الحد الأدنى من الأساليب لكل واجهة يجعل من السهل تنفيذ كل واجهة وتنفيذها بشكل صحيح.يمكن أن تكون الواجهة الكبيرة جامحة.كما أن استخدام واجهة مركزة في سيناريو ما يجعل التعليمات البرمجية أكثر قابلية للصيانة لأنه يمكنك معرفة أي جانب من جوانب الكائن قيد الاستخدام (على سبيل المثال، تتيح لك واجهة IComparable معرفة أن الكائن يُستخدم فقط للمقارنات في السيناريو المحدد).

يخدم هذا المبدأ في المقام الأول غرضين مزدوجين

  • لجعل الكود أكثر قابلية للقراءة والإدارة.

  • يعزز المسؤولية الفردية للفصول الدراسية (التماسك العالي).بالطبع لماذا يجب أن يكون لدى الفصل طريقة ليس لها أي تأثير سلوكي؟لماذا لا مجرد إزالته.هذا ما يدور حوله مزود خدمة الإنترنت

هناك بعض الأسئلة التي يجب على المصمم طرحها فيما يتعلق بمزود خدمة الإنترنت

  • ماذا يمكن للمرء أن يحقق مع ISP
  • كيفية تحليل رمز موجود بالفعل بحثًا عن أي انتهاكات لمزود خدمة الإنترنت

لمواصلة هذه المناقشة، يجب أن أضيف أيضًا أن هذا المبدأ ليس "مبدأ" بالمعنى الدقيق للكلمة، لأنه في ظل ظروف معينة، قد يؤدي تطبيق مزود خدمة الإنترنت على التصميم، بدلاً من تعزيز سهولة القراءة، إلى جعل بنية الكائن غير قابلة للقراءة ومليئة بالعناصر رمز غير ضروري.قد تلاحظ ذلك جيدًا في الحزمة java.awt.event

المزيد في مدونتي: http://design-principle-pattern.blogspot.in/2013/12/interface-segregation-principle.html

مزود خدمة الإنترنت أنه مهم.

الفكرة الأساسية لمزود خدمة الإنترنت:لا ينبغي إجبار العميل على الاعتماد على الأساليب التي لا يستخدمها.

ويبدو أن هذا المبدأ أكثر منطقية.من الناحية المثالية، يجب على العميل ألا ينفذ الأساليب التي لا يستخدمها العميل.

ارجع إلى سؤال SE أدناه للحصول على مثال التعليمات البرمجية:

مبدأ فصل الواجهة - برنامج إلى واجهة

مزايا:

  1. المرونة :في غياب مزود خدمة الإنترنت، لديك واجهة FAT عامة واحدة والعديد من الفئات التي تنفذها.افترض أن لديك واجهة واحدة و50 فئة.إذا كان هناك تغيير في الواجهة، فيجب على جميع الفئات الخمسين تغيير تنفيذها.

    مع ISP، سوف تقوم بتقسيم واجهة FAT العامة إلى واجهات صغيرة محببة.إذا كان هناك تغيير في الواجهة الصغيرة، فلن تتأثر سوى الفئات التي تنفذ تلك الواجهة.

  2. قابلية الصيانة وسهولة الاستخدام:نظرًا لأن التغييرات تقتصر على الواجهة الدقيقة بدلاً من واجهة FACT العامة، فإن صيانة الكود تكون أسهل.لم تعد التعليمات البرمجية غير ذات الصلة جزءًا من فئات التنفيذ.

لتجنب جهود الانحدار، عندما يتغير سلوك واحد خاص بعميل واحد فقط أو سلوك واحد محدد.إذا قمت بدمج جميع أساليب السلوك الخاصة بك في واجهة واحدة كبيرة، فما عليك سوى التفكير في كيفية اختبار جميع أجزاء التعليمات البرمجية في نهاية المطاف حيث كل ما أشرت إليه هو تلك الواجهة، حتى عند حدوث تغييرات صغيرة فقط.

للحصول على شرح أكثر تفصيلاً، راجع مقالة مبدأ فصل الواجهة

ورقة روبرت مارتن حول هذا الموضوع يعطي شرحًا يتم ذكره بشكل أقل:

القوة العكسية التي يطبقها العملاء على الواجهات.

إذا كانت فئتان تعتمدان بشكل مباشر على طريقتين مختلفتين لفئة ثالثة، فإن ذلك يزيد من احتمالية تأثير التغييرات في أي من الفئتين الأوليين على الأخرى.

لنفترض أن لدينا ثلاث فئات: Red, Green, ، و Blue.

Red و Green كلاهما يعتمد Blue, لكن كل منها يعتمد على طريقة مختلفة.هذا يعني أن Red يعتمد على طريقة واحدة Blue ولكن لا يستخدم الطريقة الأخرى.على نفس المنوال، Green يعتمد على Blue, ، ولكن يستخدم طريقة واحدة فقط، وليس الأخرى.

انتهاك المبدأ موجود Red و Green لأن كل يعتمد على فئة - Blue - لكن لا استخدم إحدى طرقه على الأقل.

ما هي المشكلة التي يحتمل أن يخلقها هذا؟

  • أحتاج للتغيير Red, ، وأنا أتغير أيضًا Blue لتلبية احتياجات Red.
  • لم أغير الطريقة المحددة في الداخل Blue الذي - التي Green يعتمد على ذلك، ولكن على الرغم من ذلك، Green يعتمد على Blue ولقد تغيرت Blue, ، والتي لا يزال من الممكن أن تؤثر Green.
  • ولذلك، فإن التغييرات التي أجريتها على Red لديها القدرة على التأثير Blue لأنهم قادوني إلى تغيير الفصل الذي يعتمد عليه كلاهما.

هذه هي "القوة المتخلفة". نغير في بعض الأحيان الفصل بسبب احتياجات عملائها.إذا كان لدى تلك الفئة عملاء مختلفون يستخدمونها لأشياء مختلفة، فإننا نخاطر بالتأثير عليهم.

كما ذكرنا، فإن التعريف البسيط لمبدأ فصل الواجهة هو:

لا ينبغي إجبار أي عميل على الاعتماد على الأساليب التي لا يستخدمها.

بين ذلك والنقطة المذكورة أعلاه من ورقة روبرت مارتن، من الواضح أن العديد من التفسيرات لمزود خدمة الإنترنت تتحدث في الواقع عن مبادئ أخرى.

  • تعد الفئات أو الواجهات التي تحتوي على الكثير من الأساليب غير مرغوب فيها، ولكن ليس على وجه التحديد بسبب مزود خدمة الإنترنت.قد ينتهكون المسؤولية الفردية.لكن انتهاك مزود خدمة الإنترنت ليس في الواجهة الكبيرة أو الفئة الكبيرة - بل في الفئات التي يعتمد على على الواجهة الكبيرة إذا لم يستخدموا جميع أساليبها.إذا استخدموا جميع الأساليب، فلا يزال الأمر يبدو فوضويًا، لكن هذا لا علاقة له بمزود خدمة الإنترنت.
  • تعتبر الفئات التي تنفذ واجهة ولكنها تطرح استثناءات لطرق معينة سيئة، ولكن هذا ليس موفر خدمة الإنترنت أيضًا.مزود خدمة الإنترنت يدور حول الفئات التي تعتمد على واجهات، وليس الطبقات ذلك ينفذ واجهات.

إذا قمنا بـ "فصل الواجهة" في Google، فإن معظم النتائج الرئيسية التي تتضمن نماذج التعليمات البرمجية توضح الفئات التي تقوم بذلك لا تنفذ بالكامل واجهات، وهي ليست النقطة من مزود خدمة الإنترنت.حتى أن البعض يعيد التأكيد على المبدأ:

ينص مبدأ فصل الواجهة على أنه لا ينبغي إجبار العملاء على تنفيذ واجهات لا يستخدمونها

...ولكن هذا هو لا المبدأ.تشير ورقة التعريف إلى هذه المخاوف باعتبارها أثرًا جانبيًا لانتهاك مزود خدمة الإنترنت، ولكنها تشير إلى أنها انتهاكات لاستبدال ليسكوف.

علاوة على ذلك ، في كل مرة تتم فيها إضافة واجهة جديدة إلى الفئة الأساسية ، يجب تنفيذ تلك الواجهة (أو السماح لها بالتخلف) في الفئات المشتقة.في الواقع، هناك ممارسة مرتبطة تتمثل في إضافة هذه الواجهات إلى الفئة الأساسية كوظائف افتراضية صفرية بدلاً من وظائف افتراضية خالصة؛على وجه التحديد حتى لا يتم تحميل الفئات المشتقة الحاجة إلى تنفيذها.وكما تعلمنا في المقالة الثانية من هذا العمود، مثل هذه الممارسة ينتهك مبدأ استبدال ليسكوف (LSP)، مما يؤدي إلى مشاكل في الصيانة وإعادة الاستخدام.

علاوة على ذلك، فإن القول بأن العميل لا ينبغي عليه تنفيذ الأساليب التي لا يستخدمها ليس له معنى.ال عملاء للواجهة لا تنفذ أساليبها.

لا أقصد الاستشهاد بالورقة بشكل متفاخر كما لو كانت كتابًا مقدسًا أو شيء من هذا القبيل.ولكن إذا كنا سنستخدم اسم المبدأ الموضح في المقالة (اسم المقالة نفسها)، فيجب علينا أيضًا أن نأخذ في الاعتبار التعريف والشرح الفعلي الوارد في تلك المقالة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top