قسمت اول این مقاله را در اینجا بخوانید.
۲-استفاده از Interface:
راه کار بعدی که در تیم فنی مطرح می شود استفاده از Interface می باشد. به این صورت که ما دو اینترفیس به نام Fly و Quack تعریف و هر اردکی توانایی Quack یا Fly دارد این دو اینترفیس را Implement کند. اما این کار هم یک مشکل بزرگ دارد و آن هم این است که به شدت سبب ایجاد کد تکراری خواهد شد. زیرا ممکن است دو اردک صدای Quack یکسان داشته باشند ولی کد آن باید برای هر اردک جداگانه تعریف شود. بعد اگر تغییری در صدای Quack اردک بخواهیم داشته باشیم باید کلاس تمامی اردک ها را تغییر بدهیم که خیلی افتضاح است پس این هم راه حل تمیزی نیست.
نکته :
یکی از مواردی که در توسعه یک نرم افزار همیشه و همیشه وجود دارد تغییر است. پس کد شما باید طوری طراحی شود که با تغییر کردن یک Object کمترین تغییر در نرم افزار به وجود آید.
خب حالا که نه ارث بری و نه استفاده از اینترفیس راه حل مناسب نیست پس چه می توانیم بکنیم.
نکته پایه طراحی ۱: قسمت هایی از نرم افزار که ممکن است تغییر کند را شناسایی و آن را از قسمت هایی که ثابت می ماند جدا کنید.
به عبارت دیگر اگر شما قسمت هایی از نرم افزار را که تغییر می کند تشخیص دهید، با هر تغییر این نکته را می دانید که باید یک رفتار جدید در خارج از قسمت های ثابت تعریف کنید و از آن استفاده کنید.
به زبان دیگر :
آن بخشی که تغییر می کند را بگیر و کپسوله سازی کن. بعدا می توانید بخش هایی را که قرار است تغییر کنند بدون تغییر دیگر بخش ها توسعه دهید.
این نکته را هم باید بدانید که اصل بالا که مطرح شد پایه ی همه ی الگوی های طراحی و Design Patternها می باشد. همه Pattern ها راهی برای جداسازی قسمت هایی از سیستم که قرار است تغییر کنند از قسمت های ثابت به وجود می آورد.
خب حالا به مسئله خودمان برگردیم.
در اینجا قسمت های متغیر ما متدهای Fly و Quack هستند که با آن ها مشکل داریم. برای جداسازی این دو از Duck دو مجموعه کلاس جداگانه برای Fly و Quack ایجاد می کنیم. هر مجموعه کلاس تمامی پیاده سازی های آن دو رفتار را در خود دارد.
به طور مثال یک کلاس ممکن است صدای نوع A اردک را پیاده سازی کند و کلاس دیگر صدای نوع B را و کلاس دیگر سکوت را پیاده سازی کند.
این جداسازی رفتار ها از کلاس Duck سبب ایجاد این متدها بیرون از کلاس می شود و مجموعه کلاس هایی ایجاد می کند که هر کلاس یک رفتار را نمایش می دهد.
این مجموعه کلاس ها که نشان دهنده رفتار های مختلف هستند را چگونه طراحی کنیم؟
همیشه باید انعطاف پذیری را در طراحی هایمان در نظر بگیریم. می دانیم که می خواهیم این رفتار ها را به شی های مختلف نسبت دهیم. به طور مثال می خواهیم که به MallardDuck نوع خاصی از رفتار پرواز را نسبت دهیم و حتی ممکن است این رفتار را بخواهیم بر اساس شرایط برای همین اردک و در Run Time تغییر دهیم که برای این کار متدی لازم داریم که رفتار پرواز را در Run time ست کنیم.
منبع : Head First Design Pattern
قسمت سوم این مقاله را در اینجا بخوانید.