طراحی برنامه
در اين مقاله به بررسی مسائل مرتبط با طراحی برنامه پرداخته و در اين راستا در ابتدا با يک متدولوژی ساده آشنا خواهيم شد. متدلوژی استفاده شده با اينکه بسيار مقدماتی می باشد ولی اهداف ما را در جهت نحوه طراحی يک برنامه بخوبی تامين خواهد کرد .در اين مقاله ، به بررسی الگوريتم و مراحل پنج گانه برنامه نويسی خواهيم پرداخت . پس از آشنائی با متدولوژی ارائه شده در اين مقاله ، در بخش دوم مقاله ، با متدولوژی UML)Unified Modeling Language ) آشنا خواهيم شد. UML ، يک متدولوژی رايج بمنظور طراحی برنامه های کامپيوتری خصوصا" برنامه نويسی شی گراء است .
اهميت طراحی برنامه
الگوريتم
الگوريتم های ميکرو در مقابل ماکرو
همانگونه که احتمالا" حدس زده ايد ، ما می توانيم تمام الگوريتم های ميکرو را بمنظور ايجاد يک الگوريتم ماکرو ، جمع آوری نمائيم . اگر ما با الگوريتم های ميکرو ، آغاز نمائيم ، و حرکت خود را بسمت نمايش ماکروی يک برنامه ، پيش ببريم ، کاری را انجام داده ايم که موسوم به طراحی " پايين به بالا" (buttom-up) ، است . اگر ما فعاليت خود را با يک الگوريتم ماکرو آعاز و حرکت خود را بسمت پائين و الگوريتم های ميکرو ، ادامه دهيم ، طراحی از نوع " بالا به پايين " (top-down) را انجام داده ايم .
شايد اين سوال مطرح گردد که کدام روش بهتر است ؟ اگر شما تمام مقالاتی را که تاکنون در اين زمينه نوشته شده اند را دنبال نمائيد ، هرگز به يک نتيجه قابل قبول دست نخواهيد يافت . هر رويکرد، دارای نکات مثبت و منفی مربوط به خود است . صرفنظر از رويکرد طراحی استفاده شده ، می بايست دارای الگوئی (طرحی) مناسب برای برنامه باشيم .حداقل، نيازمند يک اعلاميه از مسئله برنامه نويسی و يک طرح ( الگو) برای برخورد با مسئله ، خواهيم بود . پس از شناخت مسئله ، می توان نحوه حل مسئله را ترسيم کرد. شناخت عميق و مناسب نسبت به مسئله ای که قصد حل آن را داريم ، شرط اساسی و ضروری برای طراحی يک برنامه است .
با توجه به اينکه اين اعتقاد وجود دارد که شناخت جامع و کلی از مسئله ای که حل آن را داريم ، بخشی ضروری در اولين مرحله برنامه نويسی است ، ما در ادامه از رويکرد "بالا - پايين "، تبعيـت می نمائيم . فراموش نکنيم که رويکرد فوق ، امکان مشاهده مجازی از هر مسئله برنامه نويسی را فراهم خواهد نمود.
مراحل پنج گانه
• مقدار دهی اوليه
• ورودی
• پردازش
• خروجی
• پاکسازی
در ادامه به بررسی هريک از مراحل فوق ، خواهيم پرداخت .
مرحله مقداردهی اوليه
يکی ديگر از عمليات متداول که به اين مرحله مرتبط می باشد ، خواندن فايل های Setup است . چنين فايل هائی ممکن است حاوی اطلاعاتی در رابطه با نام مسيرهائی باشند که بانک ها ی اطلاعاتی خاصی و يا فايل های ذخيره شده ديگری را بر روی ديسک را مشخص می نمايند . با توجه به نوع برنامه ای که اجراء می گردد ، فايل های Setup می توانند شامل اطلاعاتی در رابطه با فونت های نمايش ، نام و محل چاپگر ، رنگ های زمينه و رويه ، وضوح تصوير صفحه نمايشگر و اطلاعات مشابهی ديگر باشند . ساير برنامه ها ممکن است مستلزم خواندن اطلاعاتی در رابطه با اتصالات شبکه ، مجوزهای امنيتی و دستيابی به اينترنت ، رمزهای عبور و ساير اطلاعات حساس ديگر باشند . در چنين مواردی فايل های Setup دارای نقشی مهم خواهند بود.
در زمان طراحی يک برنامه ، همواره می بايست در رابطه با اطلاعاتی که يک برنامه قبل آغاز خدمات و عمليات خود به آنها نيازمند است ، انديشيد و برای آنان در مرحله مقداردهی اوليه راهکار مناسب را انتخاب کرد . مرحله مقداردهی اوليه احتمالا" جائی است که می بايست از طريق آن اقدام به ارائه راهکار مناسب در جهت پاسخ به نيازهای فوق ، کرد.
مرحله ورودی
در حالات ديگر، لازم است در رابطه با نوع ورودی هائی که می بايست از کاربر اخذ گردد، بررسی لازم و مبتنی بر انديشه را دنبال نمود. مثلا" در صورتيکه قصدنوشتن يک برنامه دفترچه آدرس را داريد ، آيا می خواهيد نام فايل حاوی دفترچه تلفن و محل ذخيره فايل مربوطه را در هر مرتبه که برنامه اجراء می گردد ، از کاربر درخواست نمائيد ؟ بعبارت ديگر برخی از مراحل ورودی می توانند و شايد می بايست ، توسط مرحله مقدار دهی انجام شوند. ماهيت واقعی ميزان اطلاعاتی که می توان آنها را در مرحله مقداردهی خواند ، بستگی به رفتار برنامه دارد. بعنوان يک قانون عمومی می توان به اين مورد اشاره داشت که اکثر کاربران تمايل دارند که اطلاعات تکراری در يک فايل Setup و يا مقداردهی اوليه ذخيره گردد (در مقابل اينکه هر مرتبه که برنامه اجراء می گردد ، مجبور به ورود اطلاعات تکرای باشند ) .
فايل های Setup بسيار مناسب بوده و در هرموردی که امکان بخدمت گرفتن آنان منطقی بنظر می آيد ، می بايست از آنان استفاده گردد . برخی ديگر از اطلاعات اوليه دارای ماهيت خاص خود بوده و تا زمانيکه کاربر آنها را تايپ ننمايد ، شناخته نمی گردند . در مثال وام اشاره شده ، می توان از TextBox های متعددی بمنظور احذ اطلاعات از کاربر و استفاده از آنان در برنامه ، کمک گرفت . با توجه به اينکه کاربر می بايست با اين TextBox ها مرتبط تا اطلاعات موردنياز برنامه را وارد نمايد ، روشی را که شما بمنظور ارائه Textbox ,Labels ,Menus و ساير عناصر برنامه ، استفاده می نمائيد ، يکی از بخش های مهم يک برنامه يعنی رابط کاربر ( user interface ) را مشخص خواهد کرد . فراموش نکنيم يکی از عوامل موفقيت هر نرم افزار ، بخش رابط کاربر آن است . طراحی مناسب بخش فوق ، امروزه بعنوان تخصصی خاص در طراحی و پياد ه سازی نرم افزار مطرح و دارای جايگاه خاص خود است .
مرحله پردازش
مرحله خروجی
مرحله پاکسازی ( Cleanup )
يکی ديگر از انواع فايل های Log به فايل های ثبت خطاء برمی گردد( error log file ) . هدف اين نوع از فايل ها ، ثبت اطلاعاتی در رابطه با هر نوع خطائی است که ممکن است در مدت زمان اجرای يک برنامه ، محقق گردد. برنامه نويسان با استفاده از محتويات اين نوع فايل ها ، قادر به اشکال زدائی برنامه خواهند بود .
عمليات واقعی و مورد نظری که می بايست در مرحله پاکسازی ، انجام گردد ، به نيازهای يک برنامه بستگی خواهد داشت . معمولا" اگر در برخی برنامه ها عمليات خاصی را در مرحله مقدار دهی اوليه انجام می هيم ، می بايست برخی از عمليات متناظر با آنان را در مرحله پاکسازی انجام داد . باز نمودن و بستن فايل های مورد نياز در يک برنامه ، نمونه ای متداول از دو مرحله فوق می باشد .
آيا هر برنامه شامل پنج مرحله گفته شده است؟
پالايش يک طرفه ( Sideways Refinement )
از پنج مرحله گفته شده ، می توان بمنظور نقطه شروع ديد ماکرو خود در زمان فرآيند طراحی استفاده کرد. درادامه ، می توان هر يک از مراحل را بدقت بررسی تا جزئيات بيشتری در رابطه با مرحله مورد نظر ، مشخص گردد ( استخراج جزئيات لازم در رابطه با تحقق هر مرحله ) . فرآيند فوق ، " پالايش يک طرفه " ، ناميده می شود . در ادامه ، بمنظور شناخت مناسب فرآيند پالايش يک طرفه ، به بررسی يک نمونه می پردازيم .
فرض کنيد ، کاربری دارای يک فايل بانک اطلاعاتی است که در آن تمام قرار ملاقات های وی ، ذخيره شده اند . قرار ملاقات ها در بانک اطلاعاتی با نظم و ترتيب خاص ( تاريخ قرار ملاقات ) ذخيره شده اند . کاربر ، می خواهد قادر به مشاهده قرار ملاقات های خود بر اساس حروف الفبائی و بر اساس نام خانوادگی اشخاص مورد نظری که قصد ملاقات با وی را دارند ، باشد. چگونه می توان از پالايش يک طرفه ، بمنظور طراحی يک را ه حل استفاده کرد؟
پالايش يک طرفه مرحله مقدار دهی اوليه
همانگونه که در شکل فوق ، مشاهده می گردد بموازات حرکت از سمت چپ بسمت راست ، جزئيات مربوطه افزايش خواهد يافت . شکل فوق ، پالايش يک طرفه ، ليستی از برنامه های جانبی و توابع مورد نياز بمنظور انجام فعاليت های مربوطه در مرحله مقداردهی اوليه را نشان می دهد . هر روتين کوچک، مسئول انجام عملياتی خاص خواهد بود .
شبه کد ( Pseudo Code )
شبه کد روتين IsvalidUser |
Is ValidUser() |
شبه کد ، عملياتی را که يک روتين می بايست انجام دهد ، بدون اتکاء به گرامر يک زبان برنامه نويسی خاص ، تشريح می نمايد. شبه کد ، زبانی مبتنی بر گرامری خاص نبوده و الگوريتمی از عمليات مورد نظر که می بايست توسط يک روتين انجام شود را مشخص می نمايد. مزيت شبه کد، شباهت زياد آن به زبان انگليسی است و می توان آن را با افراديکه برنامه نويس نبوده و بنوعی در فاز طراحی صاحبنظر می باشند ، به اشتراک تا صحت استنباطات حاصل شده تائيد و يا اصلاح گردد.( در فاز طراحی می بايست يک ارتباط مستمر با کاربران صاحبنظر برقرارگردد، ما قرار است مسئله آنان را حل نمائيم نه مسئله خود را و يا نمی خواهيم مسئله ای ديگر را بر حجم مسائل آنان اضافه نمائيم!) بدين ترتيب ، امکان تشخيص خطاء و اعمال تعييرات لازم در خصوص برخورد با خطاهای احتمالی در ابتدا فراهم می گردد ( يکی از اصول مهندسی نرم افزار در اين رابطه به اين موضوع اشاره می نمايد که به هر ميزان که زمان کشف يک خطاء در چرخه حيات يک برنامه سريعتر باشد ، هزينه برخورد با خطاء کاهش خواهد يافت ) .
پس از آگاهی از اهداف ارائه شده در شبه کد ، می توان بسادگی اقدام به ترجمه شبه کد مربوطه به کدهای برنامه نويسی با استفاده از زبان مورد نظر نمود. فراموش نکنيم که طراحی خوب ، همواره پياده سازی ساده تر برنامه ها را بدنبال خواهد شد.
UML چيست ؟
UML ،زبانی استاندارد بمنظور مشخص نمودن ، پيش بينی ، ايجاد و مستند سازی توليدات نرم افزاری است . UML ، مجموعه ای از بهترين امکانات مهندسی را بمنظور استفاده در مدل سازی سيستم های بزرگ و پيچيده ارائه که کارآئی آنان به اثبات رسيده است . UML يک متدولوژی رسمی برای پياده سازی نرم افزار است .
روند شکل گيری UML
از افراد فعال و پيشرو در اين زمينه می توان به Jim Rumbaugh ( شرکت جنرال الکتريک )، Grady Booch ( شرکت Rational software ) و Ivar Jacobson ( شرکت Objectory ) اشاره نمود. هر يک از افراد فوق ، تلاش گسترده ای را در جهت مدل سازی زبان برنامه نويسی انجام داده بودند . در سال 1994 ، Rumbaugh شرکت جنرال الکتريک را ترک و به Booch در شرکت Rational Software ملحق گرديد. يک سال بعد ، شرکت Rational Software ، شرکت Objectory را خريداری و افراد ياد شده همکاری خود را با يکديگر و در يک شرکت مشترک آغاز نمودند. ماحصل همکاری فوق ، ارائه اولين نسخه UML 0.9 توسط شرکت Rational software در سال 1996 بود .
در ساليان بعد ، OMG)Object Management Group) ، تلاش های گسترده ای را بمنظور ارتقاء و بهسازی UML آغاز نمود. در اواسط سال 2001 ، اعضاء OMG ، کار خود را بمنظور ارتقاء به UML 2.0 آغاز نمودند. در حا ل حاضر ، UML شامل مدل سازی ويژوال ، شبيه سازی و امکانات پياده سازی است . تعداد زيادی از ابزارهای UML طراحی و در اختيار علاقه مندان قرار گرفتند . Rational Rose 2002 از شرکت Rational Software ، نرم افزار Describe Enterprise از شرکت Embarcadero Technologies و Visio 2002 از شرکت مايکروسافت . نمونه هائی از ابزارهای UML می باشند .
دياگرام های UML
• Class Diagram
• State Diagram
• Sequence Diagram
• Collaboration Diagram
• Activity Diagram
• Component Diagram
• Deployment Diagram
آناليز شی گراء (OOA)
مهمترين و اصلی ترين رويکرد OOA ،يافتن پاسخ مناسب برای سوالاتی است که با What شروع و در فرآيند پياده سازی نرم افزار حضوری موثر دارند . نمونه سوالات OOA در اين زمينه عبارتند از : " چه کلاس هائی در برنامه وجود دارد؟" . " چه چيزی را برنامه انجام خواهد داد ؟" " هر يک از کلاس ها در برنامه چه عملياتی را بمنظور حل مسئله انجام خواهند داد ؟" " مسئوليت هر کلاس در برنامه چيست ؟" در OOA ، تاکيد بر آناليز اشياء ، فعاليت ها و مسئوليت های سيستم نرم افزاری است .
طراحی شی گراء ( OOD )
بنابراين OOA ، کلاس های مورد نظر و ضروری بمنظور نيل به اهداف نرم افزار را مشخص می نمايد و محور عمليات بر جستجو و تبين جايگاه يک کلاس در برنامه متمرکز است . در OOD ، تاکيد بر پياده سازی کلاس ها ، صفات و خصايصی است که بمنزله هسته يک کلاس مطرح می گردند . ترکيب هر يک از فعاليت های فوق ( آناليز شی گراء و طراحی شی گراء ) بهمراه پياده سازی لينک هائی که با کلاس ها سروکار دارند جملگی بعنوان بخشی از فرآيند OOP ( برنامه نويسی شی گراء ) محسوب می گردند.
دياگرام های کلاس UML
خصايص کلاس (Properties , Attributes)
علايم + و -
اگر يک Entry با يک علامت - شروع گردد ، بدين معنی خواهد بود که آيتم مورد نظر صرفا" برای استفاده خود کلاس در دسترس بوده و امکان استفاده از آن برای خارج از کلاس ميسر نخواهد بود. بنابراين علامت - ، نشاندهنده خصوصی ( Private ) بودن عناصر مربوط به يک کلاس است .
استفاده از علائم + و - ، نشاندهنده نوع دستيابی به هر يک از عناصر مربوط به يک کلاس است . در حقيقت علامت + ، روشی بمنظور ارتباط با کلاس را مشخص نموده و علامت - نشاندهنده عناصری است که صرفا" برای خود کلاس قابل استفاده خواهند بود .
ايجاد يک آيتم بصورت خصوصی همواره مورد توجه طراحان شی گراء بوده و تامين کننده اهداف کپسوله سازی در برنامه نويسی شی گراء است . با کپسوله سازی داده ، امکان بروز تغييرغيرعمد داده در برخی بخش ها ی برنامه و از طريق خارج از کلاس به حداقل مقدار خود خواهد رسيد . بدين ترتيب، تشخيص و برطرف نمودن خطاهای احتمالی ، بسرعت و بسادگی ميسر خواهد شد .
متدهای کلاس ( عمليات )
متدهای کلاس و آرگومان ها
+SetSpeed(DesiredSpeed:Integer):Integer |
علامت + نشاندهنده اين موضوع است که ( ) SetSpeed يک متد Public است . بنابراين امکان استفاده از آن توسط يک برنامه نويس وجود خواهد داشت .بمنظور ارسال داده به متد مورد نظر از آرگومان استفاده شده که بين علامت پرانتز قرار می گيرند.در مثال فوق ، پارامتر مورد نظر DesiredSpeed بوده و از نوع Integer است . در انتهای علامت پرانتز بسته ، ازيک کالون ":" ، که بدنبال آن کلمه Integer آمده است ، استفاده شده است . اين بدان معنی است که متد ( ) SetSpeed يک مقدار صحيح را به برنامه صدازننده ، بر می گرداند.
در نمونه کلاس Vehicle از دومتد بمنظور افزايش و يا کاهش سرعت استفاده شده است :
-IncreaseSpeed(DesiredSpeed:Integer):Integer |
هر يک از متدهای فوق ، عمليات مورد نظر در رابطه با افزايش و يا کاهش سرعت را انجام خواهند داد . برای نيل به خواسته فوق ( افزايش و يا کاهش سرعت ) می توان دو متد فوق را با يکديگر تلفيق و در يک متد واحد ديگر جايگزين نمود:
-ChangeSpeed(DesiredSpeed:Integer):Integer |
در صورتيکه پارامتر DesiredSpeed مثبت باشد ، سرعت افزايش و در غير اينصورت ( پارامتر منفی باشد ) ، سرعت کاهش خواهد يافت.
Dim MyVehicle as New Vehicle |
درنمونه مثال فوق ، در ابتدا يک شی Vehicle با نام MyVehicle تعريف شده است . در ادامه ، متد GetSpeed در ارتباط با شی MyVehicle فرا خوانده شده است .بمنظور جداسازی نام شی از متد مربوطه از علامت نقطه استفاده شده است .
فرض کنيد که Vehicle با سرعت 55مايل در ساعت در حال حرکت است . مقدار ObjectSpeed ، پنجاه و پنج در نظر گرفته می شود .در صورتيکه در ادامه مقداری منفی را به متد فوق پاس دهيم سرعت کاهش پيدا خواهد کرد. اگر مقدار 55 - را به متد ChangeSpeed() پاس دهيم ، توقف اتومبيل را بدنبال خواهد داشت .
همانگونه که مشاهده می شود ، برخی از متدها با علامت - شروع شده اند . اين بدان معنی است که آنان متدهای اختصاصی ( Private) بوده و خارج از کلاس قابل دستيابی نخواهند بود. چنين متدهائی به ساير متدها ی موجود در کلاس ، سرويس و خدمات لازم را ارائه و استفاده از آنان برای برنامه نويس مجاز نخواهد بود.بعبارت ديگر متدهای فوق بعنوان ايترفيس کلاس مطرح نبوده و از خدمات آنان در داخل کلاس استفاده خواهد شد . در چنين مواردی ممکن است يک متد که بصورت Public تعريف و امکان استفاده از آن در خارج از کلاس و توسط برنامه نويسان وجود دارد ، خود از خدمات چندين متد خصوصی استفاده نمايد .
يک دياگرام کلاس UML ، امکان مرور سريع و فشرده پتانسيل ها ی يک کلاس را فراهم و نحوه ارتباط يک برنامه نويس با کلاس مورد نظر را نيز مشخص خواهد شد. اگر يک کلاس را بعنوان يک جعبه سياه در نظر بگيريم ، علامت "-" ، نشاندهنده آيتم هائی درون جعبه سياه است که امکان استفاده از آنان توسط برنامه نويسان وجود نخواهد داشت . علامت "+" ، نشاندهنده امکاناتی است که می توان از آنان بمنظور ارتباط با متدها و خصايص يک کلاس استفاده کرد . آيتم های Public يک کلاس ، اينترفيس لازم برای يک کلاس را تعريف و نحوه ارتباط با آن را مشخص می نمايند. در حقيقت متدهای Public ، نحوه استفاده از يک کلاس را به برنامه نويسان ديکته خواهند کرد .
خلاصه
• مقداردهی اوليه ، ورودی ، پردازش ، خروجی و پاکسازی ، پنج مرحله متفاوت برنامه نويسی می باشند .
• مراحل پنج گانه برنامه نويسی ، نگرشی ماکرو از يک برنامه را ارائه می نمايند . مثلا" مرحله ورودی ممکن است نيازمند اخذ داده از صفحه کليد ، خواندن يک جدول تنظيمات از يک بانک اطلاعاتی و نهايتا" خواندن اطلاعات بيشتر از بانک اطلاعاتی ديگر باشد . بهسازی ( پالايش ) يکطرفه ، فرآيندی است که بر اساس آن يکی از مراحل برنامه نويسی (نظير مرحله ورودی ) بررسی و به آن جزئيات بيشتری اضافه اضافه خواهد شد . عمليات فوق تا استخراج و مشخص شدن تمامی جزئيات لازم در رابطه با يک مرحله خاص ادامه خواهد يافت . عمليات بهسازی ( پالايش ) يکطرفه ، زمانی متوقف می گردد که کد واقعی يک تابع نوشته گردد .محوريت فرآيند فوق ، تبديل الگوريتم های ماکرو به ميکرو است :
Input Step->ReadKeyboard( ) |
• UML ، از کلمات Unified Modeling Language اقتباس شده است . مزيت استفاده از UML ، تفکر مبتنی بر برنامه نويسی شی گراء است .بلاک های اوليه ايجاد UML کلاس ، خصلت و متد ناميده می شوند. دياگرام های کلاس UML تمام سه عنصر OOP را در يک دياگرام مناسب نمايش می دهند .
• در OOP ، واژه های Private و Public به نحوه دستيابی به خصلت ها بر می گردد . اگرخصلتی از نوع Private باشد ،امکان تغيير آن صرفا" برای کسانی که به کلاس فوق تعلق دارند، وجود خواهد داشت .اگر خصلتی از نوع Public باشد ، ساير اشياء امکان دستيابی کامل به خصلت را ( اعمال تغييرات مورد نظر ) خواهند داشت.