Design patterns

Design patterns

@code_crafters


این پست ادامه اموزش دیزاین پترن ها هست و اگر بخش اول رو ندیدید حتما ببینید

تو این بخش ما قراره سه تا دیزاین پترن bridge pattern , adapter pattern , decorator pattern رو با مثال توضیح بدیم.

مشکل : انفجار ساب‌کلاس ها

برای مثال زدن اینجا از ماژول لاگ پایتون استفاده میکنیم.

فرض کنید یک کلاس بیس لاگ داریم و چند ساب‌کلاس برای مقصد های جدید، همچنین نیاز داریم که لاگ هارو فیلتر کنیم ( مثلا کاربر ما نیاز داره که فقط لاگ هایی که مربوط به ارور هست رو ببینه) و دولوپر یک کلاسی به نام FilteredLogger میسازه.

مشکل شروع شد! فرض کنید ما میخوایم لاگ های فیلتر شده رو تو سوکت بنویسیم بجای فایل، حالا باید یک کلاس دیگه متناسب با سوکت تعریف بکنیم . . . تو اینجا میشه 3*2 =6 کلاس و همینطور تعداد کلاس ها به صورت هندسی افزایش پیدا میکنه.


راه حل اول :

- Adapter pattern

تو فارسی اداپته شدن رو داریم که به معنای سازگار شدن / سازگار کردن هست.

ما میایم مکانیزم های خروجی پیام هارو طوری تغییر میدیم که بشه شبیه ابجکت فایلی که لاگر به عنوان ورودی انتظار داره دریافت بکنه.

پس کلاس Logger , FilteredLogger ثابت میمونه و بقیه کلاس ها تغییر میکنه.


راه حل دوم :

- Bridge pattern

این دیزاین پترن رفتار یک کلاس رو بین یک شی "انتزاعی" بیرونی و یک شی "پیاده سازی" که داخل ان پیچیده شده (wrap) تقسیم میکنه.

مثل دیزاین پترن اداپتر اینجا هم یک رده از کلاس ها بر نوشتن حاکم هستند. ولی بجای اینکه بیایم خروجی کلاس هارو با توجه به ابجکت فایل پایتون تغییر بدیم، میتونیم رابط کلاس پیچیده شده (wrapped) رو، خودمون بنویسیم.

پس میایم و ابجکت داخلی پیاده سازی رو جوری طراحی میکنیم که یک متد واحد به نام emit داشته باشد و دیگر نیازی به ساپورت کردن متد flush که معمولا بلا استفاده بود نیست.


راه حل سوم :

- Decorator pattern

حالا اگر بخواهیم دو فیلتر متفاوت رو روی لاگ اعمال کنیم باید چه کنیم؟ مثلا یکی بر اساس نوع لاگ و دیگری بر اساس کلمه ای که در ان وجود دارد.

قسمت قبلی یعنی دیزاین پترن بریج رو اگر نگاه کنیم دلیلی که ما نمیتونستیم دو فیلتر رو باهم ادغام بکنیم این بود که شما برای لاگ کردن میومدی از متد log() FilteredLogger استفاده میکردی و اون از متد emit() هندلر استفاده میکرد و اگر شما به کلاس فیلترلاگر خودش رو میدادی متدی به نام emit() نداشت و ارور AttributeError میگرفتی. حالا اگر ما بیایم و ظاهر فیلتر و هندلر هامون رو یکی بکنیم میتونیم از فیلتر چندگانه استفاده بکنیم چون همگی یک متد دارن به نام log()


@code_crafters

Report Page