نمایش نتایج 1 تا 23 از 23

نام تاپیک: آموزش توسعه نرم افزار های شیء گرا توسط UML

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1

    آموزش توسعه نرم افزار های شیء گرا توسط UML

    با توجه به بررسی های انجام داده شده و با توجه به نیاز برنامه نویسان تصمیم به ارائه این موضوع گرفتم . امیدوارم مورد استفاده قرار گیرد.

    مطالب ارائه شده تنها جهت پیشرفت علمی عزیزان می باشد لذا کپی برداری از آن تنها با ذکر منبع و بدون کمترین کم و کاستی مجاز است. و همچین استفاده از آن به عنوان پروژه دانشجویی و امثالهم غیر مجاز است.

    با تشکر
    حامد ذوالقدری

    فصل اول- مفاهیم شیء گرایی

    مقدمه
    شئ گرایی برای توسعه نرم افزار اولین بار در سال 1960 پیشنهاد شد، این روش پس از 20 سال به طور گسترده مورد استفادة جامعه نرم افزاری قرار گرفت. توسعه دهندگان نرم افزار در دهه 1980 توجه جدی خو د را روی شئ گرایی معطوف کردند. تکنولوژی شئ، قابلیت استفاده مجدد را برای مؤلفه های نرم افزاری به ارمغان آورد و این نیز به نوبه خود در تسریع توسعه نرم افزار و تولید محصول با کارایی بالا تاثیر بسزایی دارد؛ بعلاوه سیستمهای شئ گرا، براحتی قابل توسعه و به سهولت با محیط سازگار- از نظر تعامل با سیستمهای موجود در محیط استفاده از نرم افزار- می شوند . دیدگاه شئ گرایی یک سیر تکاملی دارد؛ همچنانکه در بخشهای بعدی خواهیم دید، تعیین همه کلاسهای لازم برای یک سیستم دریک تکرار تا اندازه ای غیرممکن است و به محض تکمیل مدلهای تحلیل و طراحی نیاز به کلاسهای جدید در سیستم نمایان می شود.
    درک سیستمهای پیچیده وتولید نرم افزار برای چنین سیستمهایی توسط افرادی که در این زمینه تجربه کافی ندارند، کاری بس مشکل است . همچنین محصولی که این افراد تولید می کنند کارایی لازم را نخواهد داشت، در اینجا مهندسی نرم افزار به کمک افراد آمده و با مطالعه روشها و فنون مختلف مسیر توسعه و تولید نرم افزار را هموار می- سازد. تجربیات بدست آمده در این زمینه، متدها و فرآیندهای متنوعی را برای توسعه نرم افزار در اختیار توسعه دهندگان قرار داده و ابزارهای مناسبی نیز این روشها را پشتیبانی می کنند.
    درتوسعه یا ساخت نرم افزار برای یک سیستم، مشتری باید تعریف دقیقی از سیستم را در اختیار توسعه دهنده قرار دهد. در توصیف سیستم، زبان طبیعی تا آن اندازه دقیق نیست که بتوان همه نیازمندیها، ساختار و رفتار سیستم را با آن بیان کرد و کد نویسی نیز چنان وارد جزئیات می شود که به یکباره نمی توان سیستم را در این سطح تشریح کرد. لذا برای درک سیستم دست به مدل سازی می زنیم و مؤلفه های سیستم ، زیر سیستمها و رفتار سیستم را به صورت نمودارهای گرافیکی ترسیم می نماییم تا موارد قابل کاربرد و مهم به صورت برجسته به چشم بخورد و هیچ موردی در حوزة سیستم از قلم نیافتد .
    در متد شئ گرا از زبان مدلسازی استانداردUML که در فصل چهارم به تفصیل خواهدآمد، استفاده می شود. این زبان به وسیله ابزارهای مختلفی نظیر Rational Rose ، visio و … پشتیبانی می شود، میتوان ازUML در فرآیندهای مختلف استفاده کرد.

    مفاهیم اساسی
    در این بخش مفاهیم اساسی توسعة نرم افزار شئ گرا را معرفی می کنیم. در بالا به متد و فرآیند اشاره شد اما هیچ تعریفی از آنها ارائه نشد، حال این دو مفهوم کلی را بصورت زیر تعریف می کنیم.

    متد، متدلوژی و اشیاء
    متد مجموعه ای از وظایف را جهت تعیین نیازمندیها، تحلیل، طراحی، برنامه ریزی، تست و پشتیبانی مشخص می کند. از نظر فنی فرآیند توسعه نرم افزار- متدلوژی- یک قالب کاری برای وظایف لازم جهت ساختن یک نرم افزار با کیفیت بالاست. در واقع متدلوژی، فرآیندی ساختارمند جهت توسعه نرم افزار است که به وسیله فنون و ابزارها حمایت می شود.
    متد شئ گرا برپایه شئ استوار است، دیدگاه شئ گرا دنیای واقعی مسئله را بصورت مجموعه ای از اشیاء مرتبط به هم می بیند. شئ یک موجودیت است که در دامنة مسئله نقش تعریف شده ای دارد و دارای حالت، رفتار و شناسة خاص خودش است. شئ می تواند یک ساختار ، نقش ، مکان و ... باشد؛ شئ داده و رفتار را در خود کپسوله میکند و از دسترسی اشیاء دیگر به داده های خود جلوگیری و همچنین تا ثیر تغییرات محیطی بر این داده ها را کاهش می دهد و تنها راه دسترسی به این داده ها استفاده از اعمال یا سرویس های خود شئ می باشد. کلاس نوع اشیاء را نشان می دهد و شامل ویژگی های مشترک مجموعه ای از اشیاء می باشد، شئ نمونه ای از کلاس است . داده های شئ تحت عنوان صفات در کلاس شناخته می شوند و مقادیر این صفات است که شئ را از دیگر اشیای همنوع متمایز می نمایند. اعمال به دستکاری تعداد محدودی از صفات می پردازند و ارتباط بین کلاس ها و دیگر عناصرسیستم نیز از طریق همین سرویسها- اعمال – صورت می گیرد. به عبارت دیگر کلاس یک مشخصه کلی (قالب ، الگو یا طرح اولیه )است که مجموعه ای ازاشیاء مشابه را نشان می- دهد.نماد گرافیکی کلاس در شکل زیر نشان داده شده است، این نماد شامل سه قسمت است که بترتیب نام کلاس ، لیست صفات و لیست اعمال را نشان می دهند.

    ------------------------
    | نام کلاس |
    ------------------------
    | لیست صفات |
    ------------------------
    | لیست اعمال |
    ------------------------

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

    پیامها وسیله برقراری ارتباط و تعامل بین اشیاء می باشند ، این پیامها شئ مقصد را تحریک می کنند تا یک کار خاص را انجام دهد. سرویسی که در شیء فرستنده پیام تولید می کند، یک پیام با قالبmessage:[destination, operation, parameters] ارسال میکند که در آن destination شیء گیرنده و operation سرویسی از شیء گیرنده است که پیام را دریافت می کند و parameters شامل اطلاعات لازم جهت انجام موفق سرویس خواسته شده است. شکل 1-2 مثالی از کلاسهای تعمیم و تخصیص را نشان می دهد که در آن برای دانشجو یک فوق کلاس دانشجو داریم که شامل داده ها و اعمال مشترک بین دانشجویان دورة لیسانس و فوق لیسانس است، همچنین دو زیر کلاس تخصیص جداگانه برای دانشجویان لیسانس و فوق لیسانس نشان داده شده است که حالات خاصی از کلاس دانشجو هستند. در عمل ما شیئی از نوع فوق کلاس دانشجو نخواهیم داشت، در این حالت به کلاسstudent یک کلاس مجرد گفته می- شود . کلاس مجرد کلاسی است که هیچ شیئی از آن نوع نداشته باشیم.

    آخرین ویرایش به وسیله Identifier : سه شنبه 10 مرداد 1385 در 16:27 عصر

  2. #2
    کپسوله سازی، ارث بری و چند ریختی

    با توجه به مطالب ذکر شده در بالا، شیء گرایی به واسطه سه خاصیت مهم کپسوله سازی، ارث بری و چند ریختی یک روش منحصر بفرد است . بطور کلی کپسوله سازی تکنیکی است که جزئیات پیاده سازی داخلی شئ را از دید سایر اشیاء و مؤلفه های سیستم پنهان می کند(مخفی سازی اطلاعات ). عمل، تابعی است که در تمام نمونه های یک نوع وجود دارد و سایر اشیاء تنها از طریق اعمال موجود در یک شئ می توانند به اطلاعات این شئ دسترسی داشته باشند، بنابراین اعمال یک واسط برای کلاس بشمار می روند. واسط رویة بیرونی کلاس را بدون اینکه ساختار درونی وچگونگی پیاده سازی اعمال را نشان دهد ، نمایان می سازد. خاصیت کپسوله سازی داده و عمل دریک کلاس بطور عمده مزایای زیررا دارد.

    ـ جزئیات پیاده سازی داخلی داده و روتین ها از دنیای خارج قابل مشاهده نیست (مخفی سازی اطلاعات ). این خاصیت تاثیر تغییرات محیطی بر شیء را کاهش می-دهد.

    ـ ساختمان داده ها و اعمالی که برای دستکاری داده ها در نظر گرفته شده با هم ادغام شده و تحت یک نام (اسم کلاس) شناخته می شود و این اساس مؤلفة قابل استفاده مجدد را فراهم می نماید.

    ـ واسطه های ما بین اشیاء کپسوله شده ساده اند، لزومی ندارد که شئ فرستندة پیام از جزئیات ساختمان داده درونی شئ مقصد اطلاع داشته باشد.

    خاصیت کلیدی بعدی که روش شیءگرا را از سایر روشها متمایز می دارد، ارث بری است. در شکل بالا زیر کلاس Graduate student همه صفات و اعمال متناظر شده با فوق کلاسش(Student) را به ارث می برد، بدین معنی که تمام ساختمان داده و الگوریتمهایی که برای فوق کلاسstudent طراحی و پیاده سازی شده برای کلاس تخصیص نیز در دسترس می باشد و هیچ کار اضافی لازم نیست انجام بگیرد . و عملاً از قابلیت استفاده مجدد استفاده می کند.

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

    ــ می توان بدون استفاده از ارث بری کلاس را بطور مستقل طراحی نمود.

    ــ بررسی ساختار سلسله مراتبی کلاس های موجود و یافتن سطحی از ارث بری که بیشترین صفات و اعمال کلاس جدید را داراست، سپس کلاس جدید در سطح بالاتر قرار داده می شود و صفات و اعمال موجود در سطح پایین تر را به ارث می برد.

    ــ سلسله مراتب را ساختاربندی مجدد می نماییم تا کلاس جدید بتواند صفات و اعمال لازم را به ارث ببرد.

    چند ریختی مشخصه ای دیگر از شئ گرا است که تا حد زیادی از کارهای لازم جهت توسعه سیستم موجود می کاهد. در واقع چند ریختی بمعنای انجام چند کار مختلف توسط یک چیز است؛ بعنوان مثال برای یک روتین که چهار شکل گرافیکی مختلف، بیضی ، دایره ، مربع و لوزی را رسم کند در حالت عادی برای هر نوع باید متد مخصوص نوشته شده و برای نوع جدیدتر نیز باید متد خاص خود را اضافه نماییم. برای پاسخ گویی به این مشکل در شئ گرایی از چند ریختی استفاده می کنیم، در اینجا همه این انواع به عنوان زیر کلاسهایی از کلاس عمومی Graphقرار می گیرند . هر زیر کلاس یک عمل بنامdraw تعریف می کند، شئ می تواند یک پیامdraw را به هر یک از اشیاء نمونه از یک زیر کلاس بفرستد، شئ گیرندة پیام از تابع draw ی خود می خواهد که رسم مناسب را تولید کند. وقتی که یک رسم الخط دیگر اضافه شود، یک زیر کلاس با تابع draw ی خاص خودش ایجاد می شود و بدین ترتیب کار طراحی ساده تر و از انجام کارهای تکراری جلوگیری می شود. بطور خلاصه، چند ریختی این توانایی را به ما می دهد که چند عمل مختلف را تحت یک نام واحد داشته باشیم .

  3. #3
    شناسایی عناصر مدل شئ
    در زیر مواردی را مطرح می نماییم که با استفاده از آنها شناسایی عناصر مدل شئ که که شامل کلاس، شئ ، صفات ، اعمال و پیامها است، راحتتر صورت می گیرد.

    شناسایی کلاسها و اشیاء
    هنگامی که محیط اطراف خود را نگاه می کنیم براحتی اشیاء فیزیکی زیادی را می- توان شناسایی و تعریف (صفات واعمال) نمود، اما وقتی که فضای مسئله یک نرم افزار را بنگریم، ملاحظه می کنیم که کار مشکلتراست. برای شناسایی اشیاء روی متنی که با زبان طبیعی سیستم را توصیف کرده یک پارس انجام می دهیم و تمام اسمها یا عبارات اسمی رادر یک جدول قرار می دهیم سپس مترادفها را از جدول حذف می نماییم، حال از این اسمها یا عبارات اسمی، آنهایی شئ هستندکه در یکی از موارد زیر صدق کنند:

    ـ موجودیتهای خارجی (سیستمهای دیگر ، ابزارها و افراد) که تولیدکننده یا مصرف کننده اطلاعات در سیستم کامپیوتری هستند.

    ـ اشیائی ( گزارش ، علائم ، سیگنال )که قسمتی از دامنه های اطلاعاتی مسئله هستند.

    ـ رویدادهایی ( مانند ارسال اطلاعات برای تصمیم گیری یک ربات ) که در بطن عملیات سیستم نهفته است.

    ـ نقشهایی ( مدیر ، مهندس ، فروشنده ) که افراد در این نقشها با سیستم تعامل دارند.

    ـ واحد سازمانی (تقسیمات، گروه ، تیم) که مربوط به برنامه کاربردی است.

    ـ اماکن ( کف اتاق، جای خالی در سیستم رزرواسیون ) که عملکرد سیستم به آن وابسته است.

    ـ ساختارها (حسگرها، کامپیوترها) که نوع نقاط انتهایی یا کلاسهای مرتبط با سایر اشیاء را تعیین می نمایند.

    شناسایی صفات شئ
    شیئی که در مرحلة قبل مشخص شده بوسیله مجموعه صفاتش تعریف می شود ، صفات تصویر واضحی از شئ در خلال مسئله به ما می دهند. برای توسعه یک مجموعه با معنا از صفات یک شئ، آنالیست باید متن پروسه را دوباره مطالعه کند و آنچه که درباره یک شئ معین است، مشخص بنماید.

    شناسایی اعمال شئ
    اعمال، رفتار شئ را تعریف می کنند و صفات شئ را با برخی روشها تغییر می دهند. بطور مشخص یک عمل مقدار یک یا چند صفت را که در شئ قرار دارد ، تغییر می- دهد . بنابراین اعمال باید از طبیعت صفات شئ و ساختمان دادة اشتقاقی از آنها اطلاع داشته و با روشهایی پیاده سازی شوند که قادر به دستکاری این ساختمان داده باشند.

    اگر چه انواع مختلفی از اعمال وجود دارد اما عموما به سه دسته تقسیم می شوند:

    1. اعمالی که داده ها را با برخی روشها ( اضافه کردن، قالب بندی مجدد، انتخاب ) دستکاری می کنند.

    2. اعمالی که محاسبات را انجام می دهند .

    3. اعمالی که شئ را برای وقوع رویدادهای کنترلی نمایش می دهند.

    بطور مشابه شناسایی اعمال با پارس دوباره متن زبان طبیعی و مشخص کردن افعال یا عبارات فعلی انجام می گیرد، همچنین اعمال اضافی می تواند با درنظر گرفتن چرخه زندگی شئ در پیامهایی که با سایر اشیاء سیستم رد و بدل می کند ، معین شود. تعیین اعمال آخرین مرحله مشخص سازی شئ است . چرخة زندگی یک شئ با مشخص کردن آنچه که موجب ایجاد شئ ، تغییر دادن، دستکاری کردن ، خواندن شئ و احتمالاً حذف شئ، معین می شود. در قسمت بعدی مدیریت پروژه نرم افزاری را برای پروژه- های شئ گرا را توضیح می دهیم.

    چارچوب یک فرآیند معمولی برای پروژه های شئ گرا
    چارچوب یک فرآیند معمولی روشهایی سازمان یافته را برای مهندسی نرم افزار تعریف می کند. این روش ها به ساخت و نگهداری نرم افزار، وظایف، تفکیک مراحل مختلف توسعه (نقطه بررسی مرحله کاری پروژه ) و محصولاتی که درهر مرحله لازم است، می پردازد. مهندس شئ گرا یک فرآیند تکراری را در توسعه نرم افزار طی می کند، به عبارت دیگر نرم افزار شئ گرا با طی کردن سیکلهایی کامل می شود و یک فرآیند توسعه شئ گرا باید ذات تکاملی داشته باشد تا آنجا که برخی از صاحبنظران در این زمینه یک مدل بازگشتی/ موازی را برای این کارپیشنهاد می کنندکه در اساس بصورت زیر عمل می کند:

    ـ تحلیل مسئله را تا جایی که کلاسهای اصلی مسئله و ارتباطات بین کلاسها مشخص شود، ادامه می دهیم .

    ـ با طراحی یک طرح اولیه تعیین می کنیم که آیا کلاسها و ارتباطات تعیین شده در مرحله قبل در عمل قابل پیاده سازی است یا نه؟

    ـ اشیائی که مجدداً می توانند مورد استفاده قرار بگیرند از کتابخانه اشیاء استخراج می- کنیم تا به وسیله آن یک الگوی سطح بالا از پروژه بسازیم.

    ـ طرح آزمایشهایی جهت کشف خطاهای الگو

    ـ گرفتن فیدبک از مشتری در رابطه با الگوی ساخته شده

    ـ تغییر و تحلیل دوباره مدل براساس آنچه که از الگو، طراحی و فیدبک مشتری عاید شده است.

    ـ اصلاح مدل طراحی جهت وفق دادن تغییرات.

    ـ تولید کد برای برخی از اشیاء ( آنهایی که از قبل قابل دسترسی نیستند)

    ـ اسمبل کردن یک الگوی جدید با استفاده از اشیاء کتابخانه ای و اشیائی که اخیراً ساخته ایم.

    ـ طرح آزمایشات جهت کشف خطاها در الگوی جدید.

    ـ گرفتن فید بک از مشتری در رابطه با الگوی جدید.

    با تجزیه کردن سیستم به مؤلفه های کاملاً مستقل، این کار را تا جایی که الگوی هر مؤلفه کامل شود، تکرار می کنیم. تکرار کردن فرآیند بازگشتی / موازی نیاز به برنامه ریزی، مهندسی(تحلیل ، طراحی ، استخراج کلاس، الگوسازی و تست کردن ) و فعالیتهای تکاملی دارد.

  4. #4
    سیکل توسعة شئ گرا
    چرخة عمر توسعة شئ گرا که در شکل 1-3 نشان داده شده است، شامل پیشرفت موازی نمایان ساختن اشیاء در سه فاز تحلیل، طراحی و پیاده سازی است که در مراحل اولیه توسعة یک مدل انتزاعی بر پارامتر های خارجی- کیفیت سیستم کاربردی - تاکید دارد، با تغییر مدل بیشتر وارد جزئیات می شویم بطوریکه بیشتر به چگونگی ساخت سیستم و چگونگی عملکرد آن می اندیشیم - معماری ، ساختمان داده و الگوریتمها . سرانجام مانند هر سیستم اطلاعاتی، توسعه دهندة سیستم باید به تولید کد و روتینهای دسترسی به پایگاه داده بپردازد.


    شکل 1-3 : فازهای سیکل توسعة سیستمهای شئ گرا

  5. #5
    فصل دوم - تحلیل و طراحی شئ گرا


    فرآیند تحلیل و طراحی شئ گرا
    در این فصل به روندکاری تحلیل و طراحی شئ گرای سیستم می پردازیم. در فاز تحلیل، مدلی از دنیای واقعی نرم افزار در حال توسعه که خواص مهم آن را نشان می- دهد، ساخته می شود. این مدل مفاهیم موجود در دامنه سیستم را بصورت انتزاعی نشان می دهد و بیانگر این است که سیستم چه کاری را باید انجام دهد و به چگونگی انجام (از دید فنی)آنها نمی پردازد. مدل تحلیلی رفتار عملی سیستم را مستقل از محیطی که نهایتا با آن در ارتباط خواهد بود، مشخص می کند. آنالیست باید زمانی را برای کشف نیازمندیهای سیستم صرف کند و مدل باید تمام این نیازها را پاسخگو باشد. توجه شود که ایجاد تغیرات در طول فاز تحلیل بسی آسانتر و با هزینة کمتری نسبت به فازهای بعدی قابل انجام است.

    در فاز طراحی چگونگی برآورده کردن نیازهای کشف شده در مدل تحلیلی از مسئله، در محیط پیاده سازی بررسی می شود. Rumbaugh عملیات فاز طراحی را به دو مرحله تقسیم کرده است:

    1. مرحله طراحی سیستم

    2. مرحله طراحی شئ

    طراح سیستم یک دید کلی از معماری سیستم را در نظر می گیرد و سیستم را در اجزایی کوچکتر که زیرسیستم نامیده می شود، سازماندهی می کند. این دید مبنای تصمیم گیری در شناسایی همروندیها، تخصیص فرآیندها به پردازه ها، دسترسی به منابع و ... قرار می گیرد.
    در طراحی شئ یک مدل طراحی با جزئیات پیاده سازی بیشتری ساخته می شود؛ مانند ساختار بندی دوبارة کلاسها برای بهبود کارایی، ساختمان داده های درونی ، پیاده سازی کنترل سیستم، الگوریتم پیاده سازی هر کلاس، پیاده سازی روابط و بسته بندی کردن در ماژولهای فیزیکی . برای مدل آنالیز شده، فاز طراحی با فاز پیاده سازی دنبال می شود که مدل طراحی شده به کد در زبان برنامه نویسی ترجمه شده و از DBMS برای پایگاه داده های موجود استفاده می کند.

    تحلیل شیءگرا OOA
    هنگامی که می خواهیم یک محصول یا سیستم جدید بسازیم چگونه آن را توصیف کنیم تا با تکنیک های مهندسی نرم افزار شئ گرا بتوانیم یک سیستم مطمئن تولید نماییم؟ آیا سوالهای خاصی در این زمینه وجود دارد که باید از مشتری بپرسیم ؟ اشیاءمربوط به سیستم کدامند؟ اشیاء موجود در سیستم چه ارتباطی باهم دارند ؟ چگونه مسائل را مشخص یا مدل کنیم تا یک طراحی موثر داشته باشیم؟

    هرکدام از این سوالها در بطن تحلیل شئ گرا جواب داده می شود. تحلیل شی گرا اولین مرحله فنی است که به عنوان قسمتی از مهندسی نرم افزار شئ گرا انجام داده می شود. جهت ایجاد یک مدل تحلیلی ازسیستم اصول پایه ای زیر بکار برده می شود.

    1. دامنه اطلاعات باید مدلسازی شود.

    2. کارکرد سیستم توصیف شود.

    3. رفتار سیستم ارائه گردد.

    4. مدلهای داده ای، عملی و رفتاری تقسیم بندی شود تا جزئیات بیشتری از مسئله ارائه شود.

    5. مدلهای اولیه ماهیت مسئله را نشان می دهند در حالیکه مدلهای پایانی جزئیات پیاده سازی را ارائه می کنند. منظور ازتحلیل شیءگرا تعریف تمام کلاس های مربوط به مسئله ای است که باید جواب داده شود - اعمال و صفات متناظر با آنها ، رابطه بین این کلاسها و رفتاری که از خود نشان می دهند. جهت انجام این کار باید وظایف زیر انجام داده شود.

    1. نیاز های اساسی کاربر که باید از طریق مصاحبه با کاربر به اطلاع مهندس نرم افزار برسد .
    1. کلاسها باید شناسایی شوند.
    2. سلسله مراتب کلاس باید مشخص شود.
    3. رابطه شیء به شیء باید نشان داده شود.
    4. رفتار شیء باید مدلسازی شود.
    5. وظایف 1تا 5 باید آنقدر تکرار شود تا مدل تحلیلی کامل شود.

    هدف تحلیل شیء گرا توسعه مدلی است که یک نرم افزار کامپیوتری را - جهت بیان نیاز های تعریف شده توسط کاربر - توصیف می کند.دردهه اخیر آقایان Booch,Raubaugh,Jacobson با ترکیب بهترین ویژگی های روش های شخصی و برخی از روشهای موجود تحلیل و طراحی شیءگرا روشUnified را معرفی کردند که بصورت گسترده ای در صنعت استفاده می شود. در روش Unified از زبان مدلسازی یکپارچه که در فصل بعد به تفصیل خواهد آمد، استفاده می شود . این زبان به مهندس نرم افزار اجازه می دهد تا با استفاده از علائم مدلسازیی که به وسیله مجموعه ای از قواعد نحوی و معنایی کنترل می شود، یک مدل تحلیلی ازسیستم نشان دهد.

    درUML با استفاده از پنج دید مستقل که سیستم را از چشم اندازهای مختلف توصیف می کنند، سیستم به نمایش در می آید. هر دید به وسیله مجموعه ای از نمودارها مشخص می گردد. این دیدگاه ها عبارتند از:

    ــ دید مدل کاربر: دید مدل کاربر سیستم را از چشم انداز کاربر نمایش می دهد. مورد قابل کاربرد روشی برای مدلسازی این دیدگاه است . این نمایش تحلیلی، سناریو های مورد استفاده از چشم انداز کاربر نهایی را توصیف می کند.

    ــ دید مدلسازی ساختاری: در این دید داده و عملکرد درونی سیستم نمایش داده می- شود که ساختار ایستای سیستم(کلاسها،اشیاء و روابط بین آنها) را مدلسازی می کند.

    ــ دید مدل رفتاری: این قسمت از مدل تحلیلی، سیستم را از دید رفتاری بصورت پویا مدل می کند. این دید همچنین تعامل و همکاری ما بین عناصر مختلف ساختاری که در دو دید قبلی توصیف شد، را به تصویر می کشد.

    ــ دید مدل پیاده سازی: این دید، چشم اندازهای رفتاری و ساختاری را آنگونه که باید ساخته شوند، نمایش می دهد.

    ــ دید مدل محیط پیاده سازی: چشم اندازهای ساختاری و رفتاری محیطی که سیستم باید در آن پیاده سازی شود، ارائه می شود.بطور کلی مدلسازی تحلیلی UML روی دید های کاربر و ساختاری سیستم متمرکز می شود و مدلسازی فاز طراحی درUML شامل دید های رفتاری، پیاده سازی و محیط پیاده سازی می شود.

    تحلیل مدل شئ گرا می تواند در سطوح مختلف انتزاعی انجام شود . مدل کردن کار تلاشی است جهت تعریف و شناسایی کلاسها ،اشیاء روابط و رفتارها که کل کار را مدل می کند. مدل شیء در سطح کار روند کاری سیستم تحت مطالعه را نشان می- دهد، اما مدل شیء در سطح نرم افزار کاربردی روی نیازمندیهای مشتری ـ نیازمندیهایی که نحوة ساخت سیستم را تحت تاثیر قرار می دهدـ متمرکز می شود.

    تحلیل دامنه نرم افزار که شامل شناسایی، تحلیل و مشخص سازی نیازهای عمومی در یک دامنه کاری خاص عموماً به منظور استفاده مجدد محصولات پروژه در دست ساخت، در پروژه های بعدی با دامنه کاری مشابه انجام می گیرد. بعبارت دیگر در تحلیل دامنه نرم افزار به دنبال الگو سازی یا استفاده از الگوهای موجود هستیم. در واقع مؤلفه هایی می سازیم که به طور گسترده در پروژه های دیگری نیز بتوانند مورد استفاده قرارگیرند.

  6. #6
    اجزای کلی یک مدل آنالیز شده شئ گرا:
    آنالیز شامل تقسیم دقیق، ساده، قابل فهم و درست مدلی است که از دنیای واقعی گرفته شده است. برای توسعه چنین مدلی از دنیای واقعی، مهندس نرم افزار باید علائمی را جهت نمایش اجزای کلی مدل تحلیلی شئ گرا انتخاب نماید. اجزای کلی مدل تحلیلی(مدلی که در فاز تحلیل ایجاد می شود) عبارتند از:
    ــ یک دید ایستا از کلاسهای معنایی
    ــ دید ایستا از صفات
    ــ دید ایستا از روابط بین کلاسها
    ــ دید ایستا از رفتار ( این رفتار با تعریف یک ترتیب از اعمال ، تعیین می شود.)
    ــ دید پویا از تعامل بین کلاسها و زیر سیستم ها
    ــ دید پویا از کنترل زمانی سیستم

    طراحی شئ گرا OOD
    طراحی شئ گرا مدل ساخته شده در فاز تحلیل را به یک مدل در فاز طراحی تبدیل می کندکه این مدل به عنوان یک طرح اولیه برای ساخت نرم افزار استفاده می شود. برخلاف روشهای سنتی طراحی نرم افزار، طراحی شئ گرا دارای قابلیت پیمانه ای در سطوح مختلف می باشد. مؤلفه های مهم سیستم در زیر سیستم ها سازماندهی می شوند، پیمانه سطح سیستم ، داده ها و اعمال در اشیا کپسول می شوند - فرم پیمانه ای که بلوکی از سیستم شئ گرا را می سازد. علاوه بر این طراحی شئ گرا باید سازماندهی مناسبی را برای داده ها ی مربوط به صفات و همچنین جزئیات رویه های هر عمل را مشخص کند و بدین صورت قطعات مختلف داده و الگوریتم بعنوان قسمتی از پیمانه کلی معین می شود.

    طبیعت منحصر به فرد طراحی شئ گرا در توانایی آن در طراحی نرم افزار بر اساس چهار مفهوم زیر می باشد:

    ــ مجرد سازی( Abstraction)
    ــ مخفی سازی اطلاعات ( Information hiding)
    ــ استقلال تابعی( Functional independency )
    ــ پیمانه ای (Modularity)

    بطور کلی فعالیتهای ساخت یک سیستم شئ گرا عبارتند از: طراحی شئ گرا، برنامه نویسی شئ گرا و تست شئ گرا. در شکل 2-1 یک هرم چهار لایه ای برای طراحی شئ گرا نشان داده شده است.



    لایه های طراحی شئ گرا
    لایة زیر سیستم( subsystem layer): این لایه هر یک از زیر سیستم ها را نشان می دهد که نرم افزار را قادر به برآوردن نیازهای تعریف شده - توسط کاربر - می نماید و همچنین با استفاده از این لایه نرم افزار، فراساختارهای تکنیکی که نیازهای کاربر را پشتیبانی می کند،پیاده سازی می نماید.

    لایة شئ و کلاس( class and object layer ): این شامل کلاسهای سلسله مراتبی است که سیستم را قادر به استفاده از تعمیم و تخصیص می سازد، این لایه همچنین شامل نمایشی از هر شیء است.

    لایه پیام( message layer ): لایة پیام شامل جزئیات طراحی است و شئ را قادر می- سازد تا با دیگر اشیاء تعامل داشته باشد. این لایه بر واسط های نرم افزاری داخلی و خارجی سیستم استوار است.

    لایة مسؤلیتها (responsibility layer ): این لایه شامل طراحی داده ساختارها و الگوریتم ها برای تمام صفات و اعمال موجود در هر شئ می باشد.

    شکل 2-2 رابطه بین مدل تحلیلی شی گرا و مدل طراحی که از آن مشتق شده را نشان می دهد. طراحی زیرسیستم از توصیف نیازهای کلی مشتری در قالب موارد قابل کاربرد، رویدادها و حالاتی که از دید یک بیننده غیر تکنیکی که توسط مدلهای رفتاری - برای اطلاعات بیشتر در مورد نمودار های رفتار و موارد قابل کاربرد به فصل چهارم مراجعه شود - تصویر شده ، اشتقاق می شود. طراحی کلاس و اشیاء از توصیف صفات، اعمال و همکاری های موجود در مدلCRC نگاشت می شود، طراحی پیامها از مدل رابطه بین اشیاء و سرانجام طراحی مسؤلیتهای شئ ازصفات، اعمال و همکاری های توصیف شده در مدلCRC مشتق می شود.

  7. #7
    //یک مدت به خاطر مشغله زیاد ادامه این مبحث مقدور نبود امیدوارم تا پایان سال بتونم این مبحث را تمام کنم.

    صفات و اعمال

    صفات خیلی شبیه تناظرهاست. در سطح مفهومی صفت نام مشتری نشان دهنده این است که مشتریان دارای نام هستند، در سطح تشخیصی این صفت نشان دهنده این است که شئ مشتری می تواند نام خودش را به شما بگوید و روشی برای تنظیم نام ها باید وجود داشته باشد. اما در سطح پیاده سازی بدین معناست که customer دارای فیلدی برای نام است. بیان صفات در UML بصورت زیر است:

    visibility name :  type = default_value
    visibility محدوده دید را تعیین می کند، که شامل سه نوع دید عمومی، خصوصی و محافظت شده است. دید عمومی با علامت (+)، خصوصی با (-) و دید محافظت شده با(# ) مشخص می شود. در دید عمومی دسترسی به این صفت برای همه کلاسهای زیر سیستم به شرطی که به نوعی با کلاس شامل این صفت در ارتباط باشند، مجاز است. اما در دید خصوصی دسترسی به این صفت فقط برای اعمال همان کلاس مقدور است. دید محافظت شده بدین معناست که دسترسی به این صفت برای زیرکلاس هایِ کلاس موجود مجاز است.name نیز یک رشته از کاراکترهای الفبا عددی است که با یک حرف شروع می شود و نام صفت را مشخص می کند. Type نوع صفت را نشان می- دهد. Defulte_value مقدار پیش فرض که در لحظه ایجاد شئ در این صفت قرار می- گیرد، را نشان می د هد. برای نشان دادن چندتایی در صفت از شکل کلی name[multiplicity] استفاده می شود.

    اعمال شامل فرآیند هایی است که کلاس باید آنها را انجام دهد. از نظر دیدگاه تشخیصی اعمال همان متدهای عمومی یک نوع (کلاس) می باشد. درUML اعمال را بصورت زیر تعریف می کنیم:

    visibility name(parameter- list):return-type-expression {property- string}

    visibility و name همانطوریکه در صفات استفاده می شود در اعمال نیز بکار می رود.
    parameter- list لیست پارامترها است که با کاما از هم جدا شده اند و مانند صفات بصورت زیر تعریف می شوند:

    direction name : type = Defulte value
    با این تفاوت که در اینجا یک عنصر اضافی direction اضافه شده است که بمنظور نشان دادن اینکه پارامتر از نوع ورودی input(in) ، خروجیoutput(out) یا هر دو ورودی / خروجی (inout) است، استفاده می شود. هر جاکه هیچ جهتی استفاده نشده باشد بدین معناست که پارامتر ورودی است.
    return-type-expression : انواع داده های برگشتی که با کاما از هم جدا شده اند را نشان می دهد. اغلب از یک نوع برگشتی استفاده می شود اما چند نوع برگشتی نیز مجاز است.
    property- string : شامل مقادیرمشخصاتی است که برای انجام یک عمل داده شده بکار برده می شود. از دیدگاه مفهومی نباید اعمال را بعنوان یک واسط تعبیر کنیم بلکه آن را جزء مسؤلیتهای شئ در نظر بگیریم. اعمال را می توان به سه نوع زیر طبقه بندی کرد:
    constructore operation : عملی که نمونه ای جدید ازکلاس را می سازد(یک شئ جدید).
    query operations : شامل اعمالی است که به حالت شئ دسترسی دارد ولی حالت آن را تغییر نمی دهد.

    Update operation : این اعمال حالت شئ را تغییر می دهند.( به این اعمال setting method نیز گفته می شود که یک مقدار را در یک فیلد قرار می دهند و هیچ کار دیگری انجام نمی گیرد.)
    query ها را با هر ترتیبی می توان اجرا کرد اما ترتیب اجرای اعمال Updateبسیار مهم است . تفاوت بین عمل و متد این است که عمل چیزی است که در خواستی از شئ انجام می دهد- فراخوانی رویه - اما متد شامل بدنه رویه است.

    تعمیمgeneralization

    از نظر تشخیصی تعمیم به معنای این است که واسط نرم افزاری زیر نوع ها باید شامل همه عناصر واسط فوق نوع باشد، تعمیم از یک جنبه دیگر نیز جای تفکر است وآن قابلیت جایگزینی است. بدین صورت که ما باید قادر باشیم در هر جای برنامه (کد) که به فوق کلاس نیاز داشتیم، هر کدام از این زیر نوع ها را جایگزین کنیم بدون اینکه به عملکرد مسئله لطمه ای وارد شود و همه چیز به درستی کار بکند. مثلا اگر در جایی از کد لازم باشد که یک customer داشته باشیم باید بتوانیم آزادانه هر یک از زیر نوع های personal و corporate را جایگزین کنیم . corporate ممکن است که یک دستور خاص را متفاوت با زیر نوع دیگری انجام دهد اما نباید این تفاوت برای فراخوان دستور مهم باشد.
    تعمیم از چشم انداز پیاده سازی با ارث بری در زبان برنامه نویسی متناظر است. زیر کلاس تمام متد ها و ویژگیهای فوق کلاس را به ارث می برد و ممکن است که متدهای به ارث گرفته را به نحو بهتری پیاده سازی نماید.

  8. #8
    من که خیلی از مطالب خوشم اومد و به عنوان تشکر اونها رو به pdf تبدیل کردم تا راحتتر بشه استفادشون کرد (ضمیمه شد)
    فکر نمیکردم ۲۳ صفحه بشه!
    ولی کیفیت عکسها کلا خیلی پایینه...

    آقای identifier به عنوان پیشنهاد٬ به نظرتون بهتر نیست این مقاله تحت لیسانس GNU/FDL یا GNU/GPL منتشر بشه؟
    موفق باشید...
    شهاب.

    ـــــــــــــــــــــــــ ــــ
    این خرابه قبرستان نه ایران ماست *** این خرابه ایران نیست٬ ایران کجاست؟
    فایل های ضمیمه فایل های ضمیمه

  9. #9

    نقل قول: آموزش توسعه نرم افزار های شیء گرا توسط UML

    سلام اگه امکانش هست و میدونید لطفا" جواب سوال منو بگید.

  10. چهارشنبه 17 شهریور 1389, 20:28 عصر

    دلیل
    Spam

  11. #11
    کاربر تازه وارد
    تاریخ عضویت
    آبان 1384
    محل زندگی
    بابل
    پست
    49

    نقل قول: آموزش توسعه نرم افزار های شیء گرا توسط UML

    ممنون از مطالب شما
    عکس ها در اندازه بزرگ باز نمی شود. لطفا بررسی فرمایید.

  12. #12

    نقل قول: آموزش توسعه نرم افزار های شیء گرا توسط UML

    میشه یه مقاله معتبر حاوی موارد بالا ارائه بدید؟

  13. #13

    نقل قول: آموزش توسعه نرم افزار های شیء گرا توسط UML

    نقل قول نوشته شده توسط Identifier مشاهده تاپیک
    با توجه به بررسی های انجام داده شده و با توجه به نیاز برنامه نویسان تصمیم به ارائه این موضوع گرفتم . امیدوارم مورد استفاده قرار گیرد.

    مطالب ارائه شده تنها جهت پیشرفت علمی عزیزان می باشد لذا کپی برداری از آن تنها با ذکر منبع و بدون کمترین کم و کاستی مجاز است. و همچین استفاده از آن به عنوان پروژه دانشجویی و امثالهم غیر مجاز است.

    با تشکر
    حامد ذوالقدری

    فصل اول- مفاهیم شیء گرایی

    مقدمه
    شئ گرایی برای توسعه نرم افزار اولین بار در سال 1960 پیشنهاد شد، این روش پس از 20 سال به طور گسترده مورد استفادة جامعه نرم افزاری قرار گرفت. توسعه دهندگان نرم افزار در دهه 1980 توجه جدی خو د را روی شئ گرایی معطوف کردند. تکنولوژی شئ، قابلیت استفاده مجدد را برای مؤلفه های نرم افزاری به ارمغان آورد و این نیز به نوبه خود در تسریع توسعه نرم افزار و تولید محصول با کارایی بالا تاثیر بسزایی دارد؛ بعلاوه سیستمهای شئ گرا، براحتی قابل توسعه و به سهولت با محیط سازگار- از نظر تعامل با سیستمهای موجود در محیط استفاده از نرم افزار- می شوند . دیدگاه شئ گرایی یک سیر تکاملی دارد؛ همچنانکه در بخشهای بعدی خواهیم دید، تعیین همه کلاسهای لازم برای یک سیستم دریک تکرار تا اندازه ای غیرممکن است و به محض تکمیل مدلهای تحلیل و طراحی نیاز به کلاسهای جدید در سیستم نمایان می شود.
    درک سیستمهای پیچیده وتولید نرم افزار برای چنین سیستمهایی توسط افرادی که در این زمینه تجربه کافی ندارند، کاری بس مشکل است . همچنین محصولی که این افراد تولید می کنند کارایی لازم را نخواهد داشت، در اینجا مهندسی نرم افزار به کمک افراد آمده و با مطالعه روشها و فنون مختلف مسیر توسعه و تولید نرم افزار را هموار می- سازد. تجربیات بدست آمده در این زمینه، متدها و فرآیندهای متنوعی را برای توسعه نرم افزار در اختیار توسعه دهندگان قرار داده و ابزارهای مناسبی نیز این روشها را پشتیبانی می کنند.
    درتوسعه یا ساخت نرم افزار برای یک سیستم، مشتری باید تعریف دقیقی از سیستم را در اختیار توسعه دهنده قرار دهد. در توصیف سیستم، زبان طبیعی تا آن اندازه دقیق نیست که بتوان همه نیازمندیها، ساختار و رفتار سیستم را با آن بیان کرد و کد نویسی نیز چنان وارد جزئیات می شود که به یکباره نمی توان سیستم را در این سطح تشریح کرد. لذا برای درک سیستم دست به مدل سازی می زنیم و مؤلفه های سیستم ، زیر سیستمها و رفتار سیستم را به صورت نمودارهای گرافیکی ترسیم می نماییم تا موارد قابل کاربرد و مهم به صورت برجسته به چشم بخورد و هیچ موردی در حوزة سیستم از قلم نیافتد .
    در متد شئ گرا از زبان مدلسازی استانداردUML که در فصل چهارم به تفصیل خواهدآمد، استفاده می شود. این زبان به وسیله ابزارهای مختلفی نظیر Rational Rose ، visio و … پشتیبانی می شود، میتوان ازUML در فرآیندهای مختلف استفاده کرد.

    مفاهیم اساسی
    در این بخش مفاهیم اساسی توسعة نرم افزار شئ گرا را معرفی می کنیم. در بالا به متد و فرآیند اشاره شد اما هیچ تعریفی از آنها ارائه نشد، حال این دو مفهوم کلی را بصورت زیر تعریف می کنیم.

    متد، متدلوژی و اشیاء
    متد مجموعه ای از وظایف را جهت تعیین نیازمندیها، تحلیل، طراحی، برنامه ریزی، تست و پشتیبانی مشخص می کند. از نظر فنی فرآیند توسعه نرم افزار- متدلوژی- یک قالب کاری برای وظایف لازم جهت ساختن یک نرم افزار با کیفیت بالاست. در واقع متدلوژی، فرآیندی ساختارمند جهت توسعه نرم افزار است که به وسیله فنون و ابزارها حمایت می شود.
    متد شئ گرا برپایه شئ استوار است، دیدگاه شئ گرا دنیای واقعی مسئله را بصورت مجموعه ای از اشیاء مرتبط به هم می بیند. شئ یک موجودیت است که در دامنة مسئله نقش تعریف شده ای دارد و دارای حالت، رفتار و شناسة خاص خودش است. شئ می تواند یک ساختار ، نقش ، مکان و ... باشد؛ شئ داده و رفتار را در خود کپسوله میکند و از دسترسی اشیاء دیگر به داده های خود جلوگیری و همچنین تا ثیر تغییرات محیطی بر این داده ها را کاهش می دهد و تنها راه دسترسی به این داده ها استفاده از اعمال یا سرویس های خود شئ می باشد. کلاس نوع اشیاء را نشان می دهد و شامل ویژگی های مشترک مجموعه ای از اشیاء می باشد، شئ نمونه ای از کلاس است . داده های شئ تحت عنوان صفات در کلاس شناخته می شوند و مقادیر این صفات است که شئ را از دیگر اشیای همنوع متمایز می نمایند. اعمال به دستکاری تعداد محدودی از صفات می پردازند و ارتباط بین کلاس ها و دیگر عناصرسیستم نیز از طریق همین سرویسها- اعمال – صورت می گیرد. به عبارت دیگر کلاس یک مشخصه کلی (قالب ، الگو یا طرح اولیه )است که مجموعه ای ازاشیاء مشابه را نشان می- دهد.نماد گرافیکی کلاس در شکل زیر نشان داده شده است، این نماد شامل سه قسمت است که بترتیب نام کلاس ، لیست صفات و لیست اعمال را نشان می دهند.

    ------------------------
    | نام کلاس |
    ------------------------
    | لیست صفات |
    ------------------------
    | لیست اعمال |
    ------------------------

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

    پیامها وسیله برقراری ارتباط و تعامل بین اشیاء می باشند ، این پیامها شئ مقصد را تحریک می کنند تا یک کار خاص را انجام دهد. سرویسی که در شیء فرستنده پیام تولید می کند، یک پیام با قالبmessage:[destination, operation, parameters] ارسال میکند که در آن destination شیء گیرنده و operation سرویسی از شیء گیرنده است که پیام را دریافت می کند و parameters شامل اطلاعات لازم جهت انجام موفق سرویس خواسته شده است. شکل 1-2 مثالی از کلاسهای تعمیم و تخصیص را نشان می دهد که در آن برای دانشجو یک فوق کلاس دانشجو داریم که شامل داده ها و اعمال مشترک بین دانشجویان دورة لیسانس و فوق لیسانس است، همچنین دو زیر کلاس تخصیص جداگانه برای دانشجویان لیسانس و فوق لیسانس نشان داده شده است که حالات خاصی از کلاس دانشجو هستند. در عمل ما شیئی از نوع فوق کلاس دانشجو نخواهیم داشت، در این حالت به کلاسstudent یک کلاس مجرد گفته می- شود . کلاس مجرد کلاسی است که هیچ شیئی از آن نوع نداشته باشیم.

    سلام به همه دوستان عزیز
    من میخام با استفاده از ابزار uml مدل مفهومی و منطقی برای سیلاب طراحی کنم طوریکه بتونم بعدا تو پایگاه داده اونو اجرا کنم برای ایین منظور از کدوم دیاگرام ها باید استفاده کنم همچنین میخام تو محیط اینتریرایز ارچیتکت باشه. از دوستان اگه کسی در این مورد اطلاعاتی داره ممنوم میشم راهنماییم کنه.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •