بخشی از مقاله
مقدمه اي بر متد Obiect-Oriented (شيءگرايي)
شيءگرايي (Object-Oriented) لغتي است كه امروزه در صنعت نرم افزار، باب شده است. شركتها به سرعت حركت مي كنند تا خود را با اين تكنولوژي سازگار كنند و آن را در برنامه هاي خود وارد نمايند.
متد شيءگرايي (O.O) يك راه متفاوت مشاهده برنامه هاست. با متد شيءگرايي، شما يك برنامه را به قطعات بسيار كوچك يا آبجكت هايي تقسيم مي كنيد، كه تا اندازه اي مستقل از يكديگر مي باشند. مانند ساختماني از بلوك ها نگاه كنيد.
اولين قدم اين است كه آبجكت هاي اساسي (انواع مختلف بلوك ها) را بسازيد يا بدست آوريد. اولين باري كه شما اين بلوك هاي ساختماني را داريد، مي توانيد آنها را كنار هم گذاشته و قصرتان را بسازيد. به محض اينكه تعدادي آبجكت هاي اساسي را در دنياي كامپيوتر ساختيد يا بدست آورديد، مي توانيد به
سادگي آنها را كنار هم بگذاريد تا برنامههاي جديد ايجاد را كنيد. يكي از امتيازات اساسي متد شيءگرايي اين است كه مي توانيد يك بار Component (اجزاء) را ساخته و بارها و بارها از آنها استفاده كنيد. درست مانند زماني كه مي توانيد يك بلاك ساختماني را در يك قصر، يك خانه يا يك سفينه فضايي دوباره استفاده كنيد، مي توانيد از يك قطعه طرح يا كد شيءگرايي در يك سيستم حسابداري، يك سيستم بازرگاني يا يك سيستم پردازش سفارش استفاده مجدد نماييد.
تفاوت متد شيءگرايي با روش سنتي توسعه، چيست؟ در روش سنتي، روش توسعه به همراه اطلاعاتي كه سيستم نگهداري خواهد كرد به خودمان وابسته است.
در اين روش، ما از كاربران مي پرسيم كه چه اطلاعاتي را نياز دارند، پايگاه داده اي را طراحي مي كنيم كه اطلاعات را نگه دارد، صفحاتي را تهيه مي كنيم تا اطلاعات را بگيرد، و گزارشاتي را چاپ مي كنيم تا اطلاعاتي را براي كاربر نمايش دهد. به عبارت ديگر، ما بر روي اطلاعات متمركز مي شويم و كمتر توجه مي كنيم كه چه كاري با اين اطلاعات انجام شده يا رفتار سيستم چگونه است. اين روش data-centric (مبتني بر داده) ناميده شده است و براي ايجاد هزاران
سيستم در سال، ايجاد شده است. مدلسازي data-centric مخصوص طراحي پايگاه داده و گرفتن اطلاعات خيلي مهم مي باشد، اما انتخاب اين روش در زمان طراحي برنامه هاي تجاري با مشكلاتي همراه است. يك چالش بزرگ اين است كه درخواستهاي سيستم چندين بار تغيير خواهند كرد. سيستمي كه از روش data-centric استفاده مي نمايد، مي تواند به آساني تغيير در پايگاه داده را مديريت كند. اما اجراي تغييرات در قوانين تجاري يا رفتار(behavior) سيستم آن قدر آسان نمي باشد. متد شيءگرايي در پاسخ به اين مشكل، ايجاد شده است. با متد شيءگرايي هم بر اطلاعات وهم بر رفتار متمركز مي شويم. در نتيجه اكنون مي توانيم سيستم هايي را ايجاد كنيم كه انعطاف پذير شده اند تا اطلاعات و يا رفتار را تغيير دهند.
مزيت اين انعطاف پذيري با طراحي يك سيستم شيءگرايي به خوبي شناخته شده است. اين مطلب، به شناخت تعدادي اصول شيء گرايي نياز دارد. نهان سازي (Encapsulation) وراثت(Inheritance) و چند ريختي (Polymorphism).
Encapsulation (نهان سازي)
در سيستمهاي شيءگرا، اينها (اطلاعات و رفتارها) را در يك آبجكت بسته بندي مي كنيم. اين مطلب در قالب اطلاعات Encapsulation (پنهان سازي) ارجاع داده شده است. راه ديگر براي نگاه كردن به توابع وابسته، اين است كه برنامه را به بخشهاي كوچكي از توابع وابسته، تقسيم كنيم. مثلاً يك حساب بانكي شامل: شماره حساب، تراز جاري نام مشتري آدرس نوع حساب، نرخ بهره و تاريخ باز كردن حساب مي باشد. همچنين رفتارهايي را براي يك حساب بانك داريم مانند:
باز كردن يك حساب ، بستن حساب، به حساب گذاشتن، برداست از حساب، تغيير نوع حساب، تغيير مشتري و تغيير آدرس. ما اين اطلاعات و رفتارها را با هم در يك آبجكت account پنهان مي كنيم. در نتيجه همة تغييرات سيستم بانكي مربوط به حسابها، مي توانند به آساني در آبجكت حساب انجام شوند.
مـزيت ديگر پنهان سازي اين است كه تأثيرات اعمال شده به سيستم را محدود مي كند. به يك سيستم به عنوان بستري از آب و به تغيير درخواستها مانند يك صخره بزرگ نگاه كنيم. شما صخره را در آب مي اندازيد و امواج بزرگي در همه جهتها ايجاد مي شوند. آنها در سرتاسر درياچه حركت مي كنند، به كرانه ضربه مي زنند، طنين افكن مي شوند و با امواج ديگر برخورد مي كنند در حقيقت، حتي ممكن است مقداي آب بر روي ساحل و خارج از درياچه بريزد. بعبارت ديگر،
برخورد صخره با آب باعث ايجاد ميزان زيادي موج هاي كوچك شده است. حال درياچه خود را پنهان مي كنيم. تدين ترتيب كه آن را به تكه هاي كوچكتري از آب با موانعي ميان آنها تقسيم مي كنيم. سپس، ضربات سيستم را تغيير مي دهد. قبل از اين، امواج در همه جهتها ايجاد مي شدند. اما اكنون، امواج فقط مي توانند از يكي از موانع عبور نمايد. و سپس متوقف مي گردند. بنابرين، با نهان سازي درياچه، ما تاثير موج كوچك حاصل از انداختن صخره در آب را محدود كرده ايم.
حال، بياييد ايدة نهان سازي را درسيستم بانكي به كار ببريم. اخيراً مديريت بانك تصميم گرفته است كه اگر مشتري در بانك يك حساب اعتباري دارد، بتوان از حساب اعتباري بعنوان يك مبلغ اضافه، برداشت كرده و براي حساب جاري آنها استفاده نمود. در يك سيستم غير نهان سازي، كار را با يك روش اجباري شروع مي كنيم تا تجزيه و تحليل كاراتر شود. اساساً، ما محل تمام جاهايي كه ازعمليات برداشت از حساب، در يك سيستم استفاده شده است را نمي دانيم،
بنابرين بايد به هر جايي نگاه كنيم و وقتي كه آن را پيدا كرديم، بايد يك سري از تغييرات را ايجاد كنيم تا اين درخواست جديد را يكپارچه كنيم. اگر كار به درستي انجام شده باشد، احتمالاً 80 % موارد برداشت از حساب را در سيستم پيدا كرده ايم. با يك سيستم نهان سازي، ما نيازي به استفاده از روش اجباري براي تجزيه و تحليل نداريم. ما به مدل سيستم خود نگاه مي كنيم و به آساني جايي كه رويداد برداشت از حساب پنهان شده بود را پيدا مي كنيم. بعد از اينكه عمليات را در حساب قرار داديم، يكبار درخواستمان را فقط در آن آبجكت تغيير مي دهيم، و كار ما تمام شده است. همان گونه كه در شكل زير مي بينيد، فقط كلاسAcount نياز به تغيير دارد.
يك مفهوم مشابه نهان سازي، Information Hiding (پنهان سازي) مي باشد. پنهان سازي اطلاعات، توانايي است كه جزئيات مبهم يك آبجكت را از دنياي خارج پنهان مي سازد. در يك آبجكت، دنياي خارج به معني هر چيزي خارج از همان آبجكت است حتي اگرچه دنياي خارج شامل بقية سيستم باشد. پنهان سازي اطلاعات (Information Hiding) همان مزيت نهان سازي (Encapsolation) را فراهم مي كند.
Inheritance (وراثت)
Inheritance (وراثت) دومين مفهوم اساسي شيءگرايي مي باشد. در سيستمهاي شيءگرا به شما اجازه مي دهد تا آبجكت هاي جديد را بر پايه آبجكت هاي قديمي ايجاد كنيد. آبجكت child (فرزند) ويژگيهاي يك آبجكت parent(والد) را به ارث مي برد. شما مي توانيد نمونه هايي از وراثت را در دنياي طبيعي ببينيد. هزاران نوع مختلف از پستانداران مانند سگها، گربه ها، انسانها، نهنگها و غيره وجود دارند. هر يك از اينها ويژگيهاي مشخصي دارند كه منحصر به فرد بوده و اين ويژگيهاي مشخص مانند داشتن مو، خونگرم بودن و غذا دادن به بچه ها، در كل گروه مشترك مي باشد. در اصطلاحات شيءگرايي يك آبجكت بنام mammal (پستاندار) وجود دارد كه ويژگيهاي مشترك را نگه مي دارد. اين آبجكت والد آبجكت هاي فرزندي مانند گربه، سگ، انسان، نهنگ و غيره مي باشد.
آبجكت سگ(dog) ويژگيهاي آبجكت پستاندار (mammal) را به ارث مي برد، مانند دويدن در دايره ها (حلقه ها) و ريختن آب از لب و لوچه. متد شيءگرايي ايدة وراثت را از دنياي طبيعي گرفته است. شكل زير نمونه اي از آن است.
بنابراين ما مي توانيم همان مفهوم را در سيستم خود به كار ببريم. يكي از مزاياي اصلي وراثت، سهولت در نگهداري است. وقتي چيزي تغيير مي كند و برهمة پستانداران اثر مي گذارد، فقط آبجكت والد نتاز به تغيير دارد و آبجكت هاي فرزند به طور خودكار تغييرات را به ارث مي برد. اگر پستانداران به طور ناگهاني خونسرد شوند، فقط پستاندار (mammal) بايد تغيير نمايد. گربه، سگ، انسان، نهنگ و ديگر آبجكتهاي فرزند به طور خودكار ويژگي جديد خونسرد بودن پستانداران را به ارث مي برند. در يك سيستم شيءگرا يك مثال مي تواند پنجره ها باشند.
سيستمي بزرگ داراي 125 تابلو داريم. روزي، يك مشتري درخواست يك پيغام انصراف بر روي همه تابلوها را مي دهد. در يك سيستم بدون وراثت، ما كار خسته كننده اي داريم كه بايد به هر يك از اين 125 تابلو رفته و تغيير را در آن ايجاد كنيم. تا به آبجكت والد رفته ويكبار آن را تغيير دهيم. همة تابلوها به طور خودكار تغييرات را به ارث مي برند. همانطور كه در شكل زير مي بينيد.
در يك سيستم بانكداري، ممكن است از وراثت براي انواع مختلفي از حسابهايي كه داريم استفاده نماييم. بانك فرضي ما داراي چهار نوع مختلف حساب مي باشد. جاري، پس انداز، كارت اعتباري، سپرده گذاري.اين انواع مختلف حسابها شباهتهايي نيز دارند. هر كدام داراي يك شمارة حساب، نرخ بهره و نام مالك مي باشد. بنابراين مي توانيم يك آبجكت والد بنام account (حساب) را ايجاد كنيم تا ويژگيهاي مشترك همة اين حسابها را نگهداري كنيم.
آبجكت هاي فرزند (child) مي توانند علاوه بر ويژگيهايي كه به ارث برده اند، ويژگيهاي منحصر به فرد خودشان را داشته باشند. مثلاً، حساب اعتباري يك حد موجودي و حداقل ميزان پرداخت را خواهد داشت. سپرده گذاري نيز داراي يك موعود پرداخت مي باشد.
تغييرات آبجكت والد بر روي همة فرزندان اثر خواهد گذاشت، اما بچهها آزاد هستند كه بدون به هم زدن آرامش فرزند ديگر يا والدشان تغيير نمايند.
Polymorphism(چند ريختي)
سومين اصل شيءگرايي Polymorphism (چند ريختي) است. در فرهنگ لغت بعنوان پيدايش شكلهاي مختلف، نواحي يا انواع مختلف تعريف شده است. چند ريختي به اين معني است كه شكلها يا پيامدهاي زيادي از يك تابع ويژه را داشته باشيم. همانند وراثت چند ريختي نيز در دنياي طبيعي ديده مي شود. در فرمان يا عمل صحبت كردن ممكن است يك انسان جواب دهد «شما چه طوريد»، سگ شايد جواب دهد «واق واق» گربه ممكن است پاسخ دهد «ميو».
چند ريختي در اصطلاحات يك سيستم شيءگرايي به اين معني است كه ما مي توانيم بسياري از رخدادها يا پيامدهاي يك عمل ويژه را داشته باشيم.
مثلاً، ممكن است يك سيستم رسم اشكال گرافيكي را بسازيم. وقتي كاربر مي خواهد چيزي مانند يك خط، دايره يا يك مستطيل را بكشيم، سيستم يك فرمان draw را مي فرستد. سيستم با انواع مختلف شكلها سازگار شده است، هركدام شامل رفتاري است تا خودش را بكشد. بنابراين وقتي كه كاربر مي خواهد يك دايره را بكشد، فرمان رسم آبخكت دايره (draw) درخواست خواهد شد. بااستفاده از چند ريختي، سيستم مي فهمد كه در هنگام اجرا شدن كدام نوع شكل كشيده شده است. بدون چند ريختي، كد تابع draw ممكن است مانند زير باشد.
Function Shape.drawMe()
{
CASE Shape.Type
Case “Circle“
Shape.drawCircle();
Case “Rectangle“ Shape.drawCircle();
Case “Line“
Shape.drawCircle();
END CASE
}
با چند ريختي، كد draw بايد توسط تابع drawme() براي آبجكت طراحي شده فراخواني شود. مانند اين مثال:
Function draw ()
{
Shape.drawme();
}
هر شكلي (دايره، خط وغيره) بايد تابع drawMe را داشته باشد تا شكل بخصوصي را بكشد. يكي از مزاياي چند ريختي مانند ديگر اصول شيءگرايي، نگهداري است.
زماني كه لازم است تا برنامه يك مثلث را رسم نمايد، چه اتفاقي ميافتد؟ در موردي كه از چند ريختي استفاده نشده است يك تابع darw triangle() جديد به آبجكت shape اضافه شده است. همچنين تابع drawme() آبجكت shape تغيير كرده است تا با نوع جديد شكل سازگار شود. با چند ريختي ما يك آبجكت triangle (مثلث) جديد را درون تابع drawMe() ايجاد مي كنيم تا خودش را رسم نمايد. تابع Draw() كه عملگرهاي طراحي را اجرا مي نمايد اصلاً نبايد تغيير كند.
مدلسازي بصري (Visual Modeling) چيست؟
اگر چيز جديدي را براي خانةتان مي سازيد، احتمالاً فقط با خريدن يك تكه چوب و بستن آن به هم تا كه درست به نظر آيد،اين كار را انجام نمي دهيد. شما تعدادي طرح كلي مي خواهيد، تا آنها را دنبال نماييد. بنابرين مي توانيد قبل از شروع به كار، آن چيز را طراحي و ساختاربندي كنيد. مدل ها در دنياي نرم افزار همان كار را براي ما انجام مي دهند. آنها طرحهاي كلي سيستم مي باشند. يك طرح كلي به شما كمك مي كند تا يك چيز اضافي را قبل از اينكه بسازيد،
طراحي كنيد. يك مدل به شما كمك مي كند تا قبل از اينكه يك سيستم را بسازيد، آن را طراحي كنيد. به شما كمك مي كند تا مطمئن شويد كه طرح بي نقص مي باشد،درخواستها ديده شده اند و سيستم مي تواند حتي در مقابل كوهي از تغييرات درخواست، مقاومت نمايد. هنگامي كه درخواستهايي را براي سيستم خود جمع مي كنيد، نيازهاي تجاري كاربران را گرفته و آنها را به درخواستهايي كه تيم شما مي تواند از آنها استفاده كند وبفهمد، تبديل مي كنيد.
سرانجام شما مي توانيد اين درخواستها را گرفته و از آنها كدي توليد كنيد. با تبديل رسمي درخواستها به كد، مي توانيد مطمئن شويد كه درخواستها بوسيله كد مطرح شده اند، و آن كد مي تواند به آساني راه برگشت به درخواستها را طي كند. اين پردازش modeling (مدلسازي) ناميده شده است. نتيجه پردازش مدلسازي اين توانايي است كه نيازهاي تجاري را به درخواستهايي تبديل كند تا دركد به صورت مدل درآيد و دوباره آن را برگرداند بدون اينكه در طول راه چيزي گم شود.
مدلسازي بصري (Visual Modeling) پردازش گرفتن اطلاعات از مدل است و آنرا با استفاده از مجموعه اي از عناصر گرافيكي استاندارد به صورت گرافيكي نمايش مي دهد. يك استاندارد ضروري براي فهميدن يكي از مزاياي مدلسازي بصري، ارتباطات است. هدف اصلي مدلسازي بصري ارتباط ميان كاربران، برنامه نويسان، تحليلگران، آزمايش كننده ها، مديران و هر شخص ديگري كه با يك پروژه درگير شده است، مي باشد.
به نظر مي رسد كه ما قادر هستيم پيچيدگي را بهتر درك كنيم البته وقتي كه برخلاف متن نوشته شده، به صورت بصري به نمايش داده شود. با توليد مدلهاي بصري يك سيستم، مي توانيم نشان دهيم كه چگونه سيستم روي چند سطح كار مي كند. ما مي توانيم فعل و انفعالات بين كاربر ويك سيستم را مدل نماييم.
ما مي توانيم فعل و انفعالات آبجكت ها را در محدودة يك سيستم مدل كنيم. همچنين اگر براي ما مطلوب باشد مي توانيم حتي فعل وانفعالات ميان سيستم ها را مدل نماييم.
بعد از ايجاد اين مدلها مي توانيم آنها را به همة بخشهاي وابسته نشان دهيم و آن بخشها مي توانند اطلاعات را از مدل بدست آورند. مثلاً كاربران مي توانند فعل و انفعالاتي كه با يك سيستم خواهند داشت را از طريق نگاه كردن به يك مدل مجسم نمايند، تحليلگران مي توانند فعل و انفعالات ميان آبجكت ها را از طريق مدلها پيش بيني كنند.
برنامه نويسان مي توانند آبجكت هايي كه نياز است برنامه نويسي شوند و آنهايي كه بايد به نتيجه برسند را پيش بيني كنند. آزمايش كنندگان مي توانند فعل و انفعالات ميان آبجكت ها را پيش بيني كنند و نمونه هاي آزمايش را بر اساس اين فعل و انفعالات آماده كنند. مديران پروژه مي توانند كل سيستم را ببينند و اينكه چگونه بخشها را بر روي هم اثر مي گذارند. و كارمندان ارشد اطلاعات (Chief Information Officer) مي توانند به مدل هاي سطح بالا نگاه كنند وببينند كه چگونه سيستم ها در سازمانهايشان بر روي يكديگر اثر مي گذارند. روي هم رفته، مدلهاي بصري ابزار قدرتمندي را فراهم مي كنند تا سيستم پيشنهاد شده را به همة بخشهاي وابسته نشان دهند.
Booch, OMT, and UML
يك موضوع مهم در مدلسازي بصري اين است كه از چه نماد گرافيكي براي دادن چهرهاي مختلف يك سيستم استفاده شود. لازم است كه اين نماد به همة بخشهاي وابسته رسانده شود، در غير اينصورت مدل خيلي مفيد نخواهد بود. بسياري از افراد نمادهايي را براي مدلسازي بصري پيشنهاد نموده اند. بعضي از اين نمادهاي محبوب كه پشتيباني قوي دارند، Object Modeling Technology (OMT), Booch (تكنولوژي مدلسازي شيء) و (UML) unified Modeling Language (زبان مدلسازي يكپارچه) ميباشند. برنامه Rational Rose 98 از اين اين سه نماد پشبيباني مي كند.
نمودارهاي UML
UML به افراد اجازه مي دهد تا چندين نوع مختلف از نمودارهاي بصري را به وجود آورند ككه جنبه هاي مختلف سيستم را نمايش مي دهد. Rational Rose از ايجاد اكثر اين مدلها، همانطور كه در زير آمده، پشتيباني مي كند.
نمودار Use Case
نمودار Sequence (توالي)
نمودار Collabration (همكاري)
نمودار Class (كلاس)
نمودار State Transition (حالت)
نمودار Component
نمودار Deployment
اين نمودار هاي مدل، جنبه هاي مختلف سيستم را نشان مي دهند. مثلاً نمودار Collaboration محاورات ضروري ميان آبجكت ها را نشان مي دهد، به اين منظور كه تعدادي از توابع سيستم را به انجام برساند. هر نمودار يك هدف و يك شنوندة در نظر گرفته شده دارد.