面向對象分析設計-------01基礎


     去年學校開了一門《面向對象程序設計》課,沒有好好聽,現在搞項目開發的時候突然感到了這門課程的重要性了,也就只好翻開去年的資料,重新開始學習了,下面是我的總結,與大家分享一下。有不對的地方,希望大家給我指出來。

面向對象分析設計系列文章:

面向對象分析設計-------01基礎

面向對象分析設計-------02UML

......


本文章的三大目標:

燈泡OO:建立對象的思維方式,對面向對象思想和理論有進一步的理解

燈泡UML:能夠熟練地使用UML表達面向對象的設計思想

燈泡Model:運用對象技術的一般原則和模式進行應用系統的分析和設計建模

目錄:

一、開篇亮劍:面向對象vs結構化

    1、從設計設計思想的角度比較

    2、(程序)實現角度比較

    3、從建模的角度

二、了解對象技術(Object Technology)

     定義

     特點

     Object Technology發展史

三、核心概念:對象與類

    1、對象

    2、類

    3、對象與類的關系

四、對象技術相關原則

    對象技術基本原則

    對象技術相關機制


一、開篇亮劍:面向對象vs結構化

1、從設計設計思想的角度比較

                      結構化                        面向對象

結構化思維用過程刻畫數據間關系

對象思維直接用類表達數據間關系

結構化中,數據是死的,全部依賴算法操作

數據是活的,“她”知道自己的信息(屬性),並能完成自己的工作(操作)

結構化思維更像是一個人在解決所有問題

對象思維更像是一個團隊的分工協作

2、(程序)實現角度比較

             結構化               面向對象

數據結構+算法=程序設計

以對象為中心組織數據與操作

數據

對象屬性

類型與變量

類與對象實例

函數(過程)調用

消息傳遞

類型與子類型

一般類與特殊類,繼承

構造類型

整體-部分結構,聚合

指針

關聯

3、從建模的角度

 

傳統結構化方法

面向對象方法(UML)

需求模型

輸入I、處理P、輸出O的視角。

面向功能的文檔(用戶需求規格說明書)需求變化,其功能變化,所以系統的基礎不穩固

從用戶和整體角度出發。

使用系統抽象出用例圖、活動圖,獲取需求;如需求變化,對象的性質相對功能穩定,系統基礎穩定

分析模型

面向過程的數據流圖DFD、 實體—關系圖ERD、數據字典DD表示分析模型

功能分解,數據和功能/過程分開

把問題作為一組相互作用的實體,顯式表示實體間的關系

數據模型和功能模型,狀態、順序、通信、活動圖細化說明一致

類、對象圖表示分析模型

設計模型

功能模塊(SC圖),模塊之間的連接/調用是模塊的附屬形式

類和對象實現, 類/對象的關聯、聚集、繼承等連接、連接規范和約束作為顯式定義

實施模型

體系結構設計

構件圖,部署圖

測試模型

根據文檔進行單元測試,集成測試,確認測試

單元測試采用類圖,集成測試用實現圖和交互圖,確認測試采用用例圖

 

二、了解對象技術(Object Technology)

定義:A set of principles (abstraction, encapsulation, polymorphism, ..) guiding software construction, together with languages, databases, and other tools that support those principles.

特點:

1、模擬

可以順應人類思維習慣,讓軟件開發人員在解空間中直接模擬問題空間中的對象及其行為。

面向對象實例表示:

東北人都是活雷鋒

老張開車去東北…… 撞啦!

class 人 {

Region 籍貫;

}

class Region {

}

interface 雷鋒 {

helpPeople(){ }

}

class 東北人 extends 人 implements 雷鋒 {

籍貫 = 東北;

helpPeople(){ }

}

class Car{

DriveTo(Region) throws Exception (撞車){}

人 Driver;

}

Main Program {

人 老張;

Car 夏利;

夏利.Driver = 老張;

try {

夏利.DriveTo(東北);

}

catch (Exception) { }

}

2、穩定

較小的需求變化才不會導致系統結構大的改變。

image

所以,可以把交不穩定的數據和功能用較穩定的類包起來,是的設計更加健壯。

3、復用

代碼重用:類庫、框架等重用機制

通過繼承、關聯、封裝等手段

 

Object Technology發展史

image

 

三、核心概念:對象與類

1、對象

定義:

An object is an entity with a well-defined boundary and identity that encapsulates state and behavior.

State is represented by attributes and relationships.

Behavior is represented by operations, methods, and state machines.

星星每一個對象都有一個唯一的標識, 即使其狀態有可能與其它對象一樣

星星一個對象的狀態是它反映於現實世界的一系列屬性

星星對象的行為定義當其它對象發出請求時,該對象如何反應

在UML中的表示形式:

An object is represented as a rectangle with an underlined name.

image

2、類

定義:

A class is a description of a set of objects that share the same attributes, operations, relationships, and semantics.

An object is an instance of a class.

image

在UML中的表現形式:

A class is represented using a rectangle with compartments.

image

3、類和對象的關系

image

星星類是生成對象的模板:類的定義中包含有產生和刪除對象的操作。

星星每一個對象都是某一個類的實例。

星星每一個類在某一時刻都有零個或更多的實體

星星類是靜態的;它們的存在、語義和關系在執行前就已經定義好了

星星對象是動態的;它們在程序執行時可以被創建和刪除

 

四、對象技術相關原則

對象技術基本原則:

抽象(Abstraction) image
封裝(Encapsulation) 為了保持數據一致性

struct ShippingAddress {

long cityCode;

String address;

}

改成

class ShippingAddress {

private long cityCode;

private string address;

public long ModifyAddress(String address)

}

模塊(Modularity)

Breaks up something complex into manageable pieces

image
層次(Hierarchy) image

對象技術相關機制:

泛化(Generalization)

A relationship among classes where one class shares the structure and/or behavior of one or more classes.

什么是繼承

A subclass inherits its parent’s attributes, operations, and relationships .

imageimage

 

單一繼承                                                            多重繼承

imageimage

多態(Polymorphism)

The ability to hide many different implementations behind a single interface.

image

class abstract Shape {

public abstract void draw();

}

class Rectangle extends Shape {

// 覆蓋(override)基類方法

public void draw() { ...
/* 繪制矩形 */ }

}

class Circle extends Shape {

// 覆蓋(override)基類方法

public void draw() { …
/* 繪制圓形 */ }

}

應用:1、假設我們有一個數組sharr,里面放着一排Shape,但是不知道哪些是Rectangle,哪些是Circle。利用多態性,我們可以:

for (int i = 0; i < sharr.length; ++i) {

Shape shape = (Shape)sharr[i];

shape.draw();

}

2、遍歷整個數組的過程中,各個Shape自己知道應當如何在畫布上繪制自己。shape.draw()這同一行代碼在shape指向不同的對象時表現出不同的行為,這就是所謂多態性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM