هذه المقالة واحدة من مقالات السلسلة “كيف شرحت التصميم غرضي التوجه لزوجتي“.
عمر: سنتعلم الآن مبدأ فصل الواجهات, و ها هي الصورة:
هل تريدني أن أدخل هذا؟ و لكن أين؟
ريم: ماذا تعني هذه الصورة؟
عمر: إنها تعني ما يلي:
“يجب ألّا يتم إكراه الزبائن[2] على الاعتماد على واجهات لا يستخدمونها”.
ريم: أرجوك أن توضح لي أكثر.
عمر: بالطبع:
افترضي أنك تريدين شراء جهاز تلفاز, و يتوجب عليك أن تختاري بين نوعين. أحدهما يحوي الكثير من القواطع و الأزرار, و يبدو لك معظمُ هذه القواطع و الأزرار مشوِّشاً و غير ضروري, في حين أنّ الجهاز الآخر فيه القليل من القواطع و الأزرار, و التي تبدو لك مألوفة و منطقية, فإذا قلتُ لك أنّ الجهازين يوفّران نفس القدرات و الوظائف تماماً, فأيّهما ستختارين؟
ريم: بالطبع سأختار الجهاز الذي يحوي العدد الأقل من الأزرار و القواطع.
عمر: نعم, و لكن لماذا؟
ريم: لأنني لست بحاجة للأزرار و القواطع التي تبدو مشوّشةً و غير ضرورية.
عمر: صحيح, و بشكل مشابه, افترضي أنّ لديك بعضُ الأصناف, و أنك تُظهرين قدرات هذه الأصناف باستخدام واجهات بحيث يتمكّن العالم الخارجيّ من معرفة القدرات المتاحة للاستخدام التي توفّرها هذه الأصناف, و بحيث يمكن لشيفرة الزبائن[3] أن تُكتب اعتماداً على هذه الواجهات (و ليس على الأصناف مباشرة). إذا كانت هذه الواجهات كبيرة زيادة عن اللزوم, و تحوي عدداً كبيراً من الطرائق, فسوف تبدو مُشوِّشةً للعالم الخارجي (للزبائن), بالإضافة إلى أنّ قابلية إعادة استخدام الواجهات الضخمة منخفضة, كما أنّ “الواجهات السّمينة” مثل هذه بعدد كبير من الطرائق غير ذات النّفع, تقود إلى درجة أعلى من الاقتران (الارتباط) بين الأصناف.
يقود هذا إلى مشكلة أخرى أيضاً, فإذا أردتِ لصنفٍ جديد أن يحقّق الواجهة سيتوجب على هذا الصنف أن يحوي شيفرة لكل الطرائق الموجوة في الواجهة, في حين أنّ بعض هذه الطرائق قد لا يحتاجها الصّنف على الإطلاق, و عمل هذا سيؤدي إلى زيادة غير ضرورية في التّعقيد[4], و إلى انخفاض القدرة على صيانة[5] النّظام و انخفاض درجة متانته[6].
يَضمَن مبدأ فصل الواجهات أنّ الواجهات تُبنى بحيث يكونُ لكلّ منها وظيفتُه الخاصّة, مما يجعلها محدّدةً و سهلة الفهم و قابلةً لإعادة الاستخدام.
ريم: فهمت, أنت تعني أنّه يتوجّب على الواجهات أن تحتوي الطرائق الضرورية, و لا شيء آخر, أليس كذلك؟
عمر: تماماً, دعينا نرى هذا المثال:
إنّ الواجهة التالية هي “واجهة سمينة” و هي تخرق مبدأ فصل الواجهات:
مثال عن واجهة تخرق مبدأفصل الواجهات
لاحظي أنّ الواجهة المسمّاة IBird تحوي الكثير من تصرفات العصافير إلى جانب عمليّة الطيران Fly(), فإذا أراد صنف ما يعبّر عن أحد أنواع الطيور (مثل النّعام) أن يحقّق هذه الواجهة, سيتوجّب عليه أن يوفر شيفرة تحقق الطريقة Fly(), رغم أن هذا غير ضروريّ (فالنّعام لا يطير).
ريم: هذا صحيح, فهل يتوجّب علينا إذاً شَطر هذه الواجهة إلى قسمين؟
عمر: صحيح, هذه “الواجهة السمينة” ينبغي عليها أن تُقسم إلى واجهتين منفصلتين, أولاهما هي IBird و ثانيتهما IFlyingBird, بحيث ترث الواجهةُ IFlyingBird الواجهةَ IBird.
الشكل الصحيح للواجهات وفقاً لمبدأ فصل الواجهات
إذا كان هناك طائر لا يستطيع الطيران (مثل النعامة), فسوف يحقق الواجهة IBird, أما لو كان هناك طائر يستطيع الطيران (مثل طائر الرفراف), فسوف يحقق الواجهة IFlyingBird.
ريم: إذاً, إذا أردنا العودة إلى المثال الذي فيه جهاز تلفاز بعدد كبير من الأزرار و القواطع: لابدّ أنّ المُصنِّع[7] يمتلك مخططاً[8] لهذا التلفاز تَظهر فيه أماكن وجود القواطع و الأزرار. إذا أراد المصنع مُستقبَلاً أن يصمم نموذجاً[9] جديداً من التلفاز, وأراد أن يعيد استخدام المخطط الخاص بالنموذج السابق كأساس لتصميم المخطط الجديد, سيضطر ان يضع في المخطط الجديد نفس العدد من القواطع و الأزرار حتى لو لم يُردها فيه… إنّ هذا سيجعل من المخطط الأول غير قابلٍ لإعادة الاستخدام عملياً.
عمر: صحيح.
ريم: و إذا أراد المصنّع حقاً أن يعيد استخدام المخطط, فينبغي عليه أن يقسّمه إلى أجزاء أصغر بحيث يمكنه إعادة استخدم هذه الأجزاء إذا أراد تصميم نموذج جديد من التلفاز.
عمر: نعم لقد وصلتك الفكرة تماماً.
صفحات السلسلة
المؤلف: Al-Farooque Shubho
المصدر: http://www.codeproject.com/Articles/93369/How-I-explained-OOD-to-my-wife
المترجم: غريب بهجت فلازي
[1] Interface Segregation Principle
[2] Clients
[3] Client Code
[4] Complexity
[5] Maintainability
[6] Robustness
[7] Manufacturer
[8] Blueprint
[9] Model
نقاش
Powered by Facebook Comments
Pingback: كيف شرحت التصميم الغرضيّ التوجّه لزوجتي – مبدأ المسؤوليّة الوحيدة | مترجم - Moutarjam