設計的核心任務之二:資訊隱藏

來源:互聯網
上載者:User

假使說我們認同軟體的構造是一個複雜的過程,那麼管理這種複雜度必然需要一些技巧。而為了找出這些技巧,則需要先瞄一眼這種複雜度的基本構成。

 

 

軟體的構造過程牽涉了兩個最為基本的要素:一是軟體,一是構造軟體的人。

假設說存在著一個標準的人,這個人智力水平恒定,創新能力恒定,技能水平恒定。那麼軟體的複雜度只決定於其自身,比如軟體所需要面對的商務規則,所需要的計算水平等。應對這類複雜度的有效手段是最佳化方法,好比說快速排序的效率大多時候就是比冒泡排序好。

 

當我們開始考慮人的可變因素時,複雜度的來源則發生了變化。人是有著許多與生俱來的特質的,比如說:人是會犯錯的,人同一時間可以處理的事情是有限度的。因為這些特性,人在應對軟體自身所擁有的複雜度的同時,又帶來了偶然的,與個人特質相關的複雜度。比如說:局部變數的名稱可能碰巧和一個全域變數相同,而我們又誤把這個局部變數作為全域變數使用了。

 

資訊隱藏則是減少這類偶然性複雜度的一個有效手段。

對於方法或函數而言,輸入參數,輸出參數描述了它的邊界。

對於類而言,公有屬性和公有方法描述了它的邊界。

邊界以內的即是被隱藏掉的資訊。

 

 

假設說我們用一個名為CustomerManager的類來管理客戶的基本資料,但在開放出AddCustomer(), EditCustomer(),DeleteCustomer()這樣介面的同時,也開放了內部存放客戶資訊的集合類。那麼使用CustomerManager類的人,很可能直接通過操作集合類來擷取客戶資訊。這個做法雖然可以被編譯器所接受,但實際上是對CustomerManager類的誤用。為了避免這類誤用,存放客戶資訊的集合類應該被隱藏起來,讓用的人只看到介面。

 

資訊隱藏是抽象資料類型,類等之所以存在的一個比較主要的理由。但資訊隱藏並不只在使用抽象資料類型和類的時候才有意義。定義介面的時候,甚至實現的時候資訊隱藏這一原則同樣可以發揮作用。

比如說:實現方法A的時候,實際上只需要類的兩個屬性,但卻把整個類定義成了這個方法的參數,這也是違背資訊隱藏原則的。

 

 

還有一種比較有意思的情況是,目的是資訊隱藏,但實際上卻違背了資訊隱藏原則。

比如說:類的方法中常常會使用到成員變數。有時候和類自身關聯不是很緊密的屬性也會被添加為成員變數。像表徵資料庫的類,比如DataBase,大多時候並不需要和擷取資料的類,比如感應器的類Sensor直接關聯,但有時候Sensor的執行個體卻會被添加為DataBase的私人成員變數。

 

與此同時,大多時候類中的方法並不會把成員變數作為自身的參數,而是會直接使用,比如說:由於Sensor的執行個體是DataBase的私人成員變數,那麼DataBase::GatherData()在用到Sensor執行個體的時候會直接使用,而不會把介面定義為.DataBase::GatherData(Sensor& sensor )。這種用法與成員變數過度膨脹的趨勢撞在一起後,有意思的事情發生了。

 

從外部看,感應器這樣的成員變數是私人的,達到了資訊隱藏的目的。

但對於方法而言,結果卻完全相反。

每多使用一個成員變數,其自身的資訊隱藏就被破壞一點 。

 

如果在同一方法中,用到五六個成員變數,那麼這個方法會變得非常難懂。因為對於類中的方法而言,這些成員變數自身的變化是完全不被隱藏的,每個都有有自己獨立的脈絡,比如說:DataBase::SetInterval()方法中可能會調整Sensro執行個體的狀態,進而對Sensor::GatherData()產生影響。這會導致方法的邊界不清晰。不清晰,也就不可能緊湊。不緊湊意味著閱讀的時候,一個方法所需要的資訊不能立刻擷取。最終會導致程式難讀,難改,難維護。

 

這類執行個體提醒我們,並非把很多操作和資料成員都放到類裡面就達成了資訊隱藏的目的。

事實上這對每個類的可能規模提出了限制。極端的情況下,如果一個類很大,有2000SLOC,那麼所有這2000SLOC代碼就等於通過成員變數粘結在一起,這和過度使用全域變數在一定程度上等價。

 

從資訊隱藏的程度上來看,對方法而言,局部變數最佳,類的成員或屬性稍差,全域變數最差。

局部變數把資訊隱藏在方法之內,成員或屬性把資訊隱藏在類之內,而全域變數等於不做資訊隱藏。

 

 

 

資訊隱藏和前面提到的層次問題並不能分割開來。從基本趨勢來看,資訊隱藏做的越徹底,層次也必然就會越多。而前面曾經提及過層級自身是有副作用的。

 

從最小化層次的副作用的角度來看,使用函數或方法來隱藏資料,使用類似抽象資料類型的方法來把資料封裝到類之中,代價非常微小,幾乎總是對的。但在類A中包含B,類B中包含C,類C中包含D這類的方式則福禍難料。誠然B,C,D被隱藏了,但絕不是毫無代價。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.