成也抽象,敗也抽象。何哉?

  我們所處的這個世界充滿了豐富多彩但雜亂無章的信息,要建立一個模型並不容易。建立模型的過程是一個抽象的過程,所以要建立模型,首先要知道如何抽象現實世界。如果我們站在很高的抽象層次,以高度歸納的視角來看這個世界的運作,就會發現現實世界無論多複雜,無論哪個行業,無論什麼業務,其本質無非是人、財、事、物和規則組成的。人是一切的中心,人要做事,做事就會使用一些物(例如:花錢)併產生另外一些物,同時做事需要遵循一定的規則。人驅動系統,事體現過程,物記錄結果,規則是控制。建立模型的關鍵就是弄明白什麼人,什麼人做什麼事,什麼事產生什麼物,中間有什麼規則,再把人,財,事,物,規則之間的關係定義出來,一個模型就基本成型了。

建模,是指通過對客觀事物建立一種抽象的方法用以表徵事物並獲得對事物本身的理解,同時把這種理解概念化,將這些邏輯概念組織起來,構成一種對所觀察的對象的內部結構和工作原理的便於理解的表達。

建模包含兩個問題,一個是怎麼建,一個是模式什麼。

抽象角度決定建模方向的不同,現實世界建模的時候,首先要決定的是抽象角度,即建立這個模型的目的是什麼。

模是什麼?依賴於確定了抽象角度下的場景模擬。確定一個目標,找出那些滿足目標的事物。

抽象層次越高,具體信息越少,概括能力越強;具體信息越豐富,結果越確定,概括能力越弱。

抽象有兩種方法:一種是自頂向下,另外一種是自底向上。

自頂向下的方法適用於讓我們從頭開始認識的一個事物。例如:介紹汽車的工作原理時,從發動機、傳動裝置、變速器等較高層次的抽象概念來講究比較容易明白。如果降一個層次,從發動機原理講起,一大部分聽眾就會開始迷惑;再降一個層次,從熱力學原理和力學原理講起,那就更沒人能搞懂汽車是怎麼工作的了。

自底向上的方法適用於在實踐中改進和提高認識。例如:在實踐中發現了發動機的問題,因而改進發動機的結構,甚至採用新的發動機原理,最終能夠提升汽車的質量。

 

抽象層次的一個問題是什麼時候選擇什麼樣的層次,以及總共要抽象多少層的問題。如果用UML來建模的話,這個問題就直接反映到如何選擇用例的粒度。

視圖

UML建模中的另一個非常重要的概念。視圖的準確應用是建立好模型的一個重要組成部分。在實際工作中,很多人並不知道應該在什麼地方應用視圖、應用哪一種視圖、總共需要哪些視圖。現實世界中的每一個事物都有很多不同的屬性,每個屬性都屬於這個事物並且僅能夠表達這個事物的一部分。人們認識這樣一個事物的時候,只有在了解了很多方面後才能夠對這個事物真正理解。例如一輛汽車,人們需要了解它的大小、重量、外觀、性能、安全等才會決定是否購買。上述每個屬性都是這輛車的一個視圖,每個視圖都向觀察者展示了一個視圖,每個視圖都向觀察者展示了目標對象的一個方面。只有將必要的方面都用視圖展示出來,觀察者才能理解這個事物。

視角

視角是人們觀察事物的角度。不同的人後者同一個人出於不同的目的會對同一個信息從不同的角度解讀與評估。視角是針對每一個視圖來說的,不同的視角展示了同樣信息的不同認知角度以便於理解。

視圖和視角是兩個被忽略的關鍵概念,對建立一個好的模型起着很重要的作用。為特定的信息選擇正確的視圖,為特定的干係人展示正確的視角並不容易,需要因時因地因人制宜。

對象有以下幾點屬性:獨立性、原子性、抽象性、層次性,這些屬性是面向對象分析是應該遵循的一些原則和方法。

邊界

邊界決定視界,邊界的大小是建模者主觀臆定的。為了更接近真相,我們能夠做的就是不斷變換邊界,改變視界,從更多的側面去描述同一個信息,以求更大程度地符合真實的需求。如果建模的過程中,對建模結果感到疑惑,那麼可以試着改變邊界設定,得到不同的參與者和用例,再通過相互印證的方式得到更好的結果。

邊界決定抽象層次,邊界是虛幻的,又是比不可少的。以過往的經驗來看,能夠準確把握邊界,嫩否靈活變換邊界,能否控制邊界的粒度是做好需求分析和系統設計的關鍵。誇張的說,高手和低手的差別或許就在「心中是否有邊界」吧。在架構師的眼裡,再複雜的世界也是被許多無形的邊界隔離、包裝、各行其職的。要時時牢記一句話「眼中無邊界,心中有邊界」。

屬性

方法

關係 

關聯關係:用來定義對象之間的靜態的,天然的結構。關聯的兩個對象之間通常不會相互直接使用,儘管它們相互知道對方的存在,但一般都由外部對象訪問的,如一個外部訪問者可以通過員工對象獲得公司形象。關聯關係具有多重行,常見的是一對一、一對多、多對多關聯。

依賴關係:是一種「弱」關係,它不是天然存在的,並且會隨着運動場景的變化而變化。如人和刀兩個對象,平時他們是沒有關係的,但當削蘋果的場景里,人依賴於刀;脫離了這個場景,依賴關係也就不存在了。依賴關係最終的代碼里體現是類構造方法、類方法等的傳入參數。我們應當保持單向依賴,杜絕雙向依賴關係的產生。

包含關係:它用於用例模型,從某種意義上講,包含用例是被封裝的,它代表可在各種不同基本用例中復用的行為。

實現關係:實現所代表的含義是,基本用例描述了一個業務目標,但是該業務目標有多種可能實現的途徑,每一種實現途徑可以用用例實現來表示,而用例實現和基本用例之間就構成了實現關係。

精化關係:精化關係表示由基本對象可以分解為更明確、精細的子對象,這些子對象並沒有增加,減少,改變基本對象的行為和屬性,僅僅是更加細緻和明確化了。

泛化關係:用於說明兩個對象之間的繼承關係。

聚合關係:用於表示實體對象之間的關係,表達整體由部分構成的語義。

組合關係:組合關係用於類圖,特別用於表示實體對象關係,表達整體擁有部分的語義。組合關係是一種強依賴的特殊聚合關係,如果整體不存在了,則部分也消亡了。

 

一個組件應該具有完備性、獨立性、邏輯性、透明性。

完備性是說,組件包含一些類和接口,一個組件應當能夠完成一項或一組特定的業務目標(或者功能),從調用者的觀點看,它不需要調用多個組件來完成一個業務請求。

獨立性是說,組件應當是可以獨立部署的,與其他組件無依賴關係的,最多僅保持關聯關係。

邏輯性是說,組件是從軟件構件設計的觀點來定義的,並非從需求中可以直接導出。組件的定義是為了規劃系統結構,將一個複雜的系統分解為一個個具體完備功能的、可獨立部署的小模塊。

透明性是說,組件的修改應當只涉及組件的定義以及組件中所包含的類的重新指定,而不應該導致類的修改。例如,當一個組件的功能變化時,它所包含的類可能從原來的類A、類B、類D變化成類B、類C、類D,但是類A,B,C,都不應當被修改。

  思想總結:

   從方法論的角度看,面向對象提供了一種處理複雜性問題的方式。在面向對象興起之前,結構化設計已經是系統到達了其處理能力的複雜性極點,有了對象,我們通過提升抽象級別來構建更大的,更複雜的系統,有了更高層次的認識論。所以這是面向對象取得成功的基石。

   從二元論的角度看,面向對象和面向過程又有動靜之分,陰陽之別之處,面向過程強調的是無處不在的變化,講究變化中之不變,講究的是一個整體概念;而面向對象講究的是何為不變,它將這個世界看做一個個相互獨立的對象,相互之間並無因果關係,只是在某個外部力量的驅動下,對象之間才會依據某個規律相互傳遞信息。

   從理念論的角度看,也就是分有說還是整體說的區別,是一個事物先有整體,還是先有個體的區別,也就是哲學上的先有雞還是先有蛋!

     What is real? How do you define 『real』? If you』re talking about what you can feel, what you can smell, what you can taste and see, then 『real』 is simply electrical signals interpreted by your brain.     ——《你如何認識世界?》