السلام عليكم ورحمه الله ويركاته ،، مقدمه : =-=-=-= إن موضوع التحليل والتصميم بالكائنات من أهم المواضيع الني ينبغي لأي مبرمج أو مطور يستخدم لغه كائنيه أن يجيده ، حيث على المبرمج أن يقوم بتحليل البرنامج أولا ويعرف ما هي المشكله التي يريد أن يحلها Analysis ومن ثم يبدأ هذا المبرمج بطرح الحلول وكيف يمكن أن تتفاعل هذه الكائنات مع بعضها البعض design ، ومن ثم يقوم بعمليه الCoding ويقوم بتطبيق التصميم الذي طرحه في المرحله السابقه ، وأخيرا يقوم باجراء الTesting للبرنامج والتأكد من مطابقته لمتطلبات الزبون Customer Requirement . العمليات السابقه التي ذكرتها (Analysis,Design,Coding,Testing) تعرف بدوره حياه المشروع Software Development Life Cycle . وبالطبع أي مشروع يجب أن يمر على جميع هذه المراحل بترتيب معين حيث أن عمليه التطوير يجب تكون على منهجيه معينه وباتباع طريقه ما Methodology والا ستعم الفوضي ولن تستطيع حتى كتابه سطر واحد صحيح من البرنامج . باتباع هذه المهجيات سوف تضمن أن عمليه تطويرك للبرنامج تسير في المنحنى الصحيح ، كما أنها توفر لك كل ما تحتاجه من وقت البدء في تحليل المشروع الى وقت التسليم والصيانه للمشروع ، اضافه الى توضيح نوعيه الوثائق والمخططات التي ستنتجها كل مرحله Activities & Artifacts وليس هذا فقط فهناك منهجيات توفر لك نصائح وارشادات في عمليه جدوله المشروع واداره الفريق وما الى ذلك من العمليات الإداريه Management Task . قديما كانت تجري هذه العمليات SDLC بالترتيب وبشكل متنازل وهو ما يعرف بنموذج الشلال Waterfall Model .. حيث يقوم أولا المحلل بتحليل البرنامج بالكامل وكتابه جميع الوثائق المطلوبه ومن ثم يمرر هذه الوثائق للمصمم الذي يقوم بتصميم النظام ووضع حلوله أيضا ، ومن ثم تمر بالمبرمج الذي يقوم بكتابه الكود وعندما ينتهي تجرى الأختبارات على هذا البرنامج وأخيرا يسلم الى الزبون .. ولكن للأسف هذا النموذج لا يصلح بتاتا الا في المشاريع الصغيره والتي لا يوجد فيها خطوره ما (مثلا فريق التطوير قد قام بمشروع مشابه للمشروع الحالى ، حينها يمكن أن يستخدم هذا النموذج) .. مشكله أخرى وهي عدم وجود وثائق موحده تمر علي جميع فريق التطوير فالمحلل لديه اساليب خاصه فيه والمصمم كذلك وكل منهم بحاجه الى مزيد من الوقت لكي يفهم ماذا كان يقصد الشخص الذي كتب هذه الوثائق .. ليس هذا فقط فعند الدخول في المشاريع الكبيره تبدأ المشاكل الأكبر بالظهور، فنموذج الشلال لا يسمح يتغيير المتطلبات ، حيث يجب على المحللين في البدايه أن يقوموا بتحليل النظام بشكل كااامل ومن ثم تبدأ مرحله التصميم وهكذا لجميع المراحل حيث لا عوده للخلف بتاتا .. السؤال هنا ماذا لو تغيرت متطلبات هذا الزبون بعد مرور 3 أشهر من التحليل والتصميم وبالبدء بالكود ، كارثه !! وحتى ولو لم تتغير المتطلبات ففي حال استخدم نموذج الشلال في مشروع كبير فهذا يعني تحليله بالكامل ثم تصميمه بالكامل وبرمجته بالكامل وهذا غير منطقى خصوصا في البرامج الكبيره حيث يجب أن تقسم لأجزاء صغيره يتم العمل على كل منها على حده . الصوره التاليه تشبه عمليه تطوير مشروع ضخم باستخدام نموذج الشلال بعمليه أكل فيل من غير تقسيم : ناهيك عن الوقت المستغرق في كل مرحله ، حيث لأنها يجب أن تكون كامله وشامله يبدأ الخوف لدي المحللين فيأخذوا وقت أكثر من المفترض أن يكون به ويبدأ في ذكر "يبدوا أن هناك شيء ناقص ، سنعيد تحليل هذه النقطه" ، "يجب أن نراجع التحليل مره أخرى ، حيث اذا حدثت مشكله الأن سوف تبقى على اكتافنا" وهكذا يصاب المحلل ب Analysis Paralysis ، بنفس الأمر عند المصمم والمبرمج والشخص الذي يقوم بالأختبار كل منهم يصاب بهذه العقده خاصه ان كان قد فشل في مشروع سابق . مع وجود كل هذه العيوب في هذا النموذج الا أنه يقدم تسلسل منطقى في عمليه تطوير (تحليل ثم تصميم ثم برمجه ثم اختبار) وبالتالي يمكن أن يستفاد من هذه التسلسل في منهجيات أخرى أكثر مرونه في الشلال وهذا ما حصل بالفعل . النموذج الحلزوني Spiral كان من أول المحاولات في تطوير الشلال ، حيث يمكن أن نطور المشروع في أكثر من دوره (بمعنى أكثر من نموذح شلال في اَن واحد) .. وبنفس المراحل الموجوده في الشلال .. وبالتالى كان يمكن لفريق التطوير أن يقوموا بأخذ متطلبات غير كامله ويبدؤا بتحليلها وتصميمها وبرمجتها ، وهكذا تنتهي الدوره الأولى .. وتبدأ الدوره الثانيه وهكذا الى أن ينتهي تطوير المشروع بالكامل .
// 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);}
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 + " $"; }}
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; }}
// Employee.javapublic 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.javapublic 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.javaimport 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.javaimport 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()); }}