IranIT.info Articles
عنوان الگوهاي طراحي، قسمت دوم : شروع فصل اول
نويسندهحسن ابوالحسنى تاريخ ارسال 22/05/1381 نام قسمت فناورى
فصل اول : معرفي


طراحي نرم افزار شيء گرا سخت است، و طراحي نرم افزار شيء گراي قابل استفاده مجدد(Reusable) حتي سخت تر. شما بايستي اشياء مرتبط با کاربرد را يافته، آنها را در کلاس‌هايي با وزن متناسب فاکتورگيري کرده، اينترفيسهاي کلاسها(class interface) و سلسله مراتب وراثت(inheritance hierarchy) را تعريف نموده، و وابستگي کليدي بين آنها را برقرار سازيد. طراحي شما بايستي مشخصا براي کاربرد مورد درخواست صورت پذيرفته ولي در عين حال بقدر کافي عموميت داشته تا نيازمنديها و کاربردهاي آتي را پوشش دهد. همچنين مي‌خواهيد از طراحي مجدد پرهيز نموده يا حداقل آنرا کمينه کنيد. طراحان شيء گراي خبره به شما خواهند گفت که يک طراحي قابل استفاده مجدد و قابل انعطاف اگر حصولش غير ممکن نباشد کاري است که در مرتبه اول مشکل به انجام خواهد رسيد. قبل از اتمام يک طراحي چنين افرادي معمولا سعي مي کنند تا چندين مرتبه آنرا مورد استفاده مجدد قرار داده و هر بار اصلاحاتي در آن انجام دهند.

طراحان شيء گراي با تجربه طراحي هايي با کيفيت خوب ايجاد مي کنند. در عين حال طراحان جديد در انتخابات متنوعي که وجود دارد گيج شده و به تکنيکهاي غير شيء گرا که قبلا استفاده کرده اند برگشت مي يابند. زمان زيادي براي يک مبتدي لازم است تا بياموزد که يک طرح شيء گراي خوب چيست. بطور بديهي طراحان با تجربه چيزي مي دانند که طراحان مبتدي از آن اطلاع ندارند. ولي آن چه چيزي است؟

يک چيزي که طراحان خبره مي دانند اين است که هر مسأله اي را با شروع از اصول اوليه حل نکنند. در عوض، از راه حل‌هايي که در گذشته برايشان مفيد بوده استفاده مجدد مي کنند. هنگاميکه يک راه حل خوب پيدا کردند، آنرا دوباره و چندباره مورد استفاده قرا ر مي دهند. چنين تجربه اي جزيي از آنچه آنها را خبره کرده مي‌باشد. در نتيجه مي توان براحتي الگوهاي تکراري از کلاسها و نحوه ارتباطات بين آنها در بسياري از سيستم هاي شيء گرا يافت. اين الگوها مسايل طراحي مشخصي را حل نموده و باعث ايجاد طراحي‌هاي شيء گراي قابل انعطاف تر، زيباتر و بانهايت قابليت استفاده مجدد باشد، مي شود. آنها به طراحان کمک کرده تا طرح هاي موفق را با بنا نهادن طراحي هاي جديد بر روي تجارب قبلي مورد استفاده مجدد قرار دهند. طراحي که با چنين الگوهايي آشنايي دارد مي تواند آنها را بلافاصله بدون نياز به کشف مجدد آنها بر روي طرح هاي جديد اعمال کند.

يک قياس به روشن شدن اين نکته مي تواند کمک کند. رمان نويسان و نمايش نامه نويسان بندرت طرح هاي خود را از ابتدا شروع مي نمايند. در عوض آنها از الگوهايي نظير غم انگيز، دلاورانه (هاملت، مک بث و غيره) يا داستان رويايي پيروي مي کنند. به روشي مشابه، طراحان شيء گرا از الگوهايي نظير "حالات مختلف يک سيستم را با اشيا متفاوت نمايش بده" يا "اشيا را پيرايش کن بطوريکه بتوان براحتي ويژگي‌هايي اضافه يا کم کرد" پيروي مي کنند. هنگاميکه الگو را شناختيد بسياري از تصميم هاي طراحي بطور خودکار پاسخ مي يابند.

همه ما ارزش داشتن تجربه در طراحي را مي دانيم. آيا تا کنون چندين بار اين احساس را پيدا کرده ايد که مسأله‌اي را قبلا طراحي کرده ايد ولي دقيقا نمي دانيد کجا و چگونه ؟ اگر بتوانيد جزييات مسأله قبلي و اينکه چگونه آنرا حل کرديد را بخاطر بياوريد آنگاه مي توانيد آن تجربه را مجددا مورد استفاده قرار دهيد بجاي اينکه بخواهيد آنرا دوباره کشف کنيد. با اين‌حال ما کار مفيدي براي ثبت چنين تجاربي براي استفاده ديگران نمي کنيم.

هدف اين کتاب ثبت تجارب مفيد در طراحي شيء گرا تحت عنوان الگوهاي طراحي است. هر الگوي طراحي بطور سيستماتيک يک طراحي مهم و تکرار شونده در سيستم هاي شيء گرا را نامگذاري کرده، شرح داده و ارزيابي مي نمايد. هدفمان ثبت اين تجارب طراحي به شکلي است که ديگران بتوانند بطور موثر مورد استفاده قرار دهند. به اين جهت بعضي از مهمترين الگوهاي طراحي را ثبت کرده و آنها را بصورت يک کاتالوگ ارايه داده ايم.

الگوهاي طراحي استفاده مجدد از طراحي‌ها و معماري‌هاي موفق را آسان‌تر مي نمايد. تشريح تکنيک‌هاي اثبات شده بعنوان الگوهاي طراحي باعث شده تا آنها براي توليدکنندگان سيستم هاي جديد قابل دسترس‌تر باشند. الگوهاي طراحي باعث مي شود تا از بين شقوق موجود طرح هايي که قابليت استفاده مجدد داشته را انتخاب و آنهايي که چنين خصوصيتي ندارند را رها کنيد. الگوهاي طراحي حتي مي تواند به بهبود مستند‌سازي و نگهداري سيستم هاي موجود بوسيله مزين کردن مستندات با يک مشخصه واضح از فعل و انفعال کلاس‌ها و اشيا، کمک کند. بطور ساده، الگوهاي طراحي به يک طراح کمک مي کند تا به يک طرح "درست" سريع‌تر دست يابد.

هيچ‌يک از الگوهاي طراحي در اين کتاب طراحي هاي جديد يا اثبات نشده را تشريح نمي کنند. در اينجا تنها طرح‌هايي که بيش از يک‌بار در سيستم هاي مختلف اعمال شده اند را آورده ايم. بسياري از اين طرح ها قبلا هرگز مستندسازي نشده اند. آنها يا قسمتي از فولکلور انجمن شيء گرا و يا عناصري گرفته شده از برخي سيستم هاي شيء گراي موفق مي باشند – يادگيري هيچ‌يک از آنها براي طراحان مبتدي آسان نيست. بنابراين گرچه اينها طرح‌هاي جديدي نمي باشند ولي ما آنها را به روشي جديد و قابل دسترسي ارايه داده ايم : بصورت کاتالوگي از الگوهاي طراحي با شکلي يکنواخت.

با وجود حجم قابل توجه کتاب، الگوهاي طراحي ارايه شده تنها بخش کوچکي از آنچه يک طراح خبره ممکن است بداند را نشان مي دهد. در اينجا الگوهاي طراحي براي مسايل همزماني يا برنامه سازي توزيع يافته و يا برنامه سازي سيستم هاي زمان حقيقي وجود ندارد. همچنين شامل هيچ الگوي مختص يک کاربرد مشخص نيست. به شما نمي گويد چگونه يک رابط استفاده کننده ساخته، چگونه يک درايور وسيله جنبي توليد کرده و يا چگونه به يک پايگاه داده شيء گرا دسترسي پيدا کنيد. هريک از اين محدوده ها داراي الگوهاي خاصي بوده و ارزش آنرا دارد تا اشخاصي آنها را نيز کاتاکوگ کنند.


1.1 يک الگوي طراحي چيست؟
کريستوفر آلکساندر مي گويد "هر الگو مسأله اي را که در پيرامونمان بارها و بارها اتفاق مي افتد تشريح کرده و آنگاه راه حل اساسي آنرا به صورتي تشريح کرده که مي‌توانيد آنرا ميليونها بار بکار بريد بدون اينکه آنرا دوبار به روشي يکسان صورت دهيد" []. اگر چه الکساندر در مورد الگوهايي در ساختمانها و برجها صحبت کرده، آنچه او مي گويد درباره الگوهاي طراحي شيء گرا نيز صادق است. در اينجا راه حل‌ها بصورت اشيا و روابط بين آنها بجاي ديوارها و درها تشريح گشته ولي در مرکز هر دو الگوها راه حلي براي يک مسأله در يک بستر تعريف شده هستند.

بطور کلي يک الگو داراي چهار عنصر اساسي است :
  1. نام الگو – سمبلي است که مي توانيم براي ارجاع به يک مسأله طراحي، راه حل و دست آوردهايش، در يکي دو کلمه بکار بريم. با نامگذاري يک الگو واژگان طراحي‌مان فورا بسط مي يابد. و باعث شده تا بتوانيم طراحي را در يک سطح بالاتري از تجرد به انجام برسانيم. داشتن چنين واژگاني از طراحي ها اين امکان را فراهم مي کند که در مورد آنها با همکاران، در مستندات و حتي با خودمان صحبت کنيم. همچنين باعث آسان‌تر شدن فکر در مورد طراحي ها و ارتباط دادن بين آنها و سبک وسنگين کردن با ديگر الگوها مي شود. براي ما پيدا کردن اسامي مناسب يکي از سخت ترين قسمتهاي توليد کاتالوگ بوده است.
  2. مسأله – معين مي سازد تحت چه شرايطي يک الگو مي تواند بکار رود. مسأله مورد بحث و بستر آنرا معين مي سازد. اين مي تواند يک مسأله طراحي مشخص مثلا چگونگي ارايه يک الگوريتم بصورت اشيا را شرح کند. يا ممکن است ساختار کلاسها و اشيايي که نماينده يک طرح غير قابل انعطاف بوده را معين سازد. گاهي اوقات مسأله شامل ليستي از شرايطي که بايستي قبل از بکارگيري الگو ارضا شوند است.
  3. راه حل – عناصري که طرح را مي سازد تشريح مي نمايد. راه حل، يک طرح واقعي يا يک پياده‌سازي مشخص را شرح نمي دهد چرا که يک الگو مثل قالبي است که مي تواند به روشهاي بسيار متنوع اعمال گردد. در عوض الگو شرحي انتزاعي از يک مسأله طراحي و اينکه چگونه آرايش عناصر (کلاس‌ها و اشياء در بحث ما) آنرا حل مي نمايد است.
  4. دست آورد – نتايج، مزايا و معايب بکار گيري الگو را مشخص مي سازد. گرچه نتايج اغلب هنگاميکه شرايط طرح را ارايه مي کنيم نا گفته مي ماند ولي براي ارزيابي راه حل‌هاي ديگر و فهم هزينه ها و امتيازات بکارگيري الگو حياتي هستند.
در نرم افزار "مزايا و معايب" عمدتا به زمان اجراي برنامه و فضاي حافظه مورد استفاده آن مربوط است. همچنين ممکن است مسايلي نظير زبان برنامه سازي و پياده سازي را نيز آدرس دهي کند. به اين خاطر که خصوصيت "قابليت استفاده مجدد" فاکتور مهمي در طراحي شيء گرا است، دست آوردهاي يک الگو شامل اثرش بر قابليت انعطاف، قابليت گسترش و قابليت انتقال آن مي باشد.

نقطه نظر (point of view)، تفسير يک شخص در مورد اينکه چه چيزي الگو بوده و چه چيزي الگو نيست را تحت تاثير قرار مي دهد. الگو از نظر يک شخص ممکن است چيزي بديهي (building block) براي شخص ديگري باشد. در اين کتاب، تاکيد بر روي الگوهايي در يک سطح خاص از تجرد است. بعنوان مثال الگوهاي طراحي در اينجا در مورد طراحي هايي نظير ليست هاي مرتبط (linked list) و جداول درهم ساز (hash table) که بتوان آنها را بصورت کلاسهايي کد گذاري کرده و مورد استفاده مجدد قرار داد، نيست. همچنين آنها طراحي‌هاي پيچيده مخصوص يک دامنه (domain) مشخص نيستند. الگوهاي طراحي در اين کتاب شرح هايي از اشياء و کلاسهاي مرتبط است که براي حل يک مسأله عمومي طراحي در يک بستر معين بکار مي‌روند.

يک الگوي طراحي جنبه هاي کليدي يک ساختار طراحي عمومي را نامگذاري، مجردسازي و معين کرده تا آنرا براي توليد يک طراحي شيء گراي قابل استفاده مجدد مفيد سازد. الگوي طراحي کلاس‌ها و نمونه‌ها، نقش‌ها و همکاري‌هاي بين آنها و توزيع وظايف را تعيين مي نمايد. هر الگوي طراحي بر روي يک مسأله در طراحي شيء گرا تاکيد دارد. هر الگو مشخص مي کند که چه موقع مي توان آنرا اعمال کرد، و اعمال آن چه نتايج، مزايا و معايبي در بردارد. چون در نهايت بايستي طراحي‌ها را پياده سازي کرد، براي يک الگوي طراحي در اين کتاب کد نمونه به زبان C++ و گاهي اوقات به زبان smalltalk آورده شده است.

گرچه تاکيد الگوهاي طراحي بر روي طراحيهاي شيء گراست (که سپس مي توان آنها را به زبانهاي شيء گرا يا روالي پياده سازي نمود [مترجم]) در اين کتاب آنها را به زبانهاي C++ و smalltalk در مقابل زبانهاي روالي (ada، c، pascal) يا زبانهاي شيء گراي ديناميک تر (self، dylan ،clos) پياده سازي کرده ايم. چون تجربه هر روزه ما با اين زبانهاست و آنها بصورت روزافزوني شهرت دارند، اين دو را انتخاب کرده ايم.

انتخاب زبان برنامه سازي به اين خاطر که نقطه نظر شخص را تحت تأثير قرار مي دهد اهميت دارد. الگوهاي ما وجود ويژگي‌هايي در سطح زبانهاي C++/smalltalk را مفروض دارند. اين انتخاب معين کننده چيزهايي است که مي تواند يا نمي تواند به راحتي پياده سازي گردد. اگر زبانهاي روالي را مفروض مي کرديم آنگاه ممکن بود الگوهايي با نام هايي نظير وراثت (inheritance)، کپسول سازي (encapsulation)، چند ريختي (polymorphsim) را شامل کنيم. بصورت مشابه، بعضي از الگوهاي ما بصورت مستقيم در بعضي از زبانهاي برنامه سازي شيء گراي کمتر متداول بصورت مستقيم پشتيباني مي شوند. براي نمونه clos داراي multi-methods است که نياز به الگويي نظير ملاقات کننده (visitor) (صفحه 331) را کمتر مي کند. در حقيقت، تفاوتهاي کافي بين C++ و smalltalk وجود دارد تا اين مفهوم را ايجاد کند که بعضي از الگوها مي تواند بطور ساده تري در يک زبان در مقايسه با ديگري تشريح شود. (براي يک نمونه تکرار کننده (iterator) را نگاه کنيد)
قسمت قبلي : پيش‌گفتار الگوهاي طراحي، قسمت سوم : ادامه فصل اول، بخش 2-1