面向對象

面向對象

面向對象(Object Oriented,OO)是當前計算機界關心的重點,它是90年代軟體開發方法的主流。面向對象的概念和套用已超越了程式設計和軟體開發,擴展到很寬的範圍。如資料庫系統、互動式界面、套用結構、套用平台、分散式系統、網路管理結構、CAD技術、人工智慧等領域。面向對象,這方面的文章非常多。但是,明確地給出對象的定義或說明對象的定義的非常少,至少現在還沒有發現。起初,“面向對象”是專指在程式設計中採用封裝、繼承、抽象等設計方法。

基本信息

早期發展

早期的計算機編程是基於面向過程的方法,例如實現算術運算1+1+2 = 4,通過設計一個算法就可以解決當時的問題。隨著計算機技術的不斷提高,計算機被用於解決越來越複雜的問題。一切事物皆對象,通過面向對象的方式,將現實世界的事物抽象成對象,現實世界中的關係抽象成類、繼承,幫助人們實現對現實世界的抽象與數字建模。通過面向對象的方法,更利於用人理解的方式對複雜系統進行分析、設計與編程。同時,面向對象能有效提高編程的效率,通過封裝技術,訊息機制可以像搭積木的一樣快速開發出一個全新的系統。面向對象是指一種程式設計范型,同時也是一種程式開發的方法。對象指的是類的集合。它將對象作為程式的基本單元,將程式和數據封裝其中,以提高軟體的重用性、靈活性和擴展性。
起初,“面向對象”是專指在程式設計中採用封裝、繼承、多態等設計方法。
面向對象的思想已經涉及到軟體開發的各個方面。如,面向對象的分析(OOA,Object Oriented Analysis),面向對象的設計(OOD,Object Oriented Design)、以及我們經常說的面向對象的編程實現(OOP,Object Oriented Programming)。
面向對象的分析根據抽象關鍵的問題域來分解系統。面向對象的設計是一種提供符號設計系統的面向對象的實現過程,它用非常接近實際領域術語的方法把系統構造成“現實世界”的對象。面向對象程式設計可以看作一種在程式中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對電腦下達的指令。面向對象程式設計中的每一個對象都應該能夠接受數據、處理數據並將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。

背景

面向 對象是在 結構化設計方法出現很多問題的情況下應運而生的。 結構化設計方法求解問題的基本策略是從功能的角度審視問題域。它將應用程式看成實現某些特定任務的 功能模組,其中子過程是實現某項具體操作的底層功能模組。在每個功能模組中,用 數據結構描述待處理數據的組織形式,用 算法描述具體的操作過程。面對日趨複雜的套用系統,這種開發思路在下面幾個方面逐漸暴露了一些弱點。

1.審視問題域的視角

在現實世界中存在的 客體是問題域中的主角,所謂客體是指客觀存在的 對象實體和主觀 抽象的概念,他是人類觀察問題和解決問題的主要目標。例如,對於一個學校 學生管理系統來說,無論是簡單還是複雜,始終是圍繞學生和老師這兩個 客體實施。在自然界,每個 客體都具有一些屬性和行為,例如學生有學號、姓名、性別等屬性,以及上課、考試、做實驗等行為。因此,每個個體都可以用屬性和行為來描述。

通常人類觀察問題的視角是這些 客體,客體的屬性反應客體在某一時刻的狀態,客體的行為反映客體能從事的操作。這些操作附在 客體之上並能用來設定、改變和獲取客體的狀態。任何問題域都有一系列的 客體,因此解決問題的基本方式是讓這些客體之間相互驅動、相互作用,最終使每個客體按照設計者的意願改變其屬性狀態。

結構化設計方法所採用的設計思路不是將 客體作為一個整體,而是將依附於客體之上的行為抽取出來,以功能為目標來設計構造套用系統。這種做法導致在進行 程式設計的時候,不得不將 客體所構成的現實世界映射到由 功能模組組成的解空間中,這種變換過程,不僅增加了程式設計的複雜程度,而且背離了人們觀察問題和解決問題的基本思路。另外,再仔細思考會發現,在任何一個問題域中, 客體是穩定的,而行為是不穩定的。例如,不管是國家圖書館,還是學校圖書館,還是國際圖書館,都會含有圖書這個 客體,但管理圖書的方法可能是截然不同的。 結構化設計方法將審視問題的視角定位於不穩定的操作之上,並將描述 客體的屬性和行為分開,使得應用程式的日後維護和擴展相當困難,甚至一個微小的變動,都會波及到整個系統。面對問題規模的日趨擴大、環境的日趨複雜、需求變化的日趨加快,將利用計算機解決問題的基本方法統一到人類解決問題的習慣方法之上,徹底改變 軟體設計方法與人類解決問題的常規方式扭曲的現象迫在眉睫,這是提出面向 對象的首要原因。

2. 抽象級別

抽象是人類解決問題的基本法寶。良好的 抽象策略可以控制問題的複雜程度,增強系統的通用性和 可擴展性。 抽象主要包括過程抽象和數據抽象。 結構化設計方法套用的是過程 抽象。所謂過程 抽象是將問題域中具有明確功能定義的操作抽取出來,並將其作為一個實體看待。這種 抽象級別對於軟體系統結構的設計顯得有些武斷,並且穩定性差,導致很難準確無誤地設計出系統的每一個操作環節。一旦某個 客體屬性的表示方式發生了變化,就有可能牽扯到已有系統的很多部分。而數據 抽象是較過程抽象更高級別的抽象方式,將描述 客體的屬性和行為綁定在一起,實現統一的抽象,從而達到對現實世界客體的真正 模擬。

3. 封裝體

封裝是指將現實世界中存在的某個 客體的屬性與行為綁定在一起,並放置在一個邏輯單元內。該邏輯單元負責將所描述的屬性隱藏起來,外界對 客體內部屬性的所有訪問只能通過提供的 用戶接口實現。這樣做既可以實現對 客體屬性的保護作用,又可以提高 軟體系統的可維護性。只要用戶接口不改變,任何 封裝體內部的改變都不會對 軟體系統的其他部分造成影響。 結構化設計方法沒有做到 客體的整體 封裝,只是封裝了各個 功能模組,而每個功能模組可以隨意地對沒有保護能力客體屬性實施操作,並且由於描述屬性的數據與行為被分割開來,所以一旦某個客體屬性的表達方式發生了變化,或某個行為效果發生了改變,就有可能對整個系統產生影響。

4.可重用性

可 重用性標識著軟體產品的可復用能力,是衡量一個軟體產品成功與否的重要標誌。當今的軟體開發行業,人們越來越追求開發更多的、更有通用性的可重用 構件,從而使軟體開發過程徹底改善,即從過去的語句級編寫發展到現在的構件組裝,從而提高軟體開發效率,推動套用領域迅速擴展。然而, 結構化程式設計方法的基本單位是模組,每個模組只是實現特定功能的過程描述,因此,它的可重用單位只能是模組。例如,在 C語言編寫程式時使用大量的 標準函式。但對於今天的軟體開發來說,這樣的重用力度顯得微不足道,而且當參與操作的某些 數據類型發生變化時,就不能夠再使用那些函式了。因此,渴望更大力度的可重用 構件是如今套用領域對 軟體開發提出的新需求。

上述弱點驅使人們尋求一種新的程式設計方法,以適應現代社會對 軟體開發的更高要求,面向 對象由此產生。

概念 

對象
對象是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示抽象的規則、計畫或事件。
⑵對象的狀態和行為。
對象具有狀態,一個對象用數據值來描述它的狀態。
對象還有操作,用於改變對象的狀態,對象及其操作就是對象的行為。
對象實現了數據和操作的結合,使數據和操作封裝於對象的統一體中
⑶類。
具有相同特性(數據元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象,類實際上就是一種數據類型。
類具有屬性,它是對象的狀態的抽象,用數據結構來描述類的屬性。
類具有操作,它是對象的行為的抽象,用操作名和實現該操作的方法來描述。
⑷類的結構。
在客觀世界中有若干類,這些類之間有一定的結構關係。通常有兩種主要的結構關係,即一般--具體結構關係,整體--部分結構關係。
①一般--具體結構稱為分類結構,也可以說是“或”關係,或者是“is a”關係。
②整體--部分結構稱為組裝結構,它們之間的關係是一種“與”關係,或者是“has a”關係。
⑸訊息和方法。
對象之間進行通信的結構叫做訊息。在對象的操作中,當一個訊息傳送給某個對象時,訊息包含接收對象去執行某種操作的信息。傳送一條訊息至少要包括說明接受訊息的對象名、傳送給該對象的訊息名(即對象名、方法名)。一般還要對參數加以說明,參數可以是認識該訊息的對象所知道的變數名,或者是所有對象都知道的全局變數名。
類中操作的實現過程叫做方法,一個方法有方法名、返回值、參數、方法體。

特徵

面向對象 面向對象

⑴對象唯一性。

每個對象都有自身唯一的標識,通過這種標識,可找到相應的對象。在對象的整個生命期中,它的標識都不改變,不同的對象不能有相同的標識。

⑵抽象性。

抽象性是指將具有一致的數據結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與套用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的套用有關。

⑶繼承性。

繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。

繼承性是面向對象程式設計語言不同於其它語言的最重要的特點,是其他語言所沒有的。

在類層次中,子類只繼承一個父類的數據結構和方法,則稱為單重繼承。

在類層次中,子類繼承了多個父類的數據結構和方法,則稱為多重繼承。

多重繼承,JAVA、VB、NET、Objective-C均僅支持單繼承,注意在C++多重繼承時,需小心二義性。

在軟體開發中,類的繼承性使所建立的軟體具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的創建工作量,增加了代碼的可重用性。

採用繼承性,提供了類的規範的等級結構。通過類的繼承關係,使公共的特性能夠共享,提高了軟體的重用性。

⑷多態性(多形性)

多態性是指相同的操作或函式、過程可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一訊息可以產生不同的結果,這種現象稱為多態性。

多態性允許每個對象以適合自身的方式去回響共同的訊息。

多態性增強了軟體的靈活性和重用性。

要素 

⑴抽象。
抽象是指強調實體的本質、內在的屬性。在系統開發中,抽象指的是在決定如何實現對象之前的對象的意義和行為。使用抽象可以儘可能避免過早考慮一些細節。
類實現了對象的數據(即狀態)和行為的抽象。 
⑵封裝性(信息隱藏)。
封裝性是保證軟體部件具有優良的模組性的基礎。
面向對象的類是封裝良好的模組,類定義將其說明(用戶可見的外部接口)與實現(用戶不可見的內部實現)顯式地分開,其內部實現按其具體定義的作用域提供保護。
對象是封裝的最基本單位。封裝防止了程式相互依賴性而帶來的變動影響。面向對象的封裝比傳統語言的封裝更為清晰、更為有力。 
⑶共享性
面向對象技術在不同級別上促進了共享
同一類中的共享。同一類中的對象有著相同數據結構。這些對象之間是結構、行為特徵的共享關係。
在同一套用中共享。在同一套用的類層次結構中,存在繼承關係的各相似子類中,存在數據結構和行為的繼承,使各相似子類共享共同的結構和行為。使用繼承來實現代碼的共享,這也是面向對象的主要優點之一。
在不同套用中共享。面向對象不僅允許在同一套用中共享信息,而且為未來目標的可重用設計準備了條件。通過類庫這種機制和結構來實現不同套用中的信息共享。 
⒋強調對象結構而不是程式結構

開發方法

OOA方法

面向對象 面向對象

面向對象的分析方法(OOA),是在一個系統的開發過程中進行了系統業務調查以後,按照面向對象的思想來分析問題。OOA與結構化分析有較大的區別。OOA所強調的是在系統調查資料的基礎上,針對OO方法所需要的素材進行的歸類分析和整理,而不是對管理業務現狀和方法的分析。

(一)處理複雜問題的原則

抽象(abstraction)是指為了某一分析目的而集中精力研究對象的某一性質,它可以忽略其它與此目的無關的部分。在使用這一概念時,我們承認客觀世界的複雜性,也知道事物包括有多個細節,但此時並不打算去完整地考慮它。抽象是我們科學地研究和處理複雜問題的重要方法。抽象機制被用在數據分析方面,稱之為數據抽象。數據抽象是OOA的核心。數據抽象把一組數據對象以及作用其上的操作組成一個程式實體。使得外部只知道它是如何做和如何表示的。在套用數據抽象原理時,系統分析人員必須確定對象的屬性以及處理這些屬性的方法,並藉助於方法獲得屬性。在OOA中屬性和方法被認為是不可分割的整體。抽象機制有時也被用在對過程的分解方面,被稱之為過程抽象。恰當的過程抽象可以對複雜過程的分解和確定以及描述對象發揮積極的作用。

封裝(encapsulation)即信息隱蔽。它是指在確定系統的某一部分內容時,應考慮到其它部分的信息及聯繫都在這一部分的內部進行,外部各部分之間的信息聯繫應儘可能的少。

繼承(inheritance)是指能直接獲得已有的性質和特徵而不必重複定義它們。OOA可以一次性地指定對象的公共屬性和方法,然後再特化和擴展這些屬性及方法為特殊情況,這樣可大大地減輕在系統實現過程中的重複勞動。在共有屬性的基礎之上,繼承者也可以定義自己獨有的特性。

相關(association)是指把某一時刻或相同環境下發生的事物聯繫在一起。

訊息通信(communicationwithmessage)是指在對象之間互相傳遞信息的通信方式。

組織方法,在分析和認識世界時,可綜合採用如下三種組織方法(methodOforganization):

1、特定對象與其屬性之間的區別。

2、整體對象與相應組成部分對象之間的區別。

3、不同對象類的構成及其區別等。

比例(scale)是一種運用整體與部分原則,輔助處理複雜問題的方法。

行為範疇(categoriesOfbehavior)是針對被分析對象而言的,它們主要包括:1。基於直接原因的行為。2。時變性行為。3。功能查詢性行為。

(二)OOA方法的基本步驟

在用OOA具體地分析一個事物時,大致上遵循如下五個基本步驟:

第一步,確定對象和類。這裡所說的對象是對數據及其處理方式的抽象,它反映了系統保存和處理現實世界中某些事物的信息的能力。類是多個對象的共同屬性和方法集合的描述,它包括如何在一個類中建立一個新對象的描述。

第二步,確定結構(structure)。結構是指問題域的複雜性和連線關係。類成員結構反映了泛化-特化關係,整體-部分結構反映整體和局部之間的關係。

第三步,確定主題(subject)。主題是指事物的總體概貌和總體分析模型。

第四步,確定屬性(attribute)。屬性就是數據元素,可用來描述對象或分類結構的實例,可在圖中給出,並在對象的存儲中指定。

第五步,確定方法(method)。方法是在收到訊息後必須進行的一些處理方法:方法要在圖中定義,並在對象的存儲中指定。對於每個對象和結構來說,那些用來增加、修改、刪除和選擇一個方法本身都是隱含的(雖然它們是要在對象的存儲中定義的,但並不在圖上給出),而有些則是顯示的。

OOD方法

面向對象 面向對象

面向對象的設計方法(OOD)是OO方法中一個中間過渡環節。其主要作用是對OOA分析的結果作進一步的規範化整理,以便能夠被OOP直接接受。在OOD的設計過程中,要展開的主要有如下幾項工作。

(一)對象定義規格的求精過程

對於OOA所抽象出來的對象-&-類以及匯集的分析文檔,OOD需要有一個根據設計要求整理和求精的過程,使之更能符合OOP的需要。這個整理和求精過程主要有兩個方面:一是要根據面向對象的概念模型整理分析所確定的對象結構、屬性、方法等內容,改正錯誤的內容,刪去不必要和重複的內容等。二是進行分類整理,以便於下一步資料庫設計和程式處理模組設計的需要。整理的方法主要是進行歸類,對類一&一對象、屬性、方法和結構、主題進行歸類。

(二)數據模型和資料庫設計

數據模型的設計需要確定類-&-對象屬性的內容、訊息連線的方式、系統訪問、數據模型的方法等。最後每個對象實例的數據都必須落實到面向對象的庫結構模型中。

(三)最佳化

OOD的最佳化設計過程是從另一個角度對分析結果和處理業務過程的整理歸納,最佳化包括對象和結構的最佳化、抽象、集成。

對象和結構的模組化表示OOD提供了一種範式,這種範式支持對類和結構的模組化。這種模組符合一般模組化所要求的所有特點,如信息隱蔽性好,內部聚合度強和模組之間耦合度弱等。

集成化使得單個構件有機地結合在一起,相互支持。

Booch方法

Booch最先描述了面向對象的軟體開發方法的基礎問題,指出面向對象開發是一種根本不同於傳統的功能分解的設計方法。面向對象的軟體分解更接近人對客觀事務的理解,而功能分解只通過問題空間的轉換來獲得。

Coad方法

Coad方法是1989年Coad和Yourdon提出的面向對象開發方法。該方法的主要優點是通過多年來大系統開發的經驗與面向對象概念的有機結合,在對象、結構、屬性和操作的認定方面,提出了一套系統的原則。該方法完成了從需求角度進一步進行類和類層次結構的認定。儘管Coad方法沒有引入類和類層次結構的術語,但事實上已經在分類結構、屬性、操作、訊息關聯等概念中體現了類和類層次結構的特徵。

OMT方法

OMT方法是1991年由JamesRumbaugh等5人提出來的,其經典著作為“面向對象的建模與設計”。

該方法是一種新興的面向對象的開發方法,開發工作的基礎是對真實世界的對象建模,然後圍繞這些對象使用分析模型來進行獨立於語言的設計,面向對象的建模和設計促進了對需求的理解,有利於開發得更清晰、更容易維護的軟體系統。該方法為大多數套用領域的軟體開發提供了一種實際的、高效的保證,努力尋求一種問題求解的實際方法。

UML語言

軟體工程領域在1995年~1997年取得了前所未有的進展,其成果超過軟體工程領域過去15年的成就總和,其中最重要的成果之一就是統一建模語言(UML)的出現。UML將是面向對象技術領域內占主導地位的標準建模語言。

UML不僅統一了Booch方法、OMT方法、OOSE方法的表示方法,而且對其作了進一步的發展,最終統一為大眾接受的標準建模語言。UML是一種定義良好、易於表達、功能強大且普遍適用的建模語言。它融入了軟體工程領域的新思想、新方法和新技術。它的作用域不限於支持面向對象的分析與設計,還支持從需求分析開始的軟體開發全過程。

模型

對象模型

對象模型表示了靜態的、結構化的系統數據性質,描述了系統的靜態結構,它是從客觀世界實體的對象關係角度來描述,表現了對象的相互關係。該模型主要關心繫統中對象的結構、屬性和操作,它是分析階段三個模型的核心,是其他兩個模型的框架。

⒈對象和類

⑴對象。

對象建模的目的就是描述對象。

⑵類。

通過將對象抽象成類,我們可以使問題抽象化,抽象增強了模型的歸納能力。

⑶屬性。

屬性指的是類中對象所具有的性質(數據值)。

⑷操作和方法。

操作是類中對象所使用的一種功能或變換。類中的各對象可以共享操作,每個操作都有一個目標對象作為其隱含參數。

方法是類的操作的實現步驟。

⒉關聯和鏈

關聯是建立類之間關係的一種手段,而鏈則是建立對象之間關係的一種手段。

⑴關聯和鏈的含義。

鍊表示對象間的物理與概念聯結,關聯表示類之間的一種關係,鏈是關聯的實例,關聯是鏈的抽象。

⑵角色。

角色說明類在關聯中的作用,它位於關聯的端點。

⑶受限關聯。

受限關聯由兩個類及一個限定詞組成,限定詞是一種特定的屬性,用來有效的減少關聯的重數,限定詞在關聯的終端對象集中說明。

限定提高了語義的精確性,增強了查詢能力,在現實世界中,常常出現限定詞。

⑷關聯的多重性。

關聯的多重性是指類中有多少個對象與關聯的類的一個對象相關。重數常描述為“一”或“多”。

⒊類的層次結構

⑴聚集關係。

聚集是一種“整體-部分”關係。在這種關係中,有整體類和部分類之分。聚集最重要的性質是傳遞性,也具有逆對稱性。

聚集可以有不同層次,可以把不同分類聚集起來得到一顆簡單的聚集樹,聚集樹是一種簡單表示,比畫很多線來將部分類聯繫起來簡單得多,對象模型應該容易地反映各級層次。

⑵一般化關係。

一般化關係是在保留對象差異的同時共享對象相似性的一種高度抽象方式。它是“一般---具體”的關係。一般化類稱為你類,具體類又能稱為子類,各子類繼承了父類的性質,而各子類的一些共同性質和操作又歸納到你類中。因此,一般化關係和繼承是同時存在的。一般化關係的符號表示是在類關聯的連線上加一個小三角形。

⒋對象模型

⑴模板。模板是類、關聯、一般化結構的邏輯組成。

⑵對象模型。

對象模型是由一個或若干個模板組成。模板將模型分為若干個便於管理的子塊,在整個對象模型和類及關聯的構造塊之間,模板提供了一種集成的中間單元,模板中的類名及關聯名是唯一的。

動態模型

動態模型是與時間和變化有關的系統性質。該模型描述了系統的控制結構,它表示了瞬間的、行為化的系統控制

性質,它關心的是系統的控制,操作的執行順序,它表示從對象的事件和狀態的角度出發,表現了對象的相互行為。

該模型描述的系統屬性是觸發事件、事件序列、狀態、事件與狀態的組織。使用狀態圖作為描述工具。它涉及到事件、狀態、操作等重要概念。

⒈事件

事件是指定時刻發生的某件事。

⒉狀態

狀態是對象屬性值的抽象。對象的屬性值按照影響對象顯著行為的性質將其歸併到一個狀態中去。狀態指明了對象對輸入事件的回響。

⒊狀態圖

狀態圖是一個標準的計算機概念,他是有限自動機的圖形表示,這裡把狀態圖作為建立動態模型的圖形工具。

狀態圖反映了狀態與事件的關係。當接收一事件時,下一狀態就取決於當前狀態和所接收的該事件,由該事件引起的狀態變化稱為轉換。

狀態圖是一種圖,用結點表示狀態,結點用圓圈表示;圓圈內有狀態名,用箭頭連線表示狀態的轉換,上面標記事件名,箭頭方向表示轉換的方向。

功能模型

功能模型描述了系統的所有計算。功能模型指出發生了什麼,動態模型確定什麼時候發生,而對象模型確定發生的客體。功能模型表明一個計算如何從輸入值得到輸出值,它不考慮計算的次序。功能模型由多張數據流圖組成。數據流圖用來表示從源對象到目標對象的數據值的流向,它不包含控制信息,控制信息在動態模型中表示,同時數據流圖也不表示對象中值的組織,值的組織在對象模型中表示。

數據流圖中包含有處理、數據流、動作對象和數據存儲對象。

⒈處理

數據流圖中的處理用來改變數據值。最低層處理是純粹的函式,一張完整的數據流圖是一個高層處理。

⒉數據流

數據流圖中的數據流將對象的輸出與處理、處理與對象的輸入、處理與處理聯繫起來。在一個計算機中,用數據流來表示一中間數據值,數據流不能改變數據值。

⒊動作對象

動作對象是一種主動對象,它通過生成或者使用數據值來驅動數據流圖。

⒋數據存儲對象

數據流圖中的數據存儲是被動對象,它用來存儲數據。它與動作對象不一樣,數據存儲本身不產生任何操作,它只回響存儲和訪問的要求。

實例分析

面向對象分析的目的是對客觀世界的系統進行建模。本節以上面介紹的模型概念為基礎,結合“銀行網路系統”的具體實例來構造客觀世界問題的準確、嚴密的分析模型。

分析模型有三種用途:用來明確問題需求;為用戶和開發人員提供明確需求;為用戶和開發人員提供一個協商的基礎,作為後繼的設計和實現的框架。

(一)面向對象的分析

系統分析的第一步是:陳述需求。分析者必須同用戶一塊工作來提煉需求,因為這樣才表示了用戶的真實意圖,其中涉及對需求的分析及查找丟失的信息。下面以“銀行網路系統”為例,用面向對象方法進行分析。

銀行網路系統問題陳述:設計支持銀行網路的軟體,銀行網路包括人工出納站和分行共享的自動出納機。每個分理處用分理處計算機來保存各自的帳戶,處理各自的事務;各自分理處的出納站與分理處計算機通信,出納站錄入帳戶和事務數據;自動出納機與分行計算機通信,分行計算機與撥款分理處結帳,自動出納機與用戶接口接受現金卡,與分行計算機通信完成事務,發放現金,列印收據;系統需要記錄保管和安全措施;系統必須正確處理同一帳戶的並發訪問;每個分處理為自己的計算機準備軟體,銀行網路費用根據顧客和現金卡的數目分攤給各分理處。

(二)建立對象模型

首先標識和關聯,因為它們影響了整體結構和解決問題的方法,其次是增加屬性,進一步描述類和關聯的基本網路,使用繼承合併和組織類,最後操作增加到類中去作為構造動態模型和功能模型的副產品。

⒈確定類

構造對象模型的第一步是標出來自問題域的相關的對象類,對象包括物理實體和概念。所有類在套用中都必須有意義,在問題陳述中,並非所有類都是明顯給出的。有些是隱含在問題域或一般知識中的。

按圖10-19所示的過程確定類

查找問題陳述中的所有名詞,產生如下的暫定類。

軟體銀行網路出納員自動出納機分行

分處理分處理計算機帳戶事務出納站

事務數據分行計算機現金卡用戶現金

收據系統顧客費用帳戶數據

訪問安全措施記錄保管

根據下列標準,去掉不必要的類和不正確的類。

⑴冗餘類:若兩個類表述了同一個信息,保留最富有描述能力的類。如"用戶"和"顧客"就是重複的描述,因為"顧客"最富有描述性,因此保留它。

⑵不相干的類:除掉與問題沒有關係或根本無關的類。例如,攤派費用超出了銀行網路的範圍。

⑶模糊類:類必須是確定的,有些暫定類邊界定義模糊或範圍太廣,如"記錄保管"就模糊類,它是"事務"中的一部分。

⑷屬性:某些名詞描述的是其他對象的屬性,則從暫定類中刪除。如果某一性質的獨立性很重要,就應該把他歸屬到類,而不把它作為屬性。

⑸操作:如果問題陳述中的名詞有動作含義,則描述的操作就不是類。但是具有自身性質而且需要獨立存在的操作應該描述成類。如我們只構造電話模型,"撥號"就是動態模型的一部分而不是類,但在電話撥號系統中,"撥號"是一個重要的類,它日期、時間、受話地點等屬性。

在銀行網路系統中,模糊類是"系統"、"安全措施"、"記錄保管"、"銀行網路"等。屬於屬性的有:"帳戶數據"、"收據"、"現金"、"事務數據"。屬於實現的如:"訪問"、"軟體"等。這些均應除去。

⒉準備數據字典

為所有建模實體準備一個數據字典。準確描述各個類的精確含義,描述當前問題中的類的範圍,包括對類的成員、用法方面的假設或限制。

⒊確定關聯

兩個或多個類之間的相互依賴就是關聯。一種依賴表示一種關聯,可用各種方式來實現關聯,但在分析模型中應刪除實現的考慮,以便設計時更為靈活。關聯常用描述性動詞或動詞詞組來表示,其中有物理位置的表示、傳導的動作、通信、所有者關係、條件的滿足等。從問題陳述中抽取所有可能的關聯表述,把它們記下來,但不要過早去細化這些表述。

下面是銀行網路系統中所有可能的關聯,大多數是直接抽取問題中的動詞詞組而得到的。在陳述中,有些動詞詞組表述的關聯是不明顯的。最後,還有一些關聯與客觀世界或人的假設有關,必須同用戶一起核實這種關聯,因為這種關聯在問題陳述中找不到。

銀行網路問題陳述中的關聯:

·銀行網路包括出納站和自動出納機;

·分行共享自動出納機;

·分理處提供分理處計算機;

·分理處計算機保存帳戶;

·分理處計算機處理帳戶支付事務;

·分理處擁有出納站;

·出納站與分理處計算機通信;

·出納員為帳戶錄入事務;

·自動出納機接受現金卡;

·自動出納機與用戶接口;

·自動出納機發放現金;

·自動出納機列印收據;

·系統處理並發訪問;

·分理處提供軟體;

·費用分攤給分理處。

隱含的動詞詞組:

·分行由分理處組成;

·分理處擁有帳戶;

·分行擁有分行計算機;

·系統提供記錄保管;

·系統提供安全;

·顧客有現金卡。

基於問題域知識的關聯:

·分理處僱傭出納員;

·現金卡訪問帳戶。

使用下列標準去掉不必要和不正確的關聯:

⑴若某個類已被刪除,那么與它有關的關聯也必須刪除或者用其它類來重新表述。在例中,我們刪除了"銀行網路",相關的關聯也要刪除。

⑵不相干的關聯或實現階段的關聯:刪除所有問題域之外的關聯或涉及實現結構中的關聯。如"系統處理並發訪問"就是一種實現的概念。

⑶動作:關聯應該描述套用域的結構性質而不是瞬時事件,因此應刪除"自動出納機接受現金卡","自動出納機與用戶接口"等。

⑷派生關聯:省略那些可以用其他關聯來定義的關聯。因為這種關聯是冗餘的。銀行網路系統的初步對象圖如圖10-20所示。其中含有關聯。

⒋確定屬性

屬性是個體對象的性質,屬性通常用修飾性的名詞詞組來表示.形容詞常常表示具體的可枚舉的屬性值,屬性不可能在問題陳述中完全表述出來,必須藉助於套用域的知識及對客觀世界的知識才可以找到它們。只考慮與具體套用直接相關的屬性,不要考慮那些超出問題範圍的屬性。首先找出重要屬性,避免那些只用於實現的屬性,要為各個屬性取有意義的名字。按下列標準刪除不必要的和不正確的屬性:

⑴對象:若實體的獨立存在比它的值重要,那么這個實體不是屬性而是對象。如在郵政目錄中,"城市"是一個屬性,然而在人口普查中,"城市"則被看作是對象。在具體套用中,具有自身性質的實體一定是對象。

⑵定詞:若屬性值取決於某種具體上下文,則可考慮把該屬性重新表述為一個限定詞。

⑶名稱:名稱常常作為限定詞而不是對象的屬性,當名稱不依賴於上下文關係時,名稱即為一個對象屬性,尤其是它不惟一時。

⑷標識符:在考慮對象模糊性時,引入對象標識符表示,在對象模型中不列出這些對象標識符,它是隱含在對象模型中,只列出存在於套用域的屬性。

⑸內部值:若屬性描述了對外不透明的對象的內部狀態,則應從對象模型中刪除該屬性。

⑹細化:忽略那些不可能對大多數操作有影響的屬性。

⒌使用繼承來細化類

使用繼承來共享公共機構,以次來組織類,可以用兩種方式來進行。

⑴自底向上通過把現有類的共同性質一般化為父類,尋找具有相似的屬性,關係或操作的類來發現繼承。例如"遠程事務"和"出納事務"是類似的,可以一般化為"事務"。有些一般化結構常常是基於客觀世界邊界的現有分類,只要可能,儘量使用現有概念。對稱性常有助於發現某些丟失的類。

⑵自頂向下將現有的類細化為更具體的子類。具體化常常可以從套用域中明顯看出來。套用域中各枚舉字情況是最常見的具體化的來源。例如:選單,可以有固定選單,頂部選單,彈出選單,下拉選單等,這就可以把選單類具體細化為各種具體選單的子類。當同一關聯名出現多次且意義也相同時,應儘量具體化為相關聯的類,例如"事務"從"出納站"和"自動出納機"進入,則"錄入站"就是"出納站"和"自動出納站"的一般化。在類層次中,可以為具體的類分配屬性和關聯。各屬性和都應分配給最一般的適合的類,有時也加上一些修正。

套用域中各枚舉情況是最常見的具體化的來源。

⒍完善對象模型

對象建模不可能一次就能保證模型是完全正確的,軟體開發的整個過程就是一個不斷完善的過程。模型的不同組成部分多半是在不同的階段完成的,如果發現模型的缺陷,就必須返回到前期階段去修改,有些細化工作是在動態模型和功能模型完成之後才開始進行的。

⑴幾種可能丟失對象的情況及解決辦法:

·同一類中存在毫無關係的屬性和操作,則分解這個類,使各部分相互關聯;

·一般化體系不清楚,則可能分離扮演兩種角色的類

·存在無目標類的操作,則找出並加上失去目標的類;

·存在名稱及目的相同的冗餘關聯,則通過一般化創建丟失的父類,把關聯組織在一起。

⑵查找多餘的類。

類中缺少屬性,操作和關聯,則可刪除這個類。

⑶查找丟失的關聯。

丟失了操作的訪問路徑,則加入新的關聯以回答查詢。

⑷網路系統的具體情況作如下的修改:

①現金卡有多個獨立的特性。把它分解為兩個對象:卡片許可權和現金卡。

a.卡片許可權:它是銀行用來鑑別用戶訪問許可權的卡片,表示一個或多個用戶帳戶的訪問許可權;各個卡片許可權對象中可能具有好幾個現金卡,每張都帶有安全碼,卡片碼,它們附在現金卡上,表現銀行的卡片許可權。

b.現金卡:它是自動出納機得到表示碼的數據卡片,它也是銀行代碼和現金卡代碼的數據載體。

②"事務"不能體現對帳戶之間的傳輸描述的一般性,因它只涉及一個帳戶,一般來說,在每個帳戶中,一個"事務"包括一個或多個"更新",一個"更新"是對帳戶的一個動作,它們是取款,存款,查詢之一。一個"更新"中所有"更新"應該是一個原子操作。

③"分理處"和"分離處理機"之間,"分行"和"分行處理機"之間的區別似乎並不影響分析,計算機的通信處理實際上是實現的概念,將"分理處計算機"併入到"分理處",將"分行計算機"併入到"分行"。

(三)建立動態模型

⒈準備腳本

動態分析從尋找事件開始,然後確定各對象的可能事件順序。在分析階段不考慮算法的執行,算法是實現模型的一部分。

⒉確定事件

確定所有外部事件。事件包括所有來自或發往用戶的信息、外部設備的信號、輸入、轉換和動作,可以發現正常事件,但不能遺漏條件和異常事件。

⒊準備事件跟蹤表

把腳本表示成一個事件跟蹤表,即不同對象之間的事件排序表,對象為表中的列,給每個對象分配一個獨立的列。

⒋構造狀態圖

對各對象類建立狀態圖,反映對象接收和傳送的事件,每個事件跟蹤都對應於狀態圖中一條路徑。

(四)建立功能建模

功能模型用來說明值是如何計算的,表明值之間的依賴關係及相關的功能,數據流圖有助於表示功能依賴關係,其中的處理應於狀態圖的活動和動作,其中的數據流對應於對象圖中的對象或屬性。

⒈確定輸入值、輸出值

先列出輸入、輸出值,輸入、輸出值是系統與外界之間的事件的參數。

⒉建立數據流圖

數據流圖說明輸出值是怎樣從輸入值得來的,數據流圖通常按層次組織。

(五)確定操作

在建立對象模型時,確定了類、關聯、結構和屬性,還沒有確定操作。只有建立了動態模型和功能模型之後,才可能最後確定類的操作。

設計

面向對象設計是把分析階段得到的需求轉變成符合成本和質量要求的、抽象的系統實現方案的過程。從面向對象分析到面向對象設計,是一個逐漸擴充模型的過程。

瀑布模型把設計進一步劃分成概要設計和詳細設計兩個階段,類似地,也可以把面向對象設計再細分為系統設計和對象設計。系統設計確定實現系統的策略和目標系統的高層結構。對象設計確定解空間中的類、關聯、接口形式及實現操作的算法。

(一)面向對象設計的準則

⒈模組化

面向對象開發方法很自然地支持了把系統分解成模組的設計原則:對象就是模組。它是把數據結構和操作這些數據的方法緊密地結合在一起所構成的模組。分解系統為一組具有高內聚和松耦合的模組是模組化的屬性。

⒉抽象

面向對象方法不僅支持過程抽象,而且支持數據抽象。

⒊信息隱藏

在面向對象方法中,信息隱藏通過對象的封裝性來實現。

⒋低耦合

在面向對象方法中,對象是最基本的模組,因此,耦合主要指不同對象之間相互關聯的緊密程度。低耦合是設計的一個重要標準,因為這有助於使得系統中某一部分的變化對其它部分的影響降到最低程度。

⒌高內聚

⑴操作內聚。

⑵類內聚。

⑶一般——具體內聚。

(二)面向對象設計的啟發規則

⒈設計結果應該清晰易懂

使設計結果清晰、易懂、易讀是提高軟體可維護性和可重用性的重要措施。顯然,人們不會重用那些他們不理解的設計。

要做到:

⑴用詞一致。

⑵使用已有的協定。

⑶減少訊息模式的數量。

⑷避免模糊的定義。

⒉一般——具體結構的深度應適當

⒊設計簡單類

應該儘量設計小而簡單的類,這樣便以開發和管理。為了保持簡單,應注意以下幾點:

⑴避免包含過多的屬性。

⑵有明確的定義。

⑶儘量簡化對象之間的合作關係。

⑷不要提供太多的操作。

⒋使用簡單的協定

一般來說,訊息中參數不要超過3個。

⒌使用簡單的操作

面向對象設計出來的類中的操作通常都很小,一般只有3至5行源程式語句,可以用僅含一個動詞和一個賓語的簡單句子描述它的功能

⒍把設計變動減至最小

通常,設計的質量越高,設計結果保持不變的時間也越長。即使出現必須修改設計的情況,也應該使修改的範圍儘可能小。

(三)系統設計

系統設計是問題求解及建立解答的高級策略。必須制定解決問題的基該方法,系統的高層結構形式包括子系統的分解、它的固有並發性、子系統分配給硬軟體、數據存儲管理、資源協調、軟體控制實現、人機互動接口。

⒈系統設計概述

設計階段先從高層入手,然後細化。系統設計要決定整個結構及風格,這種結構為後面設計階段的更詳細策略的設計提供了基礎。

⑴系統分解。

系統中主要的組成部分稱為子系統,子系統既不是一個對象也不是一個功能,而是類、關聯、操作、事件和約束的集合。

⑵確定並發性。

分析模型、現實世界及硬體中不少對象均是並發的。

⑶處理器及任務分配。

各並發子系統必須分配給單個硬體單元,要么是一個一般的處理器,要么是一個具體的功能單元。

⑷數據存儲管理。

系統中的內部數據和外部數據的存儲管理是一項重要的任務。通常各數據存儲可以將數據結構、檔案、資料庫組合在一起,不同數據存儲要在費用、訪問時間、容量及可靠性之間做出折衷考慮。

⑸全局資源的處理。

必須確定全局資源,並且制定訪問全局資源的策略。

⑹選擇軟體控制機制。

分析模型中所有互動行為都表示為對象之間的事件。系統設計必須從多種方法中選擇某種方法來實現軟體的控制。

⑺人機互動接口設計。

設計中的大部分工作都與穩定的狀態行為有關,但必須考慮用戶使用系統的互動接口。

⒉系統結構的一般框架

⒊系統分解——建立系統的體系結構

可用的軟體庫以及程式設計師的編程經驗。

通過面向對象分析得到的問題域精確模型,為設計體系結構奠定了良好的基礎,建立了完整的框架。

⒋選擇軟體控制機制

軟體系統中存在兩種控制流,外部控制流和內部控制流。

⒌數據存儲管理

數據存儲管理是系統存儲或檢索對象的基本設施,它建立在某種數據存儲管理系統之上,並且隔離了數據存儲管理模式的影響。

⒍設計人機互動接口

在面向對象分析過程中,已經對用戶界面需求作了初步分析,在面向對象設計過程中,則應該對系統的人機互動接口進行詳細設計,以確定人機互動的細節,其中包括指定視窗和報表的形式、設計命令層次等項內容。

(四)對象設計

⒈對象設計概述

⒉三種模型的結合

⑴獲得操作。

⑵確定操作的目標對象。

⒊算法設計

⒋最佳化設計

⒌控制的實現

⒍調整繼承

⒎關聯的設計

面向對象程式設計

面向對象程式設計(英語:Object-oriented programming,縮寫:OOP)是一種程式設計范型,同時也是一種程式開發的方法。對象指的是類的實例。 
已經被證實的是,面向對象程式設計推廣了程式的靈活性和可維護性,並且在大型項目設計中廣為套用。 此外,支持者聲稱面向對象程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。 
當我們提到面向對象的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面,我們必須了解更多關於面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。

面向對象的系統分析

面向對象的分析方法是利用面向對象的信息建模概念,如實體、關係、屬性等,同時運用封裝、繼承、多態等機制來構造模擬現實系統的方法。
傳統的結構化設計方法的基本點是面向過程,系統被分解成若干個過程。而面向對象的方法是採用構造模型的觀點,在系統的開發過程中,各個步驟的共同的目標是建造一個問題域的模型。在面向對象的設計中,初始元素是對象,然後將具有共同特徵的對象歸納成類,組織類之間的等級關係,構造類庫。在套用時,在類庫中選擇相應的類。

適用範圍

當前,在研究OO方法的熱潮中,有如下主要研究領域:

(1)智慧型計算機的研究。因為OO方法可將知識片看作對象,並為相關知識的模組化提供方便,所以在知識工程領域越來越受到重視。OO方法的設計思想被引入到智慧型計算機的研究中。

(2)新一代作業系統的研究。採用OO方法來組織設計新一代作業系統具有如下優點:採用對象來描述OS所需要設計、管理的各類資源信息,如檔案、印表機、處理機、各類解設等更為自然;引入OO方法來處理OO的諸多事務,如命名、同步、保護、管理等,會更易實現、更便於維護;OO方法對於多機、並發控制可提供有力的支持,並能得當地管理網路,使其更豐富和協調。

(3)多學科的綜合研究。當前,人工智慧、資料庫、程式語言的研究有匯合趨勢。例如,在研究新一代資料庫系統(智慧型資料庫系統)中,能否用人工智慧思想與OO方法建立描述功能更強的數椐模型?能否將資料庫語言和程式語言融為一體?為了實現多學科的綜合,OO方法是一個很有希望的匯聚點。

(4)新一代面向對象的硬體系統的研究。要支持採用OO方法設計的軟體系統的運行,必須建立更理想的能支持OO方法的硬體環境。目前採用松耦合(分布主存)結構的多處理機系統更接近於OO方法的思想;作為最新出現的神經網路計算機的體系結構與OO方法的體系結構具有驚人的類似,並能相互支持與配合:一個神經元就是一個小粒度的對象;神經元的連線機制與OO方法的訊息傳送有著天然的聯繫;一次連線可以看作一次訊息的傳送。可以預料,將OO方法與神經網路研究相互結合,必然可以開發出功能更強、更迷人的新一代計算機硬體系統。

易混概念

“面向對象”和“基於對象”的區別
面向對象的三大特點(封裝,繼承,多態)缺一不可。通常“基於對象”是使用對象,但是無法利用現有的對象模板產生新的對象類型,繼而產生新的對象,也就是說“基於對象”沒有繼承的特點。而“多態”表示為父類類型的子類對象實例,沒有了繼承的概念也就無從談論“多態”。很多流行技術都是基於對象的,它們使用一些封裝好的對象,調用對象的方法,設定對象的屬性。但是它們無法讓程式設計師派生新對象類型。他們只能使用現有對象的方法和屬性。所以當你判斷一個新的技術是否是面向對象的時候,通常可以使用後兩個特性來加以判斷。“面向對象”和“基於對象”都實現了“封裝”的概念,但是面向對象實現了“繼承和多態”,而“基於對象”沒有實現這些,的確很饒口。
“類庫的創建者”和“類庫的使用者”的區別
從事面向對象編程的人按照分工來說,可以分為“類庫的創建者”和“類庫的使用者”。使用類庫的人並不都是具備了面向對象思想的人,通常知道如何繼承和派生新對象就可以使用類庫了,然而我們的思維並沒有真正的轉過來,使用類庫只是在形式上是面向對象,而實質上只是庫函式的一種擴展。
“面向過程”和“面向對象”的區別
面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了;面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
可以拿生活中的實例來理解面向過程與面向對象,例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。把上面每個步驟用不同的方法來實現。
如果是面向對象的設計思想來解決問題。面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分為1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了多個步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。 

例子

在 面向對象方法中, 對象可看成是屬性(數據)以及這些屬性上的專用操作的 封裝體。 封裝是一種信息禁止技術, 封裝的目的是使 對象的定義和實現分離。

Step1:

⒈1新建一個工程命名為VBOOP;

⒈2單擊工程 選單,選擇添加 類模組後並單擊確定按鈕;

⒈3在其屬性視窗中將類的名稱改為TScore。

Step2:編輯TScore 類模組代碼

⒉1.這裡為TScore類定義四個私有(private) 變數,它們只能在本模組

中是可見的,即類的一些成員被隱藏起來,用戶只能通過屬性過程

或函式等方法來訪問,從而對 對象進行封裝。

定義 變數的基本語法:

private/public As

代碼部分:

private FName As String\'學生的姓名

private FMath As Single\'數學成績

private FEnglish As Single \'英語成績

⒉2.為TScore類定義六個公用(public)的屬性(Property)過程和一

個計算總分的方法函式。

定義方法的基本語法:

private/public Property Get As ;

private/public Property Let (ByVal 變數名As 返回值類型);

private/public Function As ;

get: 將模組中的私有 變數的值賦給屬性過程,通常稱為讀;

Let: 通過屬性過程給模組中的私有 變數值賦,通常稱為寫。

代碼部分:

public Property Get GetName() As String

GetName = FName

End Property

public Property Let SetName(ByVal Name As String)

FName = Name

End Property

public Property Get GetMath() As Single

GetMath = FMath

End Property

public Property Let SetMath(ByVal Math As Single)

FMath = Math

End Property

public Property Get GetEnglish() As Single

GetEnglish = FEnglish

End Property

public Property Let SetEnglish(ByVal English As Single)

FEnglish = English

End Property

public Function Total() As Single\'計算總成績函式

Total = GetMath + GetEnglish

End Function

Step3:回到Form1視窗,在視窗上添加12個控制項:

⒊1添加5個文本框txtName、txtMath、txtEN、txtTotal;

⒊2添加5個標籤labName、labMath、labEN、labTotal

其Caption屬性分別為姓名、數學、英語、總成績;

⒊3添加2個 命令按鈕ComSetValues、ComSearch

其Caption屬性分別為賦值、查詢。

Step4:編輯視窗事件

⒋1.構造Score 對象及查詢關鍵字SearchKey。在面向對象方法

中,我們可以這樣說定義類就是定義 數據類型,而聲明對

象就是聲明 變數。也就是說, 對象實際上就是變數。

Dim Score As New TScore

Dim SearchKey As String

⒋2.給模組中四個私有 變數賦值的單擊事件

private Sub ComSetValues_Click()

If Val(txtMath.Text) >= 0 And Val(txtMath.Text) = 0 And Val(txtEN.Text)

相關詞條

相關搜尋

熱門詞條

聯絡我們