本節將介紹以下內容:
有了前面兩章「oo 大智慧型」和「oo 大原則」的鋪墊,相信讀者已經有了對物件導向的基本認知。而本章將繼續深入關於物件導向和設計問題的討論,挑起設計與架構的話題。在高階語言橫行的今天,對於靜態語言的設計都源於物件導向思想,重構與設計都基於這些簡單的標準。
然而,對於設計,還有很多看似「慣常」的法則與經驗廣泛存在於軟體系統中,例如除了經典的 23 種設計模式,還有很多模式之外的模式,按照粒度的大小、系統的特點、規模的大小,而形成的架構規則。
對設計來說,或許永遠沒有唯一的答案,你只能無限地接近最好。設計,沒有唯一的答案,但是把握分寸,卻是軟體設計中需要「用心良苦」的部分。
設計,從何而來?是需求。是重構。
設計原則是系統設計的靈魂,而設計模式是系統開發的模板,靈活自如的應用才是設計以不變應萬變的準則。例如,實現乙個使用者註冊的方法,首先會想到:
// 初次設計
public
void
register
(string name,
int32 age)
在一定的需求條件下,這個方法已經能夠經受系統的考驗,安全而平穩地向資料庫中不斷插入新的使用者資訊。然而,當需求發生變化時,你可能不得不對此做出調整,而我們就將這種調整稱為重構。但是重構遠不是擴充,而是設計。例如,現在的註冊項發生了變化,還需要同時註冊性別、**,沒有設計的調整,就被實現為:
// 需求變更
public
void
register
(string name,
int32 age,
bool ismale,
int32 phone)
通過過載方式,一定程度上解決了這一問題,然而這種不能稱為重構的調整,至少存在以下的弊端:
僵化的調整失去了設計的靈活性,沒有思考的程式只能使程式的擴充套件和維護變得不可收拾,其實對於上述問題,只需要進行簡單的重構,就可輕鬆避免上述3個弊端,實現更加柔性的系統。例如,簡單重構如下:
public
class
userinfo
public
int32 age
public
bool gender
}
通過將使用者資訊封裝為乙個類,實現更加簡單的引數列表,同時其帶來的好處還遠不止避免了上述3個缺陷,而且能帶來對使用者資訊的封裝,實現更可靠的資訊隱藏和暴露:可以通過欄位和屬性封裝,實現對於成員的唯讀、可讀可寫許可權的控制。.net 3.0 的自動屬性為屬性封裝實現了更為優雅的語法遊戲,這些特性讓 c# 成為更具有吸引力的高階語言(詳見13.2節「賞析c# 3.0」):
// 定義可讀可寫屬性
public
string mobile
// 定義唯讀屬性
public
string password
實現一定的邏輯封裝,例如對於電子郵件,可以檢查其合法性:
private
string email;
public
string email
set\.[0-9]\.[0-9]\.)|(([\w-]+\.)+))([a-za-z]|[0-9])(\]?)$";if
(regex.
ismatch
(value
, strreg)
) email =
value
;else
throw
newinvalidcastexception
("invalid email address.");
}}
那麼,設計是如何實現和建立的呢?答案就是物件導向。正如上述演化過程一樣,其中應用了物件導向中的封裝要素,完成了更加柔性的設計。在1.3節「封裝的秘密」中,我們就對封裝展開了詳細的**,基於例項的應用和對 .net 實現本質的分析,能夠更加強化對於物件導向基本要素的理解。這些物件導向的思想和應用,來自於實踐,完善於重構。
設計是如此重要,那麼開發者的基本設計能力與素質又從何下手來培養呢?最好的辦法,就是請個老師。從框架中了解,從系統中實現,從書文中汲取。然而,設計能力的提公升絕非一朝一夕之功,軟體開發中的設計大師,往往必須具備多年的修行方可稱之為「架構師」。
乙個在簡歷中輕描淡寫的「10年軟體設計經驗」,並非是所有軟體人都能修煉成的真功夫,這裡沒有任何虛情假意可言。在乙個專案的實現過程中,逐漸了解什麼是物件、什麼是對抽象程式設計、設計模式是如何應用在實際的系統架構、設計原則到底是什麼秘密**,而重要的是完成乙個軟體專案,對於更多人來說是認識一種軟體開發的科學流程。這種體驗,才是難能可貴的經驗。在設計的廣義概念裡,幾個必需的概念是應該首先被了解和認知的,以排名不分先後的原則羅列,它們大概包括:
在本書第1部分,以「oo大智慧型」和「oo大原則」兩章的篇幅,分別講述了關於物件導向的實現本質和思想理念,以物件導向技術在 .net 中的應用為起點,熟悉和領略物件導向的智慧型與原則,修煉深入 .net 技術的基本功,為深入理解 .net 的程式設計打好必備的基礎。而本章將對以上設計問題繼續**,從點點滴滴入手來關注設計環節的下乙個據點。
所以,下面我們將對軟體開發中的設計與架構進行更多的**,以期收穫更多的共識與爭論。
周星馳在《食神》中歷經磨難之後參加食神大賽,做了一頓令人抓狂的黯然銷魂飯,並對對手說了句:其實每個人都是食神,引來對手不屑。同樣,現實世界的歷練也滲透著同樣的感悟,每個人都是食神,或者說每個人都可以是食神。軟體設計與架構同樣如此,不經一番寒徹骨,哪得梅花撲鼻香。
其實每個人都是食神,其實開發者都是設計師。關鍵在於掌勺的你,是否能讓做飯的傢伙油光鋥亮。其實,在設計的領域,你大可不必為看似高深的框架嚇倒,也不必為沒有經驗而怯場。在每個人的**生涯中,你隨時可以是食神,就像上例中通過簡單 extract class 重構方法,你就可以體驗一次化腐朽為神奇的力量。所以,設計無處不在,架構如影隨形。而如何將三層架構、abstract factory、extract method、mvc、ocp 這一竿子打不著的概念有機地、科學地、合理地體現在活生生的軟體系統中,是一種功力和經驗的體現。
OO的設計原則
從網上找了一些資料覺得這個還可以 物件導向設計原則 物件導向設計的基石是 開 閉 原則。開一閉 原則講的是 乙個軟體實體應當對擴充套件開放,對修改關閉。這個規則說的是,在設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。從另外乙個角度講,就是所謂的 對可變性封裝原則 對可變性封裝原...
OO設計的開閉原則
the open closed principle ocp oo設計的開閉原則 software entities classes,modules,function,etc.should be open for extension,but closed for modification.軟體實體 模...
關於OO設計的原則
關於oo設計原則,網上眾說紛紜,有6大設計原則,也有5大設計原則的說法。暫時先把這些概念記錄下來,以便後來理解。1.srp single responsibility principle 單一職責原則 我的理解為設計出來的乙個模組對應其所預期的職責。進一步簡化,就是設計出來的乙個類,僅僅負責乙個功能...