物件導向程式設計的優點
容易維護
– 因為物件可以單獨執行(容易理解)與維護
– 將物件內部的細部資料與程序隱藏起來與外界隔離,可以有效地降低程式碼改變時所產生的副作用
物件為適當的可重複使用軟體元件
– 因為所需的資料結構和操作處理都已經融合在單一實體物件中
對部分軟體系統而言,真實世界實體可以很容易對應到系統的物件
(1)類別
物件導向的開發方法是從類別開始思考
m 類別可以視為產生物件的模板(template)
m 類別可以視為物件的一般化描述
m 類別可以視為Pattern (通用的概念)
m 類別可以視為物件的藍圖來描述相似物件的共同特性
m 當類別的特性定義好之後,個別的類別實例(即物件)才能產生
物件(Object)是類別的實例。例如,「狗」這個類別列舉狗的特點,從而使這個類別定義了世界上所有的狗。而萊絲這個物件則是一條具體的狗,它的屬性也是具體的。狗有皮毛顏色,而萊絲的皮毛顏色是棕白色的。因此,萊絲就是狗這個類別的一個實例。
物件與類別之特性:
m 屬性為物件所儲存的資料值
m 例如姓名、年齡、體重等
m 每個屬性名稱可以有其資料型態或預設值
每個物件皆具有唯一性:
m 在物件模型中並不一定要有明確的物件識別值,每個物件本質上即為唯一
操作(Operations) and方法(methods):
m 每個類別所產生的物件可提供操作(operation)讓其他物件來應用
m 不同類別的物件可以使用相同名稱的操作(稱為多型polymorphism)
m 物件操作的程式碼實作也可稱為方法(method) (by a different piece of code)
方法Methods (Operations操作, Services服務
方法為類別中所封裝的可執行程序,設計來操作類別中所定義的資料屬性
物件中的方法是透過訊息傳遞的方式被呼叫執行
(2)唯一性(Identity)
每個物件皆為分離且可以區別的實體
每個真實世界中物件的存在都是獨一無二的
兩個所有屬性值都相同的物件仍然為不同的兩個物件,仍然可以區別
(3)抽象性(Abstraction)
- 將實體抽象化,只取出一個實體中重要的基本部分,而忽略其他次要的附屬部分
- 通常會在分析階段執行抽象化的動作,以決定應用領域的實體概念,而非在設計與實做階段才決定
(4)封裝(encapsulation)與資訊隱藏(information hiding)
封裝是將物件的內部細部實作隱藏起來,讓外部的物件無法直接存取
物件所封裝的包括資料屬性與處理資料的邏輯操作程序
(5)多型性(polymorphism)
靜態多型性
– 又稱為overloading
– 呼叫執行同一個物件的相同操作時,可以使用不同資料型態或個數的參數來呼叫執行
– 動態多型性指多種不同型態的物件可以符合同一個物件參考,例如一個父類別的物件可由其不同子類別的物件實例來取代,不同子類別可以有相同名稱的操作,但每個子類別的相同操作可能會有不同執行程序
(6)繼承Inheritance
透過階層化的結構關係來共享類別之間的屬性與操作
每個子類別可以繼承父類別的所有特性,包括屬性與操作,子類別還可另外增加自己獨有的特性,稱為擴充性
繼承可以達到重複使用之目的,可重複使用整個父類別而不需了解其細部的實作
(7)分類Classification /一般化Generalization
分類:
– 是將具有相同屬性與操作的物件群組成為一個類別,每個物件稱為此類別的一個實例
– e.g. Bicycle object -------> Bicycle class
一般化: is-a關係
– (superclass父, subclass子)
– 父類別稱為子類別的一般化,每個子類別可以繼承其父類別的所有特性,並可另外增加自己獨有的屬性與操作
(8)特殊化(Specialization)
• 與一般化相反地,子類別稱為父類別的特殊化
• 子類別可以另外增加自己獨有的屬性與操作,稱為擴充性
• 子類別可以使用和父類別相同名稱的操作方法,並改寫(overriding)重新定義自己特有的程式碼
• 通常子類別需要改寫的原因為各子類別需要相同的介面規格,但又需要各自不同的執行程序以得到各子類別所需的執行結果
(9)聚合性(Aggregation)
• 聚合性為一種特殊的結合關係,用來描述整體與部分元件之間的whole-part (a-part-of)關係
• 一般兩個物件具有association只代表這兩個物件之間有關係,加上聚合性符號則代表一個物件為另一個物件的一部份
物件導向程式設計程序之特性
-由使用案例驅動,利用使用案例來確認需求
-以軟體元件為基礎的軟體結構,可以將整個系統劃分為多個部分元件,並描述這些軟體元件如何互動與開發
-反覆式開發,將軟體開發過程分解成多個開發週期,每個開發週期反覆地產生部份結果
-漸增式開發,將軟體系統的功能分解成多個部分功能,隨著開發過程逐一漸增完成
跨元件開發
因為學習程式設計是為了控制電腦、讓電腦幫我們做事情
物件導向開發流程可以採用螺旋開發模式,將開發階段分為五個象限,包括與使用者溝通、擬定開發計畫、風險分析、系統開發、及使用者評估等五個象限,以螺旋狀方式由內而外依次反覆進行這五個開發階段
int main(void)
{
int rot,cdf;
cin >> rot;
for(int i=0;i<=rot;i++){
for(int j=0;j<=abs(i-rot/2);j++){
cout <<" ";
cdf=j;
}
&nbs