關鍵字:軟件 追求
這段時間在開源領域,即將推出的Spring 2.0將支持非貧血模型,也就是說,Domain model的持久化可以干凈地全部在Domain model自身之中實現了,這是面向對象技術一種探索。有關域模型建模困惑可見這里! 當面向對象技術正在將Model對象持久化行為綁定到Model數據自身時,工業界力推的SOA則倡導的是將數據從行為中解耦出來。SOA相關討論見這里?此泼,實際它們有一個共同點,追求同一個終極目標:松耦合(loose coupling)。
當我們在Java波濤洶涌的潮流中奮擊時,我們常常會思考?我為什么要這樣做?甚至,我們會想松耦合真的那么酷?可維護性真的是軟件唯一?也許我們迷失了方向。
我們要好好探究一下,軟件的最大追求是什么?
我們的大學計算機教育只是教會我們如何編程?這如同技工學校中教會學員如何使用車床一樣,當我們學會了編程,接下來是什么呢?是不是就沒有了呢?是不是就是如同車工那樣只需日復一日的反復編程呢?
其實,當你在一個系統中持續編程(增加新的東西),這個系統就變得復雜了,你面臨最大的挑戰是如何整理你自己的產物。
也就是說:大學教育只教會我們如何“增加新的東西”,但是沒有教育我們如何“整理這些東西”,而后者是目前軟件領域日新月異不斷發生的革命的新動力。
下面我們以具體代碼來說明“增加新的東西”和“整理這些東西”完全屬于不同層次的學問,有些人談到軟件只會想到算法和數據結構,認為這些才是科學,其實這是將軟件數學化,軟件不只是科學計算的工具,它自身也是一門科學,更象管理學/經濟學一樣,是科學和藝術的結合。
在最近Java(TM) Boutique網站上刊登出一篇文章Measuring the Complexity of OO Systems,衡量OO系統的復雜性,該文對軟件復雜性幾個著名公理進行了詳細闡述,這些公理如果你不進行學習和培訓,即使你使用OO語言Java等這樣工具,還是顯示你是“業余”的。
軟件復雜性包括以下部分(引自Measuring the Complexity of OO Systems):
Cyclomatic Complexity (圈復雜性)
Response for Class (類的響應)
Weighted methods per class (每個類重量方法)
Cyclomatic Complexity
Cyclomatic Complexity可以用下面代碼來說明:
Cyclomatic Complexity (CC) = number of decision points +1
其中number of decision points是指一個if else之類的條件判斷語句,比如,是下面這個條語句:
public void isValidSearchCriteria(SearchCriteria s){
if(s!=null) {
return true;
}else{
return false;
}
}
Cyclomatic complexity 對代碼的可測試性和可維護性上有很大影響,正如上例指出,當你要測試isValidSearchCriteria()方法 ,你必須寫三個測試用例來驗證它。
如果這個CC值增加,將有更多的判斷點(decision points)數量,也就意味著需要花費更多的力量來測試這些方法。詳細更多說明可參考Measuring the Complexity of OO Systems一文。
所以,if else 或while 等條件語句是對真正OO的一種傷害(這是非OO公理見Thomas McCabe),可以極端地說:一個好的OO系統幾乎在業務邏輯層看不到超出兩個以上條件的if else等判斷語句,這些條件語句都是可以被GoF設計模式的狀態模式/策略模式等替代(你還在用if else嗎)。
當你的Java系統中充滿了大量的if else語句,雖然你使用很酷的語言工具,但是說明你的思維是傳統過程的,需要重新學習和培訓。
Response for Class(RFC)
這是著名的 Chidamber and Kemerer公理之一。以下面代碼來說明:
public class RegistrationManager {
public void createRegistration(RegistrationData regData){
DataAccessManager manager = new DataAccessManager();
AuditManager auditManager = new AuditManager();
//save the registration
manager.saveRegistration(regData);
//audit the creattion
auditManager.createAuditRecord(regData);
}
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/