軟件開發是一個極其復雜的過程,一段小的代碼我們可以快速、准確的完成,但是當你面對的是一個龐大的軟件系統的時候,你是否有不知所措的感覺呢?
在我們使用C的年代裡面,編程思想是結構化的,你的C語言老師可能會不斷的教導你怎樣使用結構化的方法來完成一段程序,同時,你可能也知道在軟件開發中的一個重要定律(Wirth定律):
程序 = 算法 + 數據結構
在結構化設計中人們通常是這樣來看待這個定律的:
程序 =(算法) + (數據結構)
例如:(我仍然使用C++標准庫來寫下面的代碼,方便和以後的代碼對比)
#include <iostream>
using namespace std ;
typedef struct Student
{
char strname[50]; //姓名
int math; //數學分數
int chinese; //語文
int total; //總分
}STUDENT;
void InitData(STUDENT* some)
{
//////////////////////////////////////
//初始化數據
some->strname[0] = '\0';
some->math = 0;
some->chinese = 0;
some->total = 0;
}
void InputData(STUDENT* some)
{
///////////////////////////////////////
//獲取輸入
cout<<"enter name"<<endl;
cin>>some->strname;
cout<<"enter math"<<endl;
cin>>some->math;
cout<<"enter chinese"<<endl;
cin>>some->chinese;
//////////////////////////////////////
//計算總分
some->total = some->math + some->chinese;
}
void PrintData(STUDENT some)
{
cout<<some.strname<<"''''s total mark is:"<<some.total<<endl;
}
//上面的部分可以單獨放在一個頭和CPP中
main()
{
STUDENT someone;
InitData(&someone);
InputData(&someone);
PrintData(someone);
}
到目前為止,程序的劃分變得相對簡單了,團隊的開發才成為可能。在面向對象中,所存在的Wirth定律與上面的結構非常類似:
對象 = (算法 + 數據結構)
程序 = 對象 + 對象
表面上似乎二者之間並沒有太大的差別,但就是這個差別為我們帶來了巨大的變革。
有這樣一句話:“編程是在計算機中反映世界”,我覺得再貼切不過,面向對象(Object-Oriented)對這種說法的體現也是最優秀的,比如在前面的例子中,我們設計的數據結構是一個學生成績的表現,而對數據結構的操作(函數)是分離的,雖然這些操作是針對這種數據結構而產生的。為了管理大量的數據,我們不得不小心翼翼地使用它們。
面向對象中一個重要的概念就是類(class)C++中是它。類和struct數據結構最大的不同就是提供了限制級別(可見性)的保護——我們先拋開復雜的繼承與多態不談。正是通過這種方式,我們可以對數據成員提供非常有效的保護,同時使數據結構更符合現實行為。
在面向對象的概念中,前面的數據結構表示如下:
#include
using namespace std;
class Student
{
private:
//屬性
char strname[50]; //姓名
int math; //數學分數
int chinese; //語文
int total; //總分
public:
//方法
char* getname(){ return strname; };
int getmath(){ return math; };
int getchinese(){ return chinese; };
int gettotal(){ return total; };
Student();
void InputData();
void PrintData();
};
Student::Student()
{
//////////////////////////////////////
//初始化數據
strname[0] = '\0';
math = 0;
chinese = 0;
total = 0;
}
void Student::InputData()
{
///////////////////////////////////////
//獲取輸入
cout<<"enter name"<<endl;
cin>>strname;
cout<<"enter math"<<endl;
cin>>math;
cout<<"enter chinese"<<endl;
cin>>chinese;
//////////////////////////////////////
//計算總分
total = math + chinese;
}
void Student::PrintData()
{
cout<<strname<<"''''s total mark is:"<<total<<endl;
}
int main()
{
Student someone;
someone.InputData();
someone.PrintData();
}
我們先不去關心類的實現細節,現在對比一下main函數中的調用過程,每種方法和相應的數據結構聯系在了一起,對外部的調用來說,我們不需要去關心數據結構和相應算法的關系,因為他們已經關聯在了一起。也許這個例子不夠說明問題,也許我的說明含糊不清,但是你想象一下:如果我們對一個物體,比如狗來建模,我們需要確定其屬性(顏色、大小)和行為(跑、叫),我們肯定希望這些都與狗這個模型關聯在一起:
Class dog
(屬性)
Color
Size
(行為)
Run
yelp
如果是結構話的:
Struct dog
Color
Size
(依賴關系)
Run(dog somedog) yelp(dog somedog)
顯然後面的結構比較復雜,更不要說缺乏有效的成員屬性保護。另外一個面向對象的強大就是繼承與多態,下一篇我們再來討論。
我希望我前面的表達足夠的清楚,面向對象不是這樣一篇文章可以描述的清楚的,我這裡只是描述了一個發展過程的片面。我希望它能成為一個引子,能夠為初學者提供一些幫助。