بسمهتعالي فصل سيزدهم الگوهاي طراحي
اهداف جلسه بررسی مفاهيم الگوهاي طراحي شناخت کاربردهاي الگوهاي طراحي آشنايی با چند الگوي طراحي آشنايي با ضدالگوها (AntiPattern) معرفي ضدالگوهاي متداول
فهرست مطالب عوامل ايجاد الگوي طراحي ساختارهاي طراحي تکرارشونده مفهوم الگوي طراحي تاريخچه الگوهاي طراحي ساختار الگوي طراحي معرفي چند الگو طراحي ضدالگوها
عوامل ايجاد الگوهاي طراحي روشهاي تحليل و طراحي شيگرا تاکيد بسياري بر استفاده از نمادها در طراحي دارند براي مستندسازي و ذکر خصوصيات مناسب هستند اما تحليل و طراحي شيگرا تنها رسم نمودار نيست نقاشي خوب دليل بر طراحي خوبي نيست! طراحي شيگراي خوب نياز به سالها تجربه دارد طراحي به اندازه دانستن گرامر زبان اهميت دارد بيشترين استفاده مجدد در هنگام طراحي اتفاق ميافتد مشکلات با تجربه طراحي رفع ميشوند
ساختارهاي طراحي تکرار شونده ساختارهاي تکرارشونده سيستمهاي شيگرا سبب ارتقاي تجريد (Abstraction) انعطافپذيري (Flexibility) واحدبندي (Modularity) ظرافت (Elegance) که حاوي اطلاعات ارزشمند طراحي هستند اما نميتوان از اين ساختارها به صورت مستقيم استفاده نمود مسئله اصلي: شنـاسايي، دستهبندي و استفـاده از آنهاست
الگوي طراحي تجريدي از ساختار طراحي تکرارشونده است شامل کلاس و/يا اشياء وابستگيها (Dependencies) ساختارها (Structures) تعاملات (Interactions) قراردادها (Conventions) نامها و ساختار طراحي را بهصورت صريح تعيين ميکند چکيدهاي از تجربيات طراحي است
الگوي طراحي (ادامه) مجموعهاي از بهترين تجربيات است راهحلي نمونه براي مسئلهاي در زمينه خاص است راهي براي تسهيل ارتباطات بين ذينفعان الگوها پيدا شدهاند و ابداع نشدهاند
تاريخچه الگوهاي طراحي 1964- Christopher Alexander کتاب معماري و طراحي شهري بيان نکاتي در مورد ترکيب شکلها زبان الگو راهي براي ساختن سريع
تاريخچه الگوهاي طراحي (ادامه) 1987- Ward Cunningham & Kent Beck تصميم به استفاده از ايدههاي الکساندر توسعه پنج الگو براي برنامهنويسان مبتدي Smalltalk ارائه مقالهاي در اين زمينه در کنفرانس OOPSLA'87
تاريخچه الگوهاي طراحي (ادامه) 1995- Erich Gamma، Richard Helm، Ralph Johnson و John Vlissides طراحي نرمافزار ارائه کتاب الگوهاي طراحي
نمونه الگوي طراحي
ساختار الگوي طراحي ساختارهاي متعددي براي بيان الگوهاي طراحي پيشنهاد شده است چهار بخش اصلي هر الگوي طراحي نام الگو مسئله (شامل اجبارهاي مسئله) راهحل نتايج و کاربردها
ساختار الگوي طراحي (ادامه) ساختار پيشنهاديAlexander نام زمينه مسئله (اجبارها) راهحل (پيکربندي و چگونگي راهحل) بيان ارتباط بين زمينه، مسئله و راهحل
ساختار الگوي طراحي (ادامه) ساختار پيشنهاديPolti نام عناصر توصيف نمونهها موارد استفاده جزئيات
ساختار الگوي طراحي (ادامه) ساختار پيشنهاديGoF نام طبقهبندي منظور اسامي مشابه انگيزه کاربرد ساختار شرکاء همکاري نتايج پيادهسازي/نمونه کد موارد استفاده الگوهاي مرتبط
ساختار الگوي طراحي (ادامه) نام (Name) بطور خلاصه و موجز کاربرد الگو را نشان ميدهد طبقهبندي (Classification) طبقهبندي براساس کاري که الگو انجام ميدهد Creational: بر روي فرآيند ايجاد اشيا و کلاسها تمرکز دارند Structural : بر روي ترکيب کلاسها و اشيا تمرکز دارند Behavioral: بر روي رفتار کلاسها و اشيا و توزيع وظيفه تمرکز دارند حوزه کاربرد الگوها شامل اشياء و کلاسها هستند
ساختار الگوي طراحي (ادامه) Purpose Patterns Classification Behavioral Structural Creational Interpreter Template Method Adapter Factory Method Class Scope Chain of Responsibility Command Iterator Mediator Memento Flyweight Observer State Strategy Visitor Adapter Bridge Composite Decorator Facade Proxy Abstract Factory Builder Prototype Singleton Object
ساختار الگوي طراحي (ادامه) منظور جمله کوتاهي که جواب به سوالات زير است الگو چه کاري انجام ميدهد؟ علت وجودي الگو چيست؟ چه مشکل يا مسئله خاصي را حل ميکند؟ نامهاي مشابه در صورتيکه الگو داراي اسامي شناخته شده ديگري است، قيد ميشود
ساختار الگوي طراحي (ادامه) انگيزه (Motivation) سناريويي که مشکل طراحي و اينکه چگونه کلاسها و اشياي موجود در الگو مشکل را حل ميکنند را نشان ميدهد سناريو کمک ميکند تا درک بهتري از توصيفاتي مربوط به الگو داشته باشيد کاربردپذيري (Applicability) وضعيتي که الگو ميتواند به کار برده شود و نحوة شناسايي اين وضعيت
ساختار الگوي طراحي (ادامه) ساختار (Structure) نمايشي گرافيکي از کلاسها در الگو با استفاده از نمادگذاري OMT (Object Modeling Technique) براي نمايش تعاملات ميتوانيد از نمودار ترتيبي يا نمودار همکاري استفاده نمائيد شرکاء (Participants) کلاسها و/يا اشيايي که در الگوي طراحي و انجام وظايفش مشارکت ميکنند
ساختار الگوي طراحي (ادامه) همکاري (Collaborations) نحوة همکاري شرکاء در انجام وظايف الگوي طراحي نتايج (Consequences) در اين بخش به سوالات ذيل پاسخ گفته ميشود چگونه الگو، اهداف مورد نظر خود را برآورده ميسازد؟ چه توازنها و نتايجي با به کار بردن الگو بدست ميآيد؟ چه جنبههايي از ساختار سيستم ميتوانند متفاوت باشند؟
ساختار الگوي طراحي (ادامه) پيادهسازي نکات فني، نقاط ضعف و ديگر نکاتي که بايد در استفاده از الگو مد نظر قرار داد نمونه کد بخشهاي از کد الگو به زبان C++ يا Smalltalk استفادههاي شناخته شده نمونههاي از الگو در سيستمهاي واقعي الگوهاي مرتبط الگوهاي که ارتباط نزديکي با الگوي طراحي مورد نظر دارند
الگوهاي طراحي - Abstract Factory منظور رابطي براي ايجاد خانوادهاي از اشياي مرتبط يا وابسته بدون مشخصکردن کلاسهاي آنها فراهم ميکند کاربردپذيري وقتي نميتوان ساختار ارتباطي بين گروهي از کلاسهاي مرتبط را پيشبيني نمود
الگوهاي طراحي - Abstract Factory ساختار
الگوهاي طراحي - Abstract Factory
الگوهاي طراحي - Abstract Factory نتايج انعطافپذيري تجريد توسعه آن دشوار است پيادهسازي استفاده از پارامترها راهي براي کنترل اندازه رابط است اين الگو در واقع مجموعهاي از الگوي Factory Method است
الگوهاي طراحي - Bridge منظور کاربردپذيري براي جداسازي رابط مجرد(منطقي) از پيادهسازياش (فيزيکي) مورد استفاده قرار ميگيرد کاربردپذيري وقتي رابط و پيادهسازياش بايد با يکديگر متفاوت باشند وقتي نياز به يک رابط واحد براي تعامل با ديگر کلاسها باشد
الگوهاي طراحي - Bridge ساختار Structure
الگوهاي طراحي - Bridge نتايج پيادهسازي رابط مجرد و پيادهسازي از يکديگر مجزا ميشوند پيادهسازي ميتواند مجزا و متغير باشد رابط بايد بهگونهاي عمومي باشد که همه رابطهايي که پيادهسازي ميشوند را حمايت کند پيادهسازي تنها يک پيادهساز بايد وجود داشته باشد ايجاد پيادهساز صحيح دشوار است اشتراک پيادهسازها بايد مد نظر قرار گيرد
الگوهاي طراحي - Composite منظور ترکيب اشيا در ساختاري درختي براي نمايش سلسله مراتب Part-Whole کاربردپذيري وقتي اشيا نياز به ترکيب بهصورت بازگشتي (Recursive) دارند و تفاوتي بين اشياي ترکيبي و ساده وجود ندارند و اشيا در ساختار ميتوانند واحد در نظر گرفته شوند
الگوهاي طراحي - Composite ساختار
الگوهاي طراحي - Composite کلاس Graphic شامل مجموعهاي از کلاسهاي ديگر است که تفاوتي با کلاس اصلي ندارند
الگوهاي طراحي - Composite گره برگ گره ترکيبي CORBA Naming Service
الگوهاي طراحي - Composite نتايج همساني: بدون در نظر گرفتن پيچيدگي همه اشيا يکسانند قابليت توسعه: مولفههاي جديد براحتي ميتوانند افزوده شوند سربار: سربار تعداد اشياي جديد را کاهش ميدهد پيادهسازي روشي براي شناسايي والدين و فرزندان بايد استفاده شود براي والدين و فرزندان از يک رابط استفاده ميشود حذف يک فرزند مسئوليت دارد! (اين فرزند ميتواند فرزنداني داشته باشد و سبب ايجاد اشياي يتيم (Orphan) شود)
الگوهاي طراحي - Decorator منظور افزودن وظيفه جديد به يک شي به صورت پويا کاربردپذيري وقتي نياز به افزودن وظيفه جديد به يک شي به صورت پويا، شفاف و بدون تاثير بر ديگر اشيا باشد حذف وظيفه خاصي از يک شي بهصورت پويا وقتي توسعه کلاس به زيرکلاسها غيرممکن باشد
الگوهاي طراحي - Decorator ساختار
الگوهاي طراحي - Decorator نتايج وظايف ميتوانند در زمان اجرا افزوده/حذف شوند موجب کاهش رشد ساختار سلسلهمراتبي ميشود سبب انسداد رابط ميشود ترکيب decorator ها بسيار دشوار است پيادهسازي مطابقت رابط decorator ها بايد در نظر گرفته شود براي decorator از کلاسي سبک و مجرد استفاده نمائيد در صورتيکه نياز به افزودن يک وظيفه داريد، نياز به تعريف کلاس براي decorator نداريد
الگوهاي طراحي - Mediator منظور تعريف شيي که چگونگي تعامل بين اشياء ديگر را پنهان سازد کاربردپذيري وقتي تعدادي شي با يکديگر بهصورت خوشتعريف تعامل دارند اما تعامل آنها پيچيده است وقتي استفاده مجدد يک شي بهخاطر تعامل زياد آن با ديگر اشيا دشوار باشد وقتي رفتاري بين چند کلاس توزيع شده است و بايد بدون استفاده از زيرکلاسها سفارشي شود
الگوهاي طراحي - Mediator ساختار
الگوهاي طراحي - Mediator
الگوهاي طراحي - Mediator نتايج تعداد زيرکلاسها را کاهش ميدهد اتصال سست بين کلاسهاي مجاور را افزايش ميدهد ارتباط چند به چند را به ارتباط يک به يک تبديل ميکند يک کنترلکننده مرکزي ايجاد ميکند پيادهسازي نيازي به تعريف کلاس مجرد Mediator نيست زيرا کلاسهاي همکار ميتوانند با يک Mediator کار کنند
الگوهاي طراحي - Observer منظور تعريف يک رابطه يک به چند بين اشياء بصورتيکه وقتي يک شي حالتش را تغيير ميدهد، بقيه اشيا مطلع شده و بروز شوند کاربردپذيري وقتي تجريدي داراي دو جنبه بوده و يکي به ديگري وابسته باشد وقتي تغيير در يک شي سبب تغيير ديگر اشيا ميشود و نميدانيد چه تعداد شي ديگر نياز به تغيير دارند وقتي يک شي نياز به مطلع ساختن شي ديگر دارد و در مورد چگونگي آن شي اطلاعي ندارد
الگوهاي طراحي - Observer ساختار
الگوهاي طراحي - Observer مثال
الگوهاي طراحي - Observer نتايج واحدبندي: Subject و Observerها ميتوانند مستقل باشند قابليت توسعه: ميتوان هر تعداد Observer تعريف نمود قابليت سفارشي شدن: Observerهاي متفاوت، ديدهاي مختلف را نمايش ميدهند بروزرساني غيرمنتظره: Observerها اطلاعي از يکديگر ندارند سربار بروزرساني: بروزرساني سربار زيادي ايجاد مينمايد
الگوهاي طراحي - Observer پيادهسازي نگاشت Subjectها به Observerهاي متناظرشان راهي ساده براي در جريان بودن Subject از بروزرساني Observer است ارجاع معلق به Subjectهاي حذف شده بايد مورد توجه قرار گيرند از پروتکلهاي بروزرساني ويژه Observer (مدلهاي push and pull) اجتناب نمائيد
ضدالگوها (AntiPatterns) ايده ضدالگوها از آنجا ناشي شده است که اغلب کارهاي منتشر در مهندسي نرمافزار به راهحلهاي سازنده و موثر تمرکز دارد ضدالگوها بر راهحلهاي منفي و ناموفق تمرکز دارند ضدالگو مجموعهاي از راهحلهاي متداول که براي حل يک مسئله اتفاق ميافتند و بطورقطعي نتايج منفي يا ناموفق توليد نمودهاند را توصيف مينمايد
ضدالگوها (ادامه) همانطور که نياز به دانستن الگوها در زمينه خاص وجود دارد، دانستن وجود يا عدم وجود ضدالگو ميتواند به توسعه بهتر نرمافزار کمک کند بسياري از مهندسان نرمافزار ميخواهند بدانند «آيا راهي که ميروند به شکست منجر ميشود»
مثالي از ضدالگوها در سطح مديريت پروژه پنج پروژه از شش پروژه به شکست منجر شدهاند! يک سوم پروژههاي نرمافزاري رها شدهاند! بودجه و زمان واقعي انجام پروژه بيش از دو برابر از آنچه تخمين زده ميشود، است!!!
مثالي از ضدالگوها (ادامه) بحث امروز فناوري مولفهها اشيا توزيعشده معماري سرويسگرا استفاده مجدد از نرمافزار عاملهاي نرمافزار (Agents) رابط Web کار ديروز برنامهنويسي ساختاريافته طراحي بالا به پائين معماري Client/Server توليد کد از مدل
رابطه بين الگو و ضدالگو اغلب الگوهاي طراحي منجر به ضدالگو ميشوند برنامهنويسي رويهاي در دهه 60 و 70 يک الگوي طراحي بود، اما در حال حاضر ضدالگو است شيگرايي در حال حاضر يک الگو است، اما در حال تبديل به ضدالگو است
رابطه بين الگو و ضدالگو (ادامه) نشانهها و نتايج راهحل ضدالگو راهحل جمعبندي شده زمينه و علل مزايا راهحلهاي مرتبط نتايج زمينه و اجبارها مشکل راهحل مزايا راهحلهاي مرتبط نتايج زمينه در زمان تغيير ميکند
نمونه ضدالگوها The Blob Continuous obsolescence Lava Flow Ambiguous viewpoint Functional decomposition Poltergeists Boat Anchor Golden Hammer Dead End Spaghetti Code Input Kludge Walking through a Minefield Cut-and-Paste Programming Mushroom Management
طبقهبندي ضدالگوها ضدالگوهاي توسعه ضدالگوهاي معماري ضدالگوهاي مديريتي
ضدالگوهاي توسعه - Lava Flow مشکل استفاده از کد قديمي و اطلاعات طراحي فراموششده در طراحي دايمالتغيير نمونه طراح ارشد استعفا نموده است طراح جديد روش بهتري ارائه نموده است، اما بدليل عدم آشنايي با کد نميتواند آنها را حذف نمايد
ضدالگوهاي توسعه - Lava Flow علل توزيع کنترلنشده کدهاي اتمام نشده يا اصلاح نشده قسمتها و مسيرهايي که براي تست در کد قرار داده شده بودند، حذف نشدند شکاف در معماري بخاطر استفاده از فناوري قديمي شکاف در معماري وقتي بوجود ميآيد که معماري اوليه پس از شروع توسعه دچار تغييرات شگرف شود فقدان معماري فقدان مديريت پيکربندي
ضدالگوهاي توسعه - Lava Flow راهحل استفاده از سيستم مديريت پيکربندي سبب ميشود که کدهاي کهنه شناسايي و حذف شوند تکميلنمودن طراحي (قديمي) استفاده از يک معماري سالم براي پيشبردن مراحل توسعه استفاده از رابط در سطح سيستم که خوش-تعريف، پايا و بدرستي مستند شده باشد
ضدالگوهاي توسعه - Blob مشکل استفاده از سبک طراحي رويهاي منجر به ايجاد كلاسي با مسئوليت بسيار زياد ميشود بقيه كلاسها تنها داده نگهداري مينمايند اين کلاس همان کلاسي است که قلب معماري خواهد بود اين کلاس پردازش و ديگر دادهها را انحصاري مينمايد
ضدالگوهاي توسعه - Blob علل فقدان ديدگاه معماري شيگرايي عدم وجود التزام به معماري طراح رويهاي معمار ارشد است عدم تمايل توسعهدهندگان در طراحي کلاسهاي جديد و كارآمد در پروژههاي تکراري افراد سعي ميکنند کار خود را افزايش ندهند و ترجيح ميدهند از کلاسهاي قديميتر استفاده نمايند، بدون اينکه نياز به نوآوري داشته باشند
ضدالگوهاي توسعه - Blob راهحل توزيع مجدد وظيفهمندي جداسازي اثر تغييرات تعيين يا طبقهبندي خصوصيات و عمليات حذف «ارتباطات بسيار دور»، زائد يا غيرمستقيم حذف تمام ارتباطات موقت
پرسش و پاسخ