من دوست دارم مطالبی که یاد میگیرم را با افراد دیگر نیز مطرح کنم. در این نوشتار به توضیح پترن façade از سری پترن های structural از GoF پرداخته میشود.
پترن façade برای ساده تر شدن استفاده از APIها به کار میرود. در صورتی که کدها از ساختار مناسبی برخوردار نباشند و یا استفاده از آنها برای کاربر گنگ باشد میتوان با استفاده از این پترن، استفاده از API را ساده تر کرده و یا مواردی که لازم است توسط کاربر دیده نشود، از او بپوشانیم.
این پترن یک پترن refactoring است. یعنی در ابتدا کد نامناسب یا پیچیده ای نوشته شده است و میخواهیم با کمک این پترن استفاده از کد را بهبود ببخشیم. کلمه ی façade به معنای نمای خارجی و منظر( منظر به معنی دریچه ی دیدن) است. کارکرد پترن Façade نیز از معنای نام آن پیروی میکند یعنی با استفاده از این پترن دریچه ی دیدی به یک subsystem ایجاد میشود. در استفاده های امروزی از façade تنها ارتباط به subsystem از طریق آبجکت façade است و در استفاده های قدیم تر از این پترن امکان استفاده ی مستقیم از subsystem در کنار façade object وجود داشت که اکنون این مورد در پترن façade مورد استفاده نمیباشد و تنها از طریق façade object ممکن است. شکل 1 نحوه ی کارکرد پترن فساد را نمایش میدهد.
پترن façade یک interface واحد بر روی کل subsystem ایجاد میکند. بدون این پترن، استفاده کننده از subsystem لازم بود که interface هر یک از بخش های را بشناسد، ترتیب استفاده از آنها و پیش نیاز های مورد نیاز را برای استفاده بداند. بنابراین کلاس های بیرونی subsystem دیگر با تمامی کلاس های داخلی در ارتباط نیست و کار Instance گرفتن، سرویس گرفتن و ... را خودش انجام میدهد. در حقیقت کار چرخوانی انجام میدهد. این کلاس قرار نیست هیچ گونه پردازشی انجام دهد بلکه کارها بر عهده ی کلاس های داخلی subsystem است و این کلاس آن ها را فراخوانی میکند. مزایای استفاده از پترن façade در شکل 2 آمده است.
در نامگذاری کلاس façade لازم است کلمه ی façade ذکر شود تا تمامی تیم برنامه نویسان بدانند که این کلاس یک Façade است زیرا به محض انجام پردازشی توسط خودش، کلاس به حالت God class در می آید بنابراین در نامگذاری دقت شود تا در زمان maintenance پردازشی انجام ندهد و برنامه نویسان این کلاس را سنگین نکنند.
این الگوریتم coupling را بسیار پایین می آورد زیرا ما در ارتباط با تنها کلاس façade هستیم ولی generality ندارد زیرا تنها محدود به اینترفیس آن میتوان از آن استفاده کرد در حالی که اگر از خود subsystem مستقیم استفاده میشد ممکن بود به تنوع بیشتری دست یافت. این روش مزیت سادگی در استفاده را برای کلاینت به همراه دارد. میتوان برای کلاینتهای مختلف چندین Façade متفاوت بر روی یک subsystem تعریف کرد تا بتوان بحث generality را نیز گسترش داد. بنابراین subsystem محدود به تنها یک façade نیست.
الگوی façade با کمک composition کار میکند. بنابراین در صورتی که نیاز به استفاده از inheritance بود، در آنجا کاربرد ندارد.
موارد استفاده شده از این پترن در جاوا به صورت زیر است:
یک مثال کاربردی از آن در شکل 3 آمده است. در اینجا تنها با صدا کردن کلاس compiler که در اینجا façade class است، دیگر نیازی به نمونه گرفتن از نیازمندی های کامپایل کردن مانند tokenizer، parser مبرا شده و تنها یک instance از compiler و فراخوانی متد compiler کفایت میکند.
نمونه ی دیگری از مثال استفاده از پترن façade در شکل 4 آمده است. در این مثال کاربر با کمک کلاس HomeTheaterFacade به راحتی میتواند با سیستم صوتی تصویری خود ارتباط برقرار کند و نیازی به دانستن نحوه ی استفاده ی جداگانه از هر کدام از کلاس ها نیست و استفاده از سیستم راحتتر شده است.
موارد مورد استفاده از façade به صورت زیر است.
1- اغلب زمانی که درخواست میشود سیستم wrap شود و روی آن یک interface تعریف شود منظور داشتن façade است که به داخل subsystem ارتباطی برقرار نباشد. مکان هایی که خیلی stable نیستند و دائم تغییر میکنند برای جلوگیری از انتشار این تغییر به جاهایی که به این بخش ها مرتبط هستند، روی آنها façade تعریف میشود. بنابراین می توان بخش های غیر stable را پوشاند و بقیه را از این تغییرات محفوظ نگه دارند.
2- کلاس های façade نماینده ی subsystem است به همین علت میتوان تغییرات کل subsystem از طریق این نماینده به subsystem های دیگر اطلاع داده شود. بنابراین observer بودن از طریق façade ها اعمال شود.
3- در معماری لایه ای برای اینکه ارتباطی با داخل لایه برقرار نباشد در هر لایه یک façade قرار داده میشود. تا لایه ها از داخل هم به هم مرتبط نباشند و لایه ها به صورت یک component باشند.
زمانی که برنامه نویسی مبتنی بر component معرفی گردید، استفاده از پترن façade گسترش پیدا کرد.
دوستی داشتم که میگفت فساد کنین که باعث پیشرفت میشود! شما هم فساد کنین کدهاتون قطعا پیشرفت میکند.
از اینکه زمان گذاشتید و مطالعه کردید سپاس گزارم. امیدوارم این مطلب برای شما مفید بوده باشد.
منابع مورد استفاده در این نوشتار:کلاس Design Patterns in Java: Structural By Bryan Hansen از سایت Pluralsight، کلاس درس طراحی الگو استاد رامسین در دانشگاه شریف. کتاب head first design pattern.