الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقدمه في التحليل والتصميم الكائني Ooad

مثبّترائج
بدأه Wajdy Essam في 21 فبراير 2009 · 33 رد · 67,410 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله ويركاته ،،

مقدمه :

=-=-=-=

إن موضوع التحليل والتصميم بالكائنات من أهم المواضيع الني ينبغي لأي مبرمج أو مطور يستخدم لغه كائنيه أن يجيده ، حيث على المبرمج أن يقوم بتحليل البرنامج أولا ويعرف ما هي المشكله التي يريد أن يحلها Analysis ومن ثم يبدأ هذا المبرمج بطرح الحلول وكيف يمكن أن تتفاعل هذه الكائنات مع بعضها البعض design ، ومن ثم يقوم بعمليه الCoding ويقوم بتطبيق التصميم الذي طرحه في المرحله السابقه ، وأخيرا يقوم باجراء الTesting للبرنامج والتأكد من مطابقته لمتطلبات الزبون Customer Requirement .

العمليات السابقه التي ذكرتها (Analysis,Design,Coding,Testing) تعرف بدوره حياه المشروع Software Development Life Cycle . وبالطبع أي مشروع يجب أن يمر على جميع هذه المراحل بترتيب معين حيث أن عمليه التطوير يجب تكون على منهجيه معينه وباتباع طريقه ما Methodology والا ستعم الفوضي ولن تستطيع حتى كتابه سطر واحد صحيح من البرنامج .

باتباع هذه المهجيات سوف تضمن أن عمليه تطويرك للبرنامج تسير في المنحنى الصحيح ، كما أنها توفر لك كل ما تحتاجه من وقت البدء في تحليل المشروع الى وقت التسليم والصيانه للمشروع ، اضافه الى توضيح نوعيه الوثائق والمخططات التي ستنتجها كل مرحله Activities & Artifacts وليس هذا فقط فهناك منهجيات توفر لك نصائح وارشادات في عمليه جدوله المشروع واداره الفريق وما الى ذلك من العمليات الإداريه Management Task .

قديما كانت تجري هذه العمليات SDLC بالترتيب وبشكل متنازل وهو ما يعرف بنموذج الشلال Waterfall Model .. حيث يقوم أولا المحلل بتحليل البرنامج بالكامل وكتابه جميع الوثائق المطلوبه ومن ثم يمرر هذه الوثائق للمصمم الذي يقوم بتصميم النظام ووضع حلوله أيضا ، ومن ثم تمر بالمبرمج الذي يقوم بكتابه الكود وعندما ينتهي تجرى الأختبارات على هذا البرنامج وأخيرا يسلم الى الزبون ..

OOAD1.PNG

ولكن للأسف هذا النموذج لا يصلح بتاتا الا في المشاريع الصغيره والتي لا يوجد فيها خطوره ما (مثلا فريق التطوير قد قام بمشروع مشابه للمشروع الحالى ، حينها يمكن أن يستخدم هذا النموذج) .. مشكله أخرى وهي عدم وجود وثائق موحده تمر علي جميع فريق التطوير فالمحلل لديه اساليب خاصه فيه والمصمم كذلك وكل منهم بحاجه الى مزيد من الوقت لكي يفهم ماذا كان يقصد الشخص الذي كتب هذه الوثائق ..

ليس هذا فقط فعند الدخول في المشاريع الكبيره تبدأ المشاكل الأكبر بالظهور، فنموذج الشلال لا يسمح يتغيير المتطلبات ، حيث يجب على المحللين في البدايه أن يقوموا بتحليل النظام بشكل كااامل ومن ثم تبدأ مرحله التصميم وهكذا لجميع المراحل حيث لا عوده للخلف بتاتا .. السؤال هنا ماذا لو تغيرت متطلبات هذا الزبون بعد مرور 3 أشهر من التحليل والتصميم وبالبدء بالكود ، كارثه !! وحتى ولو لم تتغير المتطلبات ففي حال استخدم نموذج الشلال في مشروع كبير فهذا يعني تحليله بالكامل ثم تصميمه بالكامل وبرمجته بالكامل وهذا غير منطقى خصوصا في البرامج الكبيره حيث يجب أن تقسم لأجزاء صغيره يتم العمل على كل منها على حده . الصوره التاليه تشبه عمليه تطوير مشروع ضخم باستخدام نموذج الشلال بعمليه أكل فيل من غير تقسيم :) :

OOAD.PNG

ناهيك عن الوقت المستغرق في كل مرحله ، حيث لأنها يجب أن تكون كامله وشامله يبدأ الخوف لدي المحللين فيأخذوا وقت أكثر من المفترض أن يكون به ويبدأ في ذكر "يبدوا أن هناك شيء ناقص ، سنعيد تحليل هذه النقطه" ، "يجب أن نراجع التحليل مره أخرى ، حيث اذا حدثت مشكله الأن سوف تبقى على اكتافنا" وهكذا يصاب المحلل ب Analysis Paralysis ، بنفس الأمر عند المصمم والمبرمج والشخص الذي يقوم بالأختبار كل منهم يصاب بهذه العقده خاصه ان كان قد فشل في مشروع سابق :).

مع وجود كل هذه العيوب في هذا النموذج الا أنه يقدم تسلسل منطقى في عمليه تطوير (تحليل ثم تصميم ثم برمجه ثم اختبار) وبالتالي يمكن أن يستفاد من هذه التسلسل في منهجيات أخرى أكثر مرونه في الشلال وهذا ما حصل بالفعل .

النموذج الحلزوني Spiral كان من أول المحاولات في تطوير الشلال ، حيث يمكن أن نطور المشروع في أكثر من دوره (بمعنى أكثر من نموذح شلال في اَن واحد) .. وبنفس المراحل الموجوده في الشلال .. وبالتالى كان يمكن لفريق التطوير أن يقوموا بأخذ متطلبات غير كامله ويبدؤا بتحليلها وتصميمها وبرمجتها ، وهكذا تنتهي الدوره الأولى .. وتبدأ الدوره الثانيه وهكذا الى أن ينتهي تطوير المشروع بالكامل .

OOAD2.PNG

النموذج الحلزوني قلل من المشاكل بشكل كبير ، ولكن يمكن أن تظهر نفس المشكله في التي كانت تظهر في الشلال ، حيث في حال أكتشف المبرمج أن هناك خطأ أو نقص في التصميم لا يمكن العوده للخلف ويجب الانتظار حتى البدء في الدوره الثانيه .. النموذج جيد ولكن نريد أن نسمح بالعوده للخلف ..

النموذج المتكرر Iterative Methodology كان هو الحل لهذه المشكله ، حيث يمكن في هذا النموذج أن نعود خطوه للوراء ونصلح ذلك الخلل ونكمل السير في هذه الدوره

OOAD3.PNG

بالتالى أصبحت عمليه التطوير هي عباره عن عده دورات ، كل منها تستطيع التحرك خطوه للأمام أو الخلف على حسب ما تريده .. ولكن ما زالت المشاكل بالظهور فما زلت تقوم بأكل الفيل من مره واحده ،، جيث الدورات السابقه كانت لاصلاح خلل وغالبا ما تكون 4 دورات .. نحن نريد تقسيم المشروع لأكثر من دوره وفي كل مره نقوم بتطوير جزئيه معينه وهذا هو النموذج المتصاعد ، الصوره التاليه تبين تطوير الاصدارات مع تقدم الزمن ..

OOAD5.PNG

في حال أنك لاحظت أن جميع هذه الطرق (الشلال ، الحلزوني ، المتصاعد ، المتكرر) كل منها توجد فيه خاصيه مفيده في عمليه التطوير ، وبالتالى يمكن أن نجمع جميع هذه الطرق مع بعضها البعض وبالتالى نستفيد من جميع المزايا في كل واحده من الطرق

OOAD4.PNG

بعد جمع هذه الطرق جميعها ، مازال ينقص شيء مهم جدا ، وهو توضيح مالذي يجب أن نفعله في مرحله التحليل ، ما هي نوعيه الوثائق التي يجب أن تنتج ؟ ما هو شكل الأختبارات التي يجب أن تكون ؟ ما هي المخططات التي يجب أن تستخدم في مرحله التصميم ؟ نعم نحن بحاجه الى لغه موحده للرسومات ومنهجيه معينه في التطوير تسمح لي باتباع خطواتها للوصول للمشروع الناجح ان شاء الله ..

من هذه النقطه ظهرت العديد المنهجيات التي توضح كيفيه تطوير المشاريع مثل RUPو Ripple و Agile ، بالاضافه الى العديد من الطرق المستخدمه في وصف ورسم العلاقات والطرق المستخدمه وكانت أشهرها وأفضلها وأصبحت الأن هي المقياس هي Unified Modeling Language .

RUP وUML كانت نتيجه مجهودات الأصدقاء الثلاثه Grady Booch و Ivar Jacobson و James Rumbaugh حيث كان لكل منهم لغه نمذجه خاصه فيه اضافه الى منهجيه معينه للتطوير ، فاجتعموا على تطوير لغه نمذجه موحوده ومن هنا كانت بدايه لUML ، وبعدها أصحبت معيار رسمي وسجلت لدى OMG .. أما RUP فتعتبر من أشهر المنهجيات للتطوير ومن أصعبها أيضا على المبتدئين ..

Agile methodology هي مجموعه من المنهجيات الجيده و التي ترحب بتغييرات المتطلبات في أي لحظه في دوره حياه المشروع ، كما أنها تتسم بالسرعه والخفه .. أحد أشهر هذه المنهجيات هي eXtreme Programmingوهي تعمل بمبدأ test-driven development و pair programming بمعنى ان المبرمج سيقوم قبل كتابه الكود بكتابه أختبار سيجريه على الكود الذي سيكتبه وعند الأنتهاء يختبر الكود فاذا نجح فينتقل للخطوه التاليه (كود الأختبار قبل الكود) .. أما pair programming فتعني أنه يجب أن يكتب الكود من قبل مبرمجين اثنين يكونوا أما الشاشه في نفس اللحظه .. أحدهم يراقب الكود والأخر يستلم عجله القياده (الكيبورد) :) .. فاذا تعب يتم التبديل وهكذا ... مناصروا الXP يروا أن استخدام هذه الطريقه يزيد من كفائه المبرمجين وخاصه في حال جلس مبرمج مبتدأ مع أخر خبير بالمجال..

أما Ripple فهي أيضا أحد المنهجيات والتي هي عباره عن نسخه مبسطه من الRUP ، الصوره التاليه تبين لك المخرجات الناتجه في كل مرحله من مراحل التطوير باستخدام Ripple ..

OOAD6.PNG

لاحظ أن جميع هذه المنهجيات أصبحت تستخدم UML كلغه موحوده في جميع المشاريع ، وبالتالى على المبرمج أن يكون على بهذه المخططات البسيطه ( هي 13 مخطط فقط) .. ملاحظه اخرى وهى أن هذه المخططات في النهايه هي عباره عن مخططات فقط !! فهي لن ترشدك في عمليه التطوير ولن تريك ما الذي يمكن أن تفعله في هذه المرحله فهي من مسؤوليه المنهجيه .. بالتالى على المبرمج أن يتعلم هذه المنهجيات ويعرف الفرق فيما بينهم وما هي المنهجيه التي ستفيده في مشروعه الحالى ..

بالطبع تعلم منهجيه ثقيله كRUP أو حتى ripple بالنسبه للمبتدئين أمر غير جيد حيث سيصعب على المبتدئ التعلم من خلال هذه المنهجيات ، لذلك كانت هناك منهجيات خفيفه lightweight process يمكن أن تستخدم كمثال عملي على التطوير باستخدام منهجيه ما . وهناك الكثير من المنهجيات الخفيفه بل ربما يمكنك أن تنشئ منهجيتك الخاصه في التطوير .. الصوره التاليه توضح خطوات منهجيه خفيفه سوف نستخدمها في الدروس المقبله ان شاء الله .

OOAD7.PNG

مقدمه في UML :

=-=-=-=-=-=-=-=

لغه UML تقدم وصف لكيفيه بناء المشروع البرمجي ، وتقدم وصف دقيق لمعماريه مشروعك Architecture ، فكما يقوم البنائيين ببناء المنازل من خلال اتباع مخطط Blueprint قام بعملها المهندس المعماري ، يقوم المبرمج باتباع مخططات UML قام بها المحللين والمصممين للبرنامج. هذه اللغه كما ذكرنا أصبحت المقياس في وصف المخططات عند بناء أي مشروع برمجي . وهي حوالي 13 مخطط . سوف نستعرض أهمهم الأن بشكل مبسط بدون الدخول في التفاصيل وهم : use-case , sequence , collaboration , activity , state , package , component .

هذه المخططات يمكنك استخدامها وقت ما تشاء كيفما تشاء ، فلغه UML لم تحدد وتفصل مالذي يجب أن تستخدمه مثلا في مرحله التصميم أو التحليل .. فهذه من مسوؤليه المنهجيه .. لغه UML هي فقط مجموعه من المخططات عليك أن تعرف كيف ومتى يجب أن تستخدمهم .. لذلك موضوع المنهجيه مهم جدا لأنه بدون منهجيه ولو كانت بسيطه فلن تستطيع معرفه ما المخطط المطلوب في مرحله جمع المتطلبات أو مرحله التحليل وهكذا سيكون أستخدام UML وبالا عليك (ماعدا في Toys-example كما سنرى بعد قليل ) .

Use-Case Diagram يستخدم هذا المخطط لوصف متطلبات النظام بشكل High-level حيث يوضح المهام الذي يجب أن يقوم بها المستخدم (سواء كان انسان Customer أم نظام فرعي Subsystem) . ومن خلال النظر في المخطط يمكن للمبرمج أن يعرف ماهي المهام التي يجب أن يؤديها النظام . حيث تمثل الدائره المهمه أو الوظيفه التي يجب أن يقوم بها النظام ، ويمثل اللاعب Actor الشخص أو النظام الذي سوف يقوم بهذه المهمه .

UML5.jpg

Class Diagram يوضح هذا المخطط الModel الذي سوف تقوم ببنائه ، بالاضافه الى العلاقه بين كل من هذه الكلاسات .. ويستخدم عاده في مرحلتين التحليل والتصميم ، حيث في المرحله الأولى نقوم بتوضيح اسم الكلاس وعلاقته مع البقيه ، أما في مرحله التصميم فنوضح جميع الخصائص والعمليات التي يقوم بها هذا الكلاس بالتفصيل ..

مثال على class diagram في مرحله التحليل :

UML7.PNG

وهنا مثال على class diagram في مرحله التصميم :

UML4.jpg

Sequence Diagram وهو أحد مخططات التفاعل Interaction Diagram يوضح هذا المخطط طريقه عمل Use-Case ما خلال الزمن ، وستشاهد أن هناك خطوط متقطعه تمثل الزمن ، ومستطيل صغير خلال هذه الخطوط يمثل زمن البدء في عمل هذا الكائن ويسمى activation .

UML2.jpg

Collaboration Diagram أيضا هو أحد مخططات التفاعل Interaction Diagram وهو يشبه مخطط التتابع ولكنه لا يوضح التسلسل الزمني للأحداث ، المثال التالى لمخطط تفاعل لاسترجاع كلمه مرور .

UML9.PNG

Activity Diagram يوضح هذا المخطط سلوك النظام بشكل عام أو أحد مهمات النظام Use-Case وكيف تنتقل من نشاط لأخر . وهو يشبه الflow chart .

UML8.PNG

وغيرها من المخططات والتي يستخدم كل منهم لأمر معين .. يمكنك البحث والقرائه في كتب UML للمزيد عنها . سوف نستعرض الأن موضوع مهم وهو العلاقات بين الكائنات ونأخذ مثالين على ذلك ..

Modeling Class Relationship

من أهم المخططات في UML هي مخططات الكلاس ، حيث ستكون الأساس في عمليه البرمجه ، وهناك الكثير من البرامج تستطيع توليد الكود من خلال مخططات الكلاس ، وأيضا هناك برامج تقوم بالبعكس فهي تخرج المخطط من الكود ، نقوم بالتفصيل الأن في هذا المخطط المهم .

مخطط الكلاس في أبسط حالته يكون بالشكل التالى :

OOAD12.PNG

حيث يحتوي على المتغيرات التي توجد في الكلاس ، بالاضافه الى الدوال التي تعمل على ذلك الكائن ، ويمكن أن تستخدم note للاشاره الى المخطط الذي تريده وللشرح بشكل أوضح .. وكما هو الحال في الكلاسات العاديه فيجب تحديد الرؤيه Visibility لأي متغير أو داله في الكلاس وذلك باستخدام الاشارات (-و+،#) .. الصوره التاليه توضح ذلك :

OOAD13.PNG

نقوم بالتطبيق مثلا على حساب بنكي يحتوي على رصيد ودوال للعمليات عليه ، وبالتالى يكون شكل المخطط كالتالي :

OOAD14.PNG

بعض الأحيان قد تحتاج لأن تقوم بتوضيح مصطلح جديد غير موجود في مخطط الكلاس ، وهو يسمى ب Steretype ويكون بالشكل << >> وتكتب بداخل القوسين المصطلح الجديد ، مثلا abstract , accessors , interface وغيرها .

OOAD15.PNG

يكفي هكذا ولنرى أنواع العلاقات بين الكلاسات بشكل مبسط ونأخذ مثالين عمليين على نوعين من العلاقات .. بشكل عام العلاقات بين الكلاسات هي اعتماديه Dependency ، وارتباط association ، ووراثه Generalization .

الاعتماديه تشير الى أن الكائن من كلاس يعتمد في عمله على كائن أخر ، مثلا لدينا كائن X يستقبل كائن أخر Y كمعامل في أحد الدوال ، وفي هذه الداله نقوم باستدعاء داله في Y من خلال الكائن Y . هنا أصبح الكلاس X يعتمد في عمله على الكائن Y ، ففي حال تغيرت الداله في الكائن Y (سواء اسمها أو معاملاتها) يجب اجراء التعديل في الكائن X . وبشكل عام يفضل تقليل الاعتماديه الى أقل ما يمكن في البرنامج . وتوصف الاعتماديه من خلال سهم متقطع ، بهذا الشكل :

OOAD16.PNG

النوع الأخر من العلاقات وهو ال Association وهو يوضح علاقه احتواء كائن لكائن أخر (Composition , Aggregation) ، أو يوضح الدور الذي يمكن يلعبه الكائن مع الأخر Plain Association . ويمكن توضيح العلاقه من خلال سهم عادي ، ومن ثم نقوم بكتابه اسم العلاقه ، المثال التالي يوضح أن الشخص يستطيع أن يقترض من البنك ..

OOAD18.PNG

ويمكن أيضا أن توضح الدور الذي يلعبه كل كائن في العلاقه ، المثال التالي يوضح أن borrower هو الذي يلعب دور الشخص وأن Lender هو الذي يلعب دور البنك :

OOAD19.PNG

يمكن أيضا توضيح عدد الكائنات التي تلعب الدور المعين وذلك من خلال الMultiplicity ، الشكل التالي يوضح أن البنك يتعامل مع شخص واحد أو أكثر ، بينما الشخص يستطيع التعامل مع 0 أو أكثر من بالبنوك ..

OOAD20.PNG

كما ذكرنا يمكن أن تصف هذه العلاقه عما اذا كان الكائن يحتوي على كائن أخر Has-A ، وهناك نوعين منهم وهم الComposition و Aggregation وسبق أن ذكرناهم هنا في هذا الموضوع.

أخيرا النوع الثالث من العلاقات وهو الوراثه generalization وبالتأكيد الجميع يعرف هذا المفهوم ، ويكون شكل المخطط كالتالي :

OOAD17.PNG

نبدأ الأن بأخذ مثال على علاقه الأحتواء Has-a (مثال Bank Account) وسوف نستخدم سي++ للتوضيح هنا .. ومن ثم نأخذ مثال أخر لتوضيح علاقه الIs-a (مثال Company Employee) وسوف نستخدم جافا لكي يتابعوا معنا مبرمجي جافا .

سنقوم بحل هذه المشكلتين بشكل مبسط ولن نتطرق لموضوع المنهجيه أو حتى رسم المخططات بالكامل .. هذا الحديث في المقاله القادمه ان شاء الله ..

مثال على برنامج Bank Account

=--=-=-=-=-=-=-=-=-=-=-=-=

نأخذ مثال على الأن على برنامج بسيط لبنك يقوم بانشاء حساب للزبائن ويستطيع الزبون بايداع أو سحب النقود من حسابه كما يمكنه الاطلاع على حسابه ومعرفه كم يوجد به من نقود .. أيضا يستطيع عامل البنك من معرفه مجموع النقود في جميع الحسابات ..

يمكنك أن تجلب ورقه وقلم وتقوم برسم المخططات بشكل يدوي أو استخدام برنامج لهذا الأمر ، وحاليا بما أنك ترسم هذه المخططات لأول مره يفضل ورقه وقلم .. وتبدأ عمليه عصر الدماغ brainstorming .

بعد تحديدك لمشكله البرنامج أو الMission Statement ، يجب أن تبدأ في تحديد المهمات الأساسيه في البرنامج من خلال المشكله أعلاه ..وبالطبع هذه العمليه ربما تصعب عليك من البدايه ولكن مع حل العديد من المشاكل تزداد خبرتك وتستطيع تحديد المهمات بكل سهوله ..

حاليا المهمات ( الUse-case ) في البرنامج المطلوب وهي :

* انشاء حساب جديد

* القيام بعمليه ايداع في الحساب

* القيام بعمليه سحب من الحساب

* معرفه الرصيد الحالى للزبون

* معرفه مجموع النقود في جميع الحسابات .

واللاعب الذي يلعب الدور (يقوم بالمهمه) في كل من هذه الUse-Case هو العامل في البنك . حيث هو الذي يقوم بانشاء الحساب وهو الذي يقوم باخراج الرصيد الحالى للزبون وهكذا لبقيه العمليات .

يمكنك الأن أن تقوم برسم مخططات الUase-Case فهي توضح لك متطلبات البرنامج والمهام التي يجب القيام بها بشكل رسومي سهل ، وأيضا توضح من الذي يفترض أن يقوم بذلك الدور . الشكل التالي يوضح use-case diagram

UML1.jpg

بعدها نقوم بعمل توضيح Realization لكل من هذه الUase-Case وذلك باستخدام مخططات الActivity Diagram و Seqeunce Diagram و Collaboration Diagram .(كل منهجيه تستخدم نوع معين من المخططات أثناء مرحله التحليل والتصميم) حاليا نحن نعمل بدون منهجيه معينه لغرض توضيح كيفيه استخدام هذه المخططات بشكل عام .

نقوم الأن باستخدام مخطط Activity لتوضيح أي من الUse-Case التي استخرجناها سابقا .. ومخطط النشاط هذا يوضح لي النشاطات التي ستجرى على الuse-case المحدد .. وهنا سنجد أننا لكي نقوم بعمل حساب جديد يجب أن نقوم بفتح الحساب (ويكون موافي للشروط) ومن ثم نقوم بتسجيل هذا الحساب في البنك .

UML3.jpg

يمكنك الأن بشكل مبدئي ان تقوم برسم الكلاسات التي سوف تستخدمها في برنامجك ، حاليا من خلال المهام يتضح لدينا أن هناك Bank وهناك Account و هناك Employee (فقط عليك برسمهم من غير الدخول في التفاصيل ، سنقوم برسمهم في الخطوه التاليه ) . بعدها لكي يتم توضيح خطوات اي use-case بترتيبها الزمني سنستخدم ال Seqeunce Diagram بالشكل التالي :

UML2.jpg

وهكذا سنقوم بتطبيق المخططات Activity و sequence و collaboration على جميع الuse-case لكي نوضح طريقه عمل كل منهم ..

الأن من خلال هذه المخططات يتضح أن لدينا الكلاسات التاليه Account و Bank و Employer .. ولكن الأخير Employer لن نحتاجه في البرنامج حيث هو ليس من ضمن المشكله التي نريد حلها ، هو فقط سيكون المسبب أو المستخدم لكل من المهمات في النظام . وبالتالى ينتج لدينا الكلاسين التالين Account,Bank . (عمليه استخلاص الكلاسات من أصعب المهمات على الاطلاق والخبره هي الفيصل دائما في مشاكل استخلاص الكلاسات) .

ومن خلال المشكله نفسها ، يمكن أن نعرف أن الAccount يحتوي على رصيد ورقم للعميل بالاضافه الى اسمه .. اما الbank فهو الذي سيجري جميع هذه المهمات على الaccount . هكذا نكون قد عرفنا الخصائص والعمليات على هذين الكلاسين .. اما العلاقه التي ستربط الكلاسين ببعضهم هي Composition أي أن الBank سوف يحتوي على صفر أو أكثر من الaccounts . الصوره التاليه توضح مخطط الكلاس الذي يوضح العلاقه بالاضافه لمحتويات كل من الكلاسين ..

UML4.jpg

الى هنا قمنا بتحليل المشكله وتصميم الكلاسات ، بقي أن نبدأ بعمليه البرمجه . وسوف نقوم بكتابه النظام بسي++ بشكل مبسط .. لاحظ الداله الرئيسيه main حيث قمنا باختبار كل واحد من هذه الuse-case وعدى الأختبار بنجاح بالتالي يمكنك الأن بناء التطبيق النهائي سواء باستخدام واجهه GUI أو قائمه من الخيارات في console .

// Example of Bank Account Application

#include <iostream>
#include <vector>
using namespace std;

class Account;	 	// decleration for class 
typedef  vector<Account> :: iterator ITR;

class Account {
	public :
		Account (int id, string str, double amount) :
			idNumber(id),name(str),balance(amount) { }

		// Accessores function (setter & getter) 
		void setName (const string str)	  { name = str; }

		string getName	 () const { return name; 	 }
		int	getIdNumber () const { return idNumber;	 }
		double getBalance  () const { return balance; 	 }

		void addBalance (double amount ) { balance += amount; }
		void subBalance (double amount ) { if ( balance >= amount) balance -= amount; }

		friend ostream& operator << (ostream& ostr , const Account& rhs);

	private :
		string name;
		int idNumber;
		double balance;
};

ostream& operator << (ostream& ostr , const Account& rhs) {
	ostr << "Account Number : " << rhs.getIdNumber() << endl
		 << "Account Name   : " << rhs.getName()	 << endl
		 << "Account Balance: " << rhs.getBalance()  << endl;

	return ostr;
}

class Bank {
	public :
		Bank(string str) : name(str) { }

		void openNewAccount (int idNumber , string name, double balance);
		void creditAccount  (int idNumber , double balance );
		void depositAccount (int idNumber , double balance );
		double getBalance   (int idNumber );

		double getTotalBalance ();
		string getName () const  { return name; }

		friend ostream& operator << (ostream& ostr, const Bank& bank);

	private :
			// prevent pass by value & assignment operator
			Bank (const Bank& lhs);
			Bank operator = (const Bank& lhs);

	private :
		vector<Account> accounts;
		ITR itr;

		string name;
};

void Bank :: openNewAccount (int idNumber , string name , double balance ) {
	Account tmp(idNumber,name,balance);
	accounts.push_back(tmp);
}

void Bank :: creditAccount (int idNumber ,double balance ) {
	for (  itr = accounts.begin(); itr != accounts.end(); ++itr) {
		if ( itr->getIdNumber() == idNumber ) {
			itr->addBalance(balance);
			break;
		}
	}
}

void Bank :: depositAccount (int idNumber ,double balance ) {
	for (  itr = accounts.begin(); itr != accounts.end(); ++itr) {
		if ( itr->getIdNumber() == idNumber ) {
			itr->subBalance(balance);
			break;
		}
	}
} 

double Bank :: getBalance (int idNumber  ) {
	for (  itr = accounts.begin(); itr != accounts.end(); ++itr) {
		if ( itr->getIdNumber() == idNumber ) {
			return itr->getBalance();
		}
	}
}

ostream& operator << (ostream& ostr , const Bank& bank ) {
	ostr << "Welcome To : " << bank.getName() << endl;
	ostr << "-----------------------------"   << endl << endl;

	for (vector<Account> :: const_iterator itr = bank.accounts.begin(); itr != bank.accounts.end(); ++itr) {
		ostr << *itr << endl << endl;
	}

	return ostr;
}

double Bank :: getTotalBalance ()  {
	double sum = 0;
	for (itr = accounts.begin(); itr != accounts.end(); ++itr) {
		sum += itr->getBalance();
	}

	return sum;
}

int main (int argc, char* argv[]) {
	Bank bank("ArabTeam2000");

	// open new account use case test
	bank.openNewAccount(1,"Wajdy essam",2000);
	bank.openNewAccount(32,"Ali Ahmed",425);
	bank.openNewAccount(42,"Omer Khalid",6000);

	// credit account use case test
	bank.creditAccount(1,100);

	// deposit account uses case test
	bank.depositAccount(42,1000);

	// display all accounts use case test
	cout << bank << endl;

	// get balance use case test
	cout << "Balance for customer ID (42) : " << bank.getBalance(42) << endl;

	// get All balance use case test
	cout << "Total Bank balance : " << bank.getTotalBalance() << endl;

	return (0);
}

مثال على برنامج Company Employer

=-=-=-=-=-=-=-=-=-==-=-=-=-=-=

سنستعرض الأن مثال على النوع الأخر من العلاقات وهو الوراثه Specialization ولن نهتم الأن سوى بمخطط الكلاسات فقط .. حيث أن المشكله قريبه من المشكله السابقه ..

ليكن لدينا شركه برمجيه تحتوي على العديد من المبرمجين .. المطلوب كتابه تطبيق يخرج لي معلومات حول معلومات المبرمج (المعرف ، الراتب ، لغه البرمجه التي يستخدمها) . مع العلم أنه يمكن للمبرمج أن يغير لغته البرمجيه .

من خلال المشكله السابقه قد نستنتج نوع العلاقه وهي أن الشركه تحتوي على العديد من المبرمجين ، أي العلاقه هنا احتواء has-a وتكون في مثالنا هنا Aggregation . الشكل التالي يوضح مخطط الكلاس لهذه المشكله :

[img ]http://www.sudancs.com/wajdy/OOAD8.PNG[/img ]

الأن سوف نبدأ مباشره بعمليه البرمجه ، ويمكن أن يكون شكل الكلاس Programmer بهذا الشكل :

public class Programmer {
	private String name;
	private double salary;
	private int idNumber; 
	private String language

	public Programmer (int id , String name , double salary,Sting lang) {
		this.name = name;
		this.idNumber = id;
		this.salary = salary;
		this.language = lang;
	}

	public int getId () {
		return idNumber;
	}

	public String getName () {
		return name;
	}

	public double getSalary () {
		return salary;
	}

	public String getLanguage () {
		return language;
	}

	public void setLanguage (String lang) {
		language = lang
	}

	public String toString() {
		return  idNumber + " : " + name + " , Language : " + language + " take " + salary + " $";
	}
}

بعد انتهائك من كتابه الكلاس ، قد سمعت بأن هناك أحتمال دخول موظفين أخرين لهذه الشركه مثلا مدير أو موظف عادي ، لذلك في مثل هذه الحالات يمكن أن تلجأ لأسلوب الوراثه من كلاس .. وبما أن المبرمج أو المدير هو في النهايه موظف في الشركه ، فسوف نقوم بعمل كلاس Empolyer ونرث منه ما نريد وقت الحاجه ونضيف الأمور التي تميز المبرمج عن الموظف العادي (وهي في حالتنا هنا لغه البرمجه المستخدمه) . وبالتالى يكون شكل المخطط هو :

[img ]http://www.sudancs.com/wajdy/OOAD9.PNG[/img ]

نقوم الأن باجراء التعديلات التاليه للكلاس السابق :

public class Employee {
	private String name;
	private double salary;
	private int idNumber; 

	public Employee (int id , String name , double salary) {
		this.name = name;
		this.idNumber = id;
		this.salary = salary;
	}

	public int getId () {
		return idNumber;
	}

	public String getName () {
		return name;
	}

	public double getSalary () {
		return salary;
	}

	public String toString() {
		return  idNumber + " : " + name + " take " + salary + " $";
	}
}


public class Programmer extends Employee {
	private String language;

	public Programmer (int id , String name ,double salary , String language) {
		super(id,name,salary);
		this.language = language;
	}

	public String getLanguage () {
		return language;
	}

	public String toString () {
		return super.toString() + "  ,language : " + language;

	}
}

الى الأن لم نكمل في البرنامج للأخير وتبقى الكلاس Software House .. وقبل أن نبدأ به حصل تغيير في المتطلبات مره أخرى ، وهذه المره ذكر العميل أن مبرمج جافا يمنح 20% زياده لراتبه .. أيضا أي مجموعه من المبرمجين يجب أن يداروا من قبل مدير للمشروع Project Leader ، هذا المدير لديه راتب شهري اضافه الى أنه يحصل على 10% زياده على كل مبرمج في فريقه .

التغيير الأول بسيط ، حيث كل ما علينا اعاده تعريف داله الراتب في الكلاس Programmer ونضيف التغيير الجديد ،، أما بالنسبه للمدير فهذا يتطلب وجود كلاس جديد في النظام .. وبما أن أي مدير يدير مجموعه من المبرمجين فإن يمكن أن تكون العلاقه أحتواء أيضا has-a . بالاضافه الى أن الشركه أصبحت تحتوي أيضا على مجموعه من المديرين (بالاضافه الى المبرمجين ) . الصوره التاليه توضح مخطط الكلاس :

OOAD10.PNG

بما أن الكلاس Software House يحتوي على Container من الكائنات تمثل المبرمجين وأخرى تمثل المديرين . فاننا اذا أردنا أن نطبع جميع محتويات هذه الشركه قد نحتاج لأن نمر على جميع عناصر الContainer الأول ونقوم بطباعتها وهكذا بالنسبه للContainer الثاني .

بالرغم من أن التصميم السابق صحيح لكنه يحتوي على تكرار في الكود ، ويمكن أن نحسنه قليلا عن طريق استخدام مفهوم تعدد الأشكال Polymorphism ، حيث سنجعل المدير والمبرمج من نوع empolyee وفي داله الطباعه سنقوم بطباعه الكائن الحالى الموجود في الcontainer والذي سيطبع الكائن المناسب .

نقوم بتعديل التصميم قليلا ، ويخرج لدينا المخطط التالي :

[img ]http://www.sudancs.com/wajdy/OOAD11.PNG[/img ]

نقوم الأن بالبدء في البرمجه :

// Employee.java

public abstract class Employee {
	private String name;
	private double salary;
	private int idNumber; 

	public Employee (int id , String name , double salary) {
		this.name = name;
		this.idNumber = id;
		this.salary = salary;
	}

	public int getId () {
		return idNumber;
	}

	public String getName () {
		return name;
	}

	public double getSalary () {
		return salary;
	}

	public String toString() {
		return  idNumber + " : " + name + " take " + salary + " $";
	}
}


public class Programmer {
	private String name;
	private double salary;
	private int idNumber; 
	private String language

	public Employee (int id , String name , double salary,Sting lang) {
		this.name = name;
		this.idNumber = id;
		this.salary = salary;
		this.language = lang;
	}

	public int getId () {
		return idNumber;
	}

	public String getName () {
		return name;
	}

	public double getSalary () {
		return salary;
	}

	public String getLanguage () {
		return language;
	}

	public void setLanguage (String lang) {
		language = lang
	}

	public String toString() {
		return  idNumber + " : " + name + " , Language : " + language + " take " + salary + " $";
	}
}

// Programmer.java
public class Programmer extends Employee {
	private String language;

	public Programmer (int id , String name ,double salary , String language) {
		super(id,name,salary);
		this.language = language;
	}

	public String getLanguage () {
		return language;
	}

	public String toString () {
		return super.toString() + "  ,language : " + language;

	}

	public double getSalary () {
		double value = super.getSalary();

		if ( language.equals("java") )
			value *= 0.2;

		return value;
	}
}

// ProjectLeader.java
import java.util.Iterator;
import java.util.ArrayList;

public class ProjectLeader extends Programmer {
	private ArrayList<Employee> team;

	public ProjectLeader (int id ,String name , double salary,String language) {
		super(id,name,salary,language);
		team = new ArrayList<Employee>();
	}

	public void addMember (Employee p) {
		team.add(p);
	}

	public String toString () {
		String str = super.toString();
		str += "\nMember Information : \n";

		Iterator itr = team.iterator();

		while ( itr.hasNext() ) {
			Employee tmp = (Employee) itr.next();
			str += tmp.toString() + "\n";
		}

		return str;
	}

	public double getSalary () {
		double value = super.getSalary();
		int size = team.size();
		double tmp = value * size * 0.1;
		return value + tmp;
	}

}

// SoftwareHouse.java

import java.util.ArrayList;
import java.util.Iterator;

public class SoftwareHouse {
	private ArrayList<Employee> staff;
	private String name;

	public SoftwareHouse (String name) {
		this.name = name;
		staff = new ArrayList<Employee>();
	}

	public void addMember (Employee p) {
		staff.add(p);
	}

	public String toString () {
		String str = "Staff : " + name + "\n";
		Iterator itr = staff.iterator();

		while ( itr.hasNext() ){
			Employee tmp = (Employee) itr.next();
			str += tmp.toString() + "\n";
		}

		return str;
	}

	public double getTotalSalary () {
		double sum = 0;
		Iterator itr = staff.iterator();
		while ( itr.hasNext() ) {
			Employee tmp = (Employee) itr.next();
			sum += tmp.getSalary();
		}

		return sum;
	}
}

ملف الأختبار :

public class Main {
	public static void main (String args[]) {
		SoftwareHouse app = new SoftwareHouse("SudanCS");

		Programmer p1 = new Programmer(1,"Wajdy",4000,"java");
		Programmer p2 = new Programmer(2,"Geek",5000,"Assembly");
		Programmer p3 = new Programmer(3,"Ahmed",3200,"C++");
		Programmer p4 = new Programmer(4,"romansy",3000,"Php");

		ProjectLeader pld  = new ProjectLeader(10,"Mohammed",9000,"C++");
		ProjectLeader pld2 = new ProjectLeader(20,"Ossma",5000,"pascal");

		pld.addMember(p1);
		pld.addMember(p4);
		pld2.addMember(p3);

		app.addMember(p1);
		app.addMember(p2);
		app.addMember(p3);
		app.addMember(p4);
		app.addMember(pld);
		app.addMember(pld2);

		System.out.println(app);
		System.out.println("total salary : " + app.getTotalSalary());
	}
}

الأمثله أعلاه مثالين صغيرين جدا ، وبالتالى من خلال الخبره يمكن لأي مبرمج البدء والشروع في هكذا مشروع من غير الحاجه للمخططات .. المخططات تستخدم في حال كنت تريد فهم المشكله لأنها متداخله وكبيره ، كنت تريد أن يفهم المبرمجين والمستخدمين طريقتك في الحل ، كنت تصمم البرنامج لكي يبرمجه غيرك ، كنت تعمل في مشروع كبير وبالتالى يجب عليك تطوير البرنامج بشكل متصاعد increment-iterative فبالتأكيد سوف تحتاج الى مخططات بعد الأنتهاء من دوره تطوير واحده one iteration.

المره القادمه باذنه تعالى نتناول مشكله معينه ونقوم بحلها ونستخدم المنهجيه الخفيفه التي سبق أن عرضناها سابقا ، بالاضافه الى عرض مفاهيم SOLIDفي التطوير ..

نقطه النهايه :

=-=-=-=-=-=-=

المبرمج المحترف لا يقتصر عمله في الCoding ، المبرمج المحترف يجيد موضوع الDesign بشكل كبير ، المبرمج المحترف يجيد تطبيق الاختبارات على الوحدات التي يكتبها Testing ، المبرمج المحترف يجيد تتبع البرامج وايجاد الأخطاء بها Debugging ، المبرمج المحترف يعرف مستوى أداء برنامجه Performance Analysis ويستطيع ايجاد نقطه الخلل والبطء فيه Performance Bottleneck كما يستطيع تحسين الكود Optimization بالاضافه الى كتابه برامج ذات كفائه عاليه Efficient code .

عالم البرمجه الموجهه كبير للغايه ، عليك أن تستفيد وتتعلم من أفكار غيرك ، عليك أن تعرف أهم المشاكل التي تحصل في مرحله التصميم وكيف يمكن تجنبها Design Pattern ، عليك أن لا تخترع العجله من جديد وأن تقوم باعاده استخدام الكود وخاصه الCollections التي تقدمها لغه البرمجه -ان كانت تقدم لك ذلك- .

موضوع التحليل والتصميم الكائني موضوع متقدم لذلك حاول أن تتعلم بالتدريج ، تعلم منهجيه معينه وكيف يمكن أن تستخدم UML بها ، ثم انتقل لغيرها بعد مده ، وبالتالى تزداد خبرتك في حل المشاكل وتطوير الحلول الكائنيه التوجه .

مصادر الموضوع :

=-=-=-=-=-=-=

Object-Oriented Design with UML and Java

Object-Oriented Analysis and Design - Understanding System Development with UML 2.0

Sams Teach Yourself Object Oriented Programming in 21 Days

Professional C++

اي تصحيح ، اضافه ، تعليق ، سؤال -بسيط فقط :)- يرحب به ..

والسلام عليكم ورحمه الله وبركاته ،

لا يمكن أن أضيف جميع الصوره بالموضوع ؟

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 29 يوليو 2009 في 21:20 — السبب: شكرا للأخ الشمري على التصحيح

16

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#2

جزاك الله خيرا وجعله ميزان حسناتك

هذا نتيجة البرنامج :

Staff : SudanCS
1 : Wajdy take 4000.0 $  ,language : java
2 : Geek take 5000.0 $  ,language : Assembly
3 : Ahmed take 3200.0 $  ,language : C++
4 : romansy take 3000.0 $  ,language : Php
10 : Mohammed take 9000.0 $  ,language : C++
Member Information : 
2 : Geek take 5000.0 $  ,language : Assembly
1 : Wajdy take 4000.0 $  ,language : java
4 : romansy take 3000.0 $  ,language : Php

20 : Ossma take 5000.0 $  ,language : pascal
Member Information : 
3 : Ahmed take 3200.0 $  ,language : C++


total salary : 29200.0

هذا كود الطباعة بس انا حاب اعرف كيف تظهر النتيجة بهذا الشكل ومن المعرف class Employee لا يحتوي على attribute language كيف قام بطباعة (انا اعرف السؤال مبتدء بس تحملني ) نحن عملنا pass عن طريق method :

 app.addMember(p1);

هذه ال method تستقبل class Employee

public String toString () {
		String str = "Staff : " + name + "\n";
		Iterator itr = staff.iterator();

		while ( itr.hasNext() ){
			Employee tmp = (Employee) itr.next();
			str += tmp.toString() + "\n";
		}

		return str;
	}

وشكرا

#3

وعليكــم السـلام ورحمة الله وبركاتـه..

حياك الله ،،

أولا الكلاس Employee هو كلاس Abstract ، بمعنى أنك لا تستطيع عمل كائن منه .. فقط تستطيع أن ترث منه Inheritance . راجع الصوره التاليه (لم تتضح في المثال السابق ) :

OOAD11.PNG

هناك مفهوم في البرمجه الموجهه وهو تعدد الأشكال Polymorphisms وهي تعني أنه توجد هناك داله واحده بنفس الأسم في الكلاس الأب والكلاسات الأبناء وفي كل من هذه الكلاسات الأبناء لها عمل مختلف عن الأخر ، الأن عن طريق مؤشر للكلاس الأب قمت فيه بوضع قيمه أحد الكائنات الأبناء وقمت أستدعيت تلك الداله الموجوده في الكلاس الأب سوف يتم استدعاء الداله الموجوده في الأبن ..

نوضح أكثر في مثالنا السابق ، لدينا الكلاس الأب Employee وهو كلاس Abstract ويحتوي على داله toString تطبع معلومات الموظف العادي ، وقام Programmer بوراثه هذا الكلاس واعاد تعريف override الداله toString . وبنفس الأمر قام Leader بالوراثه من Programmer واعاد تعريف toString . وفي الداله main قمنا

الأن من خلال :

public String toString () {
		String str = "Staff : " + name + "\n";
		Iterator itr = staff.iterator();

		while ( itr.hasNext() ){
			Employee tmp = (Employee) itr.next();
			str += tmp.toString() + "\n";
		}

		return str;
	}

ستجد أننا نحصل على المؤشر الموجود في ArrayList باستخدام itr.next ونحوله cast لكي نسنده للمؤشر tmp ،، وعند استدعاء الداله toString في المؤشر tmp سوف يقوم بطباعه الداله toString الموجوده في الكائن الذي يؤشر له المؤشر itr.next .. وعلى حسب نوع ذلك الكائن يتم استدعاء الداله المناسبه فاذا كان Programmer فيتم طباعه toString الخاصه به ، واذا كان Leader فيتم طباعه toString الخاصه به ..

فقط هذا كل ما في موضوع تعدد الأشكال :) ...

بالطبع من أهم مزاياه سهوله الاضافه extendiblity ، لنفرض مثلا أنه حصل تغيير بسيط في المتطلبات وأرنا أن ندخل نوع جديد من الموظفين وهو المشرف Administator . كل ما علينا هو كتابه ذلك الكلاس وتعديل بسيط في الداله main ولن نقوم بتغيير اي سطر في داله الطباعه الخاصه بالSoftwareHouse .

كما بالصوره :

OOAD21.PNG

// Administrator.java

public class Administrator extends Employee {
	private String department;

	public Administrator (int id, String name , double salary , String dep) {
		super(id,name,salary);
		department = dep;
	}

	public void setDepartment (String dep ) {
		department = dep;
	}

	public String getDepartment () {
		return department ;
	}

	public String toString () {
		return super.toString() + "  ,Department : " + department;
	}
}

فقط كل ما عليك أن تعمل كائن من هذا الكلاس في main وتدخله في الsoftware house ..وهكذا ستجد البرنامج قابل للأمتداد والتطوير باقل تغيير يمكن ..

بالتوفيق :) .

4

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4

سلام عليكم ورحمة الله وبركاته

اخي wajdy لا استطيع ان اقول الا ربنا يوفقك

وشكرا...........................

1
#5

السلام عليكم

بارك الله بك اخي وجدي على هذا المجهود العظيم

وزادني واياك من علمه

......

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#6

موضوع رائع يستحق أن يذهب للمفضلة مباشرة

بارك الله فيك ووفقك لما تصبوا اليه

#7

بارك الله فيك موضوع جيد

لكن لما لم يثبت الموضوع ؟

#8

موضوع في غاية الروعة

واظن ان هذا ما تبحث عنه اخي عبد العالي

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا

#9

أخي وجدي , بارك الله فيك و في علمك .

الموضوع مهم جدا .. ولدي أسئلة كثيرة سألتها سابقاً بعض الدكاترة لكن دون اجابة مقنعة :

1- هل نستخدم مثل هذه المنهجية و UML الذي يصفها مع جميع الأنواع مع البرامج ؟

سنستفيد مما سبق في أنظمة معيّنة مثل نظام بنكي - ادارة مكتبة - نظام محاسبي .. الخ .

لكن كيف يمكن تطبيق ماسبق على برنامج مثل Word أو Photoshop ؟

هل يمكن تطبيق ماسبق على برنامج مستعرض صور بسيط ؟

أم أن أسلوب التحليل هذا مناسب فقط لأنظمة معينة ؟

2- عندما أختار أحد Use Case وأعمل لها Sequence Diagram , ماذا سأستفيد ؟ ماذا سينتج ؟ هل الرسائل المرسلة هي عبارة عن Method مثلاً ؟ أم أن الهدف هو فقط استخلاص الفئات Classes ؟ هل يجب أن أعرض جميع الرسائل في Sequence Giagram أم أكتفي بالمهمّة فقط ؟

3- هل الرسائل في Sequence Diagram عبارة عن Method لكلاس معين , أم أننا أصلاً لم نعرف الـ Class حتى الان حتى نعرف ماهي Methodالخاصة به ؟

3- Collaboration Diagram معقّد قليلاً , هل يمكن الاستغناء عنه , واستبداله فقط بالـ Sequence Diagram ؟

4- درست عن مفهومThree-Tiers وهو يتكون من GUI - Problem Damion - Data Access Or DataBase >

عندما نحلل نظام يطبق هذا المفهوم , فاننا لانقوم بتحليل وتصميم الا Problem Domain , هذا صحيح .. أليس كذلك ؟

5- عندما أكون عضو في مشروع وقررت أن استخدم أحد طرق Design Patterns , هل سيتأثر الـ Class Diagram للمشروع ؟

أعني هل يجب أن أعيد تصميم العلاقات بناء على Design Pattern المستخدم , أم أن Class Diagram فقط يوضح العلاقات بين الكلاسات المهمة , وبالتالي لانهتم بالتفاصيل التي يجب أن تظهر وقت البرمجة؟

هل ستتأثر Sequence Diagram و Collaboration Diagram باستخدام بعض طرق Design Pattern ام لا ؟

6-أخيراً , درسنا في بعض المقررات مثل Data Structure شيء اسمه ADT , بحيث نكتب مواصفات كل كلاس Specification , أين تقع هذه المرحلة , في التصميم , في التحليل أو أثناء البرمجة ؟ هل ADT تعتبر شيء مستقل ومختلف عن الموضوع الذي تتحدث عنه الان .

أعرف أن الاسئلة كثيرة , لكن لاتتصوّر مدى السعادة لو حصلت على اجابة عليها - أو على بعضها .

تم تعديل هذه المشاركة بواسطة الشمري في 1 أغسطس 2009 في 01:50

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10
اقتباس
لكن كيف يمكن تطبيق ماسبق على برنامج مثل Word أو Photoshop ؟

هل يمكن تطبيق ماسبق على برنامج مستعرض صور بسيط ؟

أم أن أسلوب التحليل هذا مناسب فقط لأنظمة معينة ؟

مثال بسيط الا و هو قوائم برنامج الوورد Microsoft Word كل عنصر من عناصر القائمة يتم تطبيقه باستخدام ال Command Pattern

مستعرض الصور ايضاًَ له العديد من الافكار باستخدام ال Patterns

اقتباس
- Collaboration Diagram معقّد قليلاً , هل يمكن الاستغناء عنه , واستبداله فقط بالـ Sequence Diagram ؟

لا يمكن الاستغناء عن ال Collaboration Diagrams بل من وجهة نظرى انه اهم ال Diagrams التى توضح العلاقات بين ال Objects

اقتباس
- عندما أكون عضو في مشروع وقررت أن استخدم أحد طرق Design Patterns , هل سيتأثر الـ Class Diagram للمشروع ؟

قرار استخدام ال DP يرجع لل Designer و ليس للمبرمج و طبيعى انه بعض الكلاسات ستتأثر عند استخدام ال Patterns لانك ممكن تقوم بعمل Interface Implementation او تقوم بالوراثة من فئة ام و بالتالى فستتغير الكلاس التى تعمل عليها

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 31 يوليو 2009 في 23:39

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#11

جزاك الله خير , لكن بالنسبة للنقطة الاولى ,

اقتباس
لكن كيف يمكن تطبيق ماسبق على برنامج مثل Word أو Photoshop ؟

هل يمكن تطبيق ماسبق على برنامج مستعرض صور بسيط ؟

أم أن أسلوب التحليل هذا مناسب فقط لأنظمة معينة ؟

لا أقصد DP المستخدمة .. لكن هل يتم تطبيق هذه الـ Diagrams التي ذكرها الاخ وجدي على كامل البرنامج .. مثل الفوتوشوب .. الذي يحوي على الالاف العناصر داخل الـ use cases ؟! .. وستقوم بعمل Sequence Diagrams لها .. الخ .. أم أنها تستخدم فقط في الأنظمة .. مثل نظام بنكي ..

ولانسوا باقي الأسئلة :-) ..

تم تعديل هذه المشاركة بواسطة الشمري في 3 أغسطس 2009 في 01:16

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#12

بعد فتره طويلة :) .

اقتباس
1- هل نستخدم مثل هذه المنهجية و UML الذي يصفها مع جميع الأنواع مع البرامج ؟

سنستفيد مما سبق في أنظمة معيّنة مثل نظام بنكي - ادارة مكتبة - نظام محاسبي .. الخ .

لكن كيف يمكن تطبيق ماسبق على برنامج مثل Word أو Photoshop ؟

هل يمكن تطبيق ماسبق على برنامج مستعرض صور بسيط ؟

أم أن أسلوب التحليل هذا مناسب فقط لأنظمة معينة ؟

الغرض الأساس من الUML هي أن تكون وسيلة لتخاطب المشتركين في تطوير النظام (محللين ومطورين ومختبرين) أي Idea Communication ، فاذا كان هناك أكثر من Stakholder فيجب أن تتم عملية طرح الأفكار بوسيلة موحدة وسهله للجميع ، ومن هنا كانت UML ،،

اقتباس
2- عندما أختار أحد Use Case وأعمل لها Sequence Diagram , ماذا سأستفيد ؟ ماذا سينتج ؟ هل الرسائل المرسلة هي عبارة عن Method مثلاً ؟ أم أن الهدف هو فقط استخلاص الفئات Classes ؟ هل يجب أن أعرض جميع الرسائل في Sequence Giagram أم أكتفي بالمهمّة فقط ؟

3- هل الرسائل في Sequence Diagram عبارة عن Method لكلاس معين , أم أننا أصلاً لم نعرف الـ Class حتى الان حتى نعرف ماهي Methodالخاصة به ؟

3- Collaboration Diagram معقّد قليلاً , هل يمكن الاستغناء عنه , واستبداله فقط بالـ Sequence Diagram ؟

الأسئلة تدور حول محور واحد ،، وخلاصه الأمر يمكن أن تتجاهل أي Diagram اذا لم تجده يوضح ما تريد بصورة أوضح ،،

اقتباس
4- درست عن مفهومThree-Tiers وهو يتكون من GUI - Problem Damion - Data Access Or DataBase >

عندما نحلل نظام يطبق هذا المفهوم , فاننا لانقوم بتحليل وتصميم الا Problem Domain , هذا صحيح .. أليس كذلك ؟

لا ليس فقط للBusiness Domain ، يمكن استخدام الUML لرسم الGUI وتوضيح الDeplyoment وحتى الDB .

اقتباس
5- عندما أكون عضو في مشروع وقررت أن استخدم أحد طرق Design Patterns , هل سيتأثر الـ Class Diagram للمشروع ؟

أعني هل يجب أن أعيد تصميم العلاقات بناء على Design Pattern المستخدم , أم أن Class Diagram فقط يوضح العلاقات بين الكلاسات المهمة , وبالتالي لانهتم بالتفاصيل التي يجب أن تظهر وقت البرمجة؟

هل ستتأثر Sequence Diagram و Collaboration Diagram باستخدام بعض طرق Design Pattern ام لا ؟

كما ذكر أخ طارق ،،اضافة الى ان تصميم الSequence Diagram والcollaboration يحتاج من الأساس خلفية جيده في OO ،، وعندما يتم بنائها بشكل جيد فلن تحتاج للتغير فيها كثيرا وخاصه الSequence diagram ..

اقتباس
6-أخيراً , درسنا في بعض المقررات مثل Data Structure شيء اسمه ADT , بحيث نكتب مواصفات كل كلاس Specification , أين تقع هذه المرحلة , في التصميم , في التحليل أو أثناء البرمجة ؟ هل ADT تعتبر شيء مستقل ومختلف عن الموضوع الذي تتحدث عنه الان .

يمكن أن تقع في مرحله التصميم أو البرمجه ،، مثلا رأينا أن هناك قطعه من الكود نستخدمها دائما في عده كلاسات فيمكن كبسبلتها في كلاس ووراثه هذا الكلاس لمن يريد ،، قد لا يرى ذلك المصمم وقت التصميم ولكن المبرمج بالتأكيد سوف يلاحظ هناك تكرار في الكود ، وهناك قاعده تقول أنه بمجرد وجود تكرار فيجب عمل اعاده تصحيح أو تصميم للكود Refactoring وهكذا أغلب الmodern projects تستخدم اساليب xp وكل دورة في المشروع تكون قصيرة وربما الدورة التالية تعالج قصور في الدورة السابقة وكهذا.. ثانيا الADT هي عباره عن مفاهيم وطريقة عملها قد تختلف على حسب الimplementation ،، ارجع لدرس خالد عن تفاصيل عمل هياكل البيانات في سي++ للمزيد.

كانت هذه اجابات بسيطة نظرا للإجابة المتأخرة ،، وسأكون سعيدا في حال وجدت أسئلة أخرى :) .

بالتوفيق،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 13 ديسمبر 2009 في 15:10

1

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#13

ماشاء الله دائما مواضيعك متميزه اخ وجدي.

بالتوفيق.

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#14

بارك الله فيك يا أخ وجدي وإلى الأمام :thumb_up:

#15

مشكور اخي وجدي واستفدنا منه كثيرا جعل الله ذلك في ميزان حسناتك

وفقك الله :)

تم تعديل هذه المشاركة بواسطة atharitit في 26 فبراير 2010 في 21:21

#16

مشكورين على المجهود

#17

بارك الله على الشرح المفصل

أسأل الله ان يوفقك ويوفقنا جميع لافادت الاخرين

#18

السلام عليكم

أنا مبتدئ في البرمجة لكن لدي خلفية واسعة في قواعد البيانات

هل تنصحوني بقراءة هذا المقال أم مقال آخر؟ علماً بأنني بصدد تعلم لغة VB.NET

و هل تنفع هذه الأمور لبرمجة تطبيقات تتعامل مع قواعد البيانات و تصميم البرامج المحاسبية؟

اسمي الحقيقي هو السيد

رغيد السقا

#19

استاذ وجدي شكراً جزيلاً على هذا الموضوع القيم

عندي بعض الاستفسارات اتمنى ان اجد الاجابه الوافيه منك او من احد الاعضاء

اقتباس

النموذج المتكرر Iterative Methodology كان هو الحل لهذه المشكله ، حيث يمكن في هذا النموذج أن نعود خطوه للوراء ونصلح ذلك الخلل ونكمل السير في هذه الدوره

Posted Image

OOAD3.PNG

حسب مفهومي:

نموذج الشلال waterfall model

قبل التطوير لا يدخل فيه التكرار

لكن المطور مضاف اليه التكرار

هل التعريف الدقيق ل

التكرار ( iterative ) : هو بكل مرحله من مراحل النظام يكون هناك تكرار العمل بالتصميم والتحليل إالى أن نكون سعيدين بالنتيجه ومن ثم ننتقل إالى مرحله أخرى من مراحل النظام وهاكذا ....

اذا لم يكن هو فما هو التعريف الدقيق ...؟!

-----------------------------------------------------------------------------------

OOAD4.PNG

هذا يعتبر :

التزايد ( incremental) : وهو تقسيم العمل الى أجزاء صغيره وكلما انتهينا من جزء إنتقلنا إالى الآخر.

اذا لم يكن هو فما هو مفهوم التزايد ؟!!

لانني بحثت عن هذا الموضوع ... اغلب الكتاب يتكلمون عن التكرار والتزايد المطور iterative and incremental development

الاستفسار الاخير :

هل من الممكن او من معقول أن نحصل على دورة حياة نظام (Life-cycle ) تكون مكرره ( iterative ) ولكن غير تزايديه ( incremental) .

أو العكس تكون تزايديه ( incremental) ولكن ليست مكرره ( iterative ).؟

و لماذا ال RUP-cycle يستخدمها جميعاً .؟

ارجو الافاده بأسرع وقت ممكن لاني محتاج هذي المعلمه جدا

شكرا جزيلاً

#20

لو فرضنا أنك تريد عمل برنامج على الجوال لعرض معلومات الطقس،، وكانت هذه المعلومات الأولية المتوفرة ، من خلال هذه المعلومات يمكنك البدء في البرمجة وهذا ما يميز ال Iterative and incremental development ، حيث يمكنك أولاً في المرحلة الأولى كتابة كلاس يقوم بتحميل ملف معلومات الطقس من أحد الموقع (DB Downloader class).. هنا سوف تقوم بعمل تحليل وتصميم سريع لهذه المهمة حتى تقوم بكتابة كلاس مكبسل جيداً ويقوم بمهمه تحميل الملف من الموقع، بعدها تقوم بعمل testing سريع لهذا الكلاس للتأكد من أنه يعمل جيداً (سواء كلاس أخر (console app) يقوم بعمل اختبار له أو Unit-Testing للكلاس). لنفترض أن الزبون طلب أن تقوم بتحميل ملف المعلومات من موقع أخر سوف تقوم مرة أخرى وأنت ما زلت في هذه المرحلة بتغيير التصميم والكود والاختبار لكي يتناسب مع المطلوب..

عندما تنتهي من هذه المرحلة ، سوف تبدأ في المرحلة الثانية ولتكن عمل parse لهذا الملف وكتابة model classes تمثل الطقس،، سوف تعيد نفس الخطوات التي قمت بها في المرحلة السابقة (تحليل ، تصميم ، كود ، اختبار) وقد تحتاج للرجوع الى تعديل شيء ما اذا تطلب.. وحالياً أنت تضيف مكون جديد للنظام وبالتالي incremental لهذا النظام..

باختصار Iterative and incremental يجب أن يكونوا مع بعضهما البعض، والا ستظل تطور جزء معين في النظام وتترك الأجزاء الأخرى (اذا كنت تستخدم Iterative ققط) أو أنك ستكتب وتضيف بدون تخطيط أو اختبار أو حتى تعديل لمتطلبات العميل (اذا كنت تستخدم incremental فقط).

لماذا RUP يستخدمهم؟ بالطبع لأنها مرنة جداً ويمكنك البدء من خلالها بدون اكتمال كل المتطلبات.. وأيضاً منهجيات ال agile كXP تستخدم هذه الطريقة أيضاً لنفس الأسباب..

بالتوفيق،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#21

بارك الله فيك

بارك الله فيك

#22

السلام عليكم اخي الفاضل.

بالنسبه للموضوع جميل ومفيد ومن التقنيات الجديده في تحليل النظم .

بارك الله فيك .

وجزك الله خيرا.

واتوقع منك المزيد من الابداع ........................

#23

بارك الله فيك يا بشمهندس وجدى ، و ربنا يزيدك من علمه

#24

أخي موضوع صراخة مفيد جدا بارك الله فيك

#25

جزاك الله الف خير أخي وجدي .... وجعل الله مجهودك في ميزان حسناتك

بصراحة موضوع كامل شامل ( و الكمال لله ) تستاهل كل شكر عليه...

مواضيع مشابهة