الگوهای طراحی Design Pattern
بسم الله الرحمن الرحیم
بخش چهارم
الگوی طراحی (Design Pattern)
الگو طراحی چیست؟
design pattern چیست؟
Design pattern ها راهکارهایی هستند برای رفع مشکلات طراحی نرم افزار، pattern ها یا همان الگوها باعث می شوند تا کدهای ما قابلیت استفاده مجدد داشته باشند.
در دنیای واقعی ما با مشکلات زیادی هر روز روبرو می شویم و برای آنها راهکارهایی خواهیم داشت و بسیاری از این راهکار را از دیگران یا بر حسب تجربه آموخته ایم. در دنیای نرم افزار نیز ما با مشکلات زیادی روبرو می شویم و بسیاری از این مشکلات را با روشهای خاصی حل می کنیم. این روش ها همان الگوها یا به اصطلاح pattern ها هستند.
حال اگر ما به صورت دقیق فعالیت هایی را انجام دهیم که باعث شوند میزان مشکلات ما کم تر شوند بدین معنا خواهد بود که ما از یک سری الگوهای رفتاری یا همان Design pattern استفاده می کنیم.
Design pattern ها یا روش های مختلفی برای حل مشکلات وجود دارد، که طبیعتا هر یک از این روش ها می تواند مشکلات خاصی را حل می کنند، در نتیجه هر تیم نرم افزاری بر اساس مشکلات و پروژه خود یکی از روش های Design pattern را می تواند انتخاب کند، البته می توان روشهای مختلفی را نیز کنار یکدیگر به کار گرفت.
کاربرد و هدف الگوهای طراحی
اما الگوهای طراحی بعد از الگو های معماری آمدند و در طراحی زیر سیستم ها، Package ها و Component ها استفاده می شوند و هدفشان ارائه راه حل هایی برای حل مشکلات معمول و تکراری می باشد، مشکلاتی مانند:
مدیریت حافظه
مدیرت اشاره گرها
synchronization and mutual exclusion
جلوگیری از بن بست (deadlock avoidance)
در Design pattern ها مفهومی به نام الگوی معماری (Architectural pattern) وجود دارد، این معماری مشخص کننده ترکیب ساختاری (Structural Arrangement) زیر سیستم های های نرم افزاری و قوانین ارتباطی ببین آنها می باشد.
لازم است توجه شود که الگوهای طراحی به حل مسأله کمک میکنند ولی راهحل کامل آنرا در اختیار ما نمیگذارند همچنین استفاده از الگوهای طراحی الزامی نیست و برنامه نویس بعد از درک درست از مسئله و با توجه به نیاز می تواند از این الگوها استفاده کند.
در اینجا سعی می کنیم تا به بررسی الگوهای طراحی از دو دیدگاه بپردازم، یکی تقسیم بندی الگوها از نظر GOF و دیگری از دیدگاه Martin Fowler.
بسم الله الرحمن الرحیم
بخش چهارم
الگوی طراحی (Design Pattern)
الگو طراحی چیست؟
design pattern چیست؟
Design pattern ها راهکارهایی هستند برای رفع مشکلات طراحی نرم افزار، pattern ها یا همان الگوها باعث می شوند تا کدهای ما قابلیت استفاده مجدد داشته باشند.
در دنیای واقعی ما با مشکلات زیادی هر روز روبرو می شویم و برای آنها راهکارهایی خواهیم داشت و بسیاری از این راهکار را از دیگران یا بر حسب تجربه آموخته ایم. در دنیای نرم افزار نیز ما با مشکلات زیادی روبرو می شویم و بسیاری از این مشکلات را با روشهای خاصی حل می کنیم. این روش ها همان الگوها یا به اصطلاح pattern ها هستند.
حال اگر ما به صورت دقیق فعالیت هایی را انجام دهیم که باعث شوند میزان مشکلات ما کم تر شوند بدین معنا خواهد بود که ما از یک سری الگوهای رفتاری یا همان Design pattern استفاده می کنیم.
Design pattern ها یا روش های مختلفی برای حل مشکلات وجود دارد، که طبیعتا هر یک از این روش ها می تواند مشکلات خاصی را حل می کنند، در نتیجه هر تیم نرم افزاری بر اساس مشکلات و پروژه خود یکی از روش های Design pattern را می تواند انتخاب کند، البته می توان روشهای مختلفی را نیز کنار یکدیگر به کار گرفت.
کاربرد و هدف الگوهای طراحی
اما الگوهای طراحی بعد از الگو های معماری آمدند و در طراحی زیر سیستم ها، Package ها و Component ها استفاده می شوند و هدفشان ارائه راه حل هایی برای حل مشکلات معمول و تکراری می باشد، مشکلاتی مانند:
مدیریت حافظه
مدیرت اشاره گرها
synchronization and mutual exclusion
جلوگیری از بن بست (deadlock avoidance)
در Design pattern ها مفهومی به نام الگوی معماری (Architectural pattern) وجود دارد، این معماری مشخص کننده ترکیب ساختاری (Structural Arrangement) زیر سیستم های های نرم افزاری و قوانین ارتباطی ببین آنها می باشد.
لازم است توجه شود که الگوهای طراحی به حل مسأله کمک میکنند ولی راهحل کامل آنرا در اختیار ما نمیگذارند همچنین استفاده از الگوهای طراحی الزامی نیست و برنامه نویس بعد از درک درست از مسئله و با توجه به نیاز می تواند از این الگوها استفاده کند.
در اینجا سعی می کنیم تا به بررسی الگوهای طراحی از دو دیدگاه بپردازم، یکی تقسیم بندی الگوها از نظر GOF و دیگری از دیدگاه Martin Fowler.
الگوی طراحی (GoF (Gang of Four
اولین کسی که از الگوها برای تولید نرمافزار کمک گرفت فردی به نام اریک گاما بود که در سال 1991 در تز دکترای خود به بحث و بررسی الگوها پرداخت. گاما به همراه سه نفر دیگر گروه GoF را تشکیل دادند و در کتابی الگوهای خود را توصیف کردند. این کتاب با استقبال عمومی مواجه شد و از آن پس الگوهای طراحی GoF شهرت بسیاری پیدا کرد و در گسترههای مختلف علم مهندسی نرمافزار به کار گرفته شدند.
الگوهای GoF از لحاظ هدف به 3 دسته کلی تقسیم شده اند:
-
الگوهای آفرینشی (Creational)
در فرآیندهای تولید اشیاء استفاده میشوند و عبارتند از:
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Singleton
-
الگوهای ساختاری (Structural)
در ترکیب کلاسها و اشیاء مورد استفاده قرار میگیرند و عبارتند از :
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
-
الگوهای رفتاری (Behavioral)
چگونگی تعامل بین کلاسها یا اشیاء و نحوهی توزیع مسؤلیت بین آنها را مورد بحث قرار میدهند و عبارتند از
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Visitor
- Template Method
- Strategy
Design pattern و حوزه ها
از لحاظ تقسیم بندی حوزه نیز در دو حوزه توان انواع Design Pattern را بررسی کرد.
کلاس ها و Design pattern
این نوع الگو به روابط بین کلاسها می پردازد و در زمان کامپایل نیز ایستا می باشد (مشخص است که کلاس ها در زمان اجرا تغییری نخواهند کرد!).
اشیا و Design pattern
الگوهای شی به روابط اشیا می پردازند که می تواند در حین اجرا تغییر کنند و پویاتر هستند.
از الگوهایی که در سه قسمت بالا ذکر شدند تنها الگو های Adapter، Interpreter، Factory Method، Template Method در حوزه کلاس و مابقی در حوزه شی قرار می گیرند، که در تصویر زیر می توانید این دسته بندی را مشاهده کنید.
ممکن است ما در نوشتن برنامه های خود از این الگو ها استفاده کرده باشیم اما هیچ وقت به صورت دقیق متوجه نشده باشیم، همچنین باید گفت که بعضی از الگوها دارای ساختاری مشابه و اهدافی متفاوت هستند. نکته بسیار مهم در مورد الگوهای طراحی تغییر شکل آنها در کاربردهای مختلف است، یعنی تنها با استفاده عملی آنها و به کارگیری در پروژه های واقعی است که می توان به اهمیت و نحوه عملکرد آنها پی برد و همه ی این موارد نشان دهنده این است که انتخاب نوع الگو با توجه به میزان اهمیت و گستردگی پروژه برعهده مدیران نرم افزار می باشد.
در بخش های بعدی شما را با چند نوع از الگوهای پرکاربرد آشنا خواهیم کرد.