设计的核心任务之二:信息隐藏
假使說我們認同軟件的構造是一個復雜的過程,那么管理這種復雜度必然需要一些技巧。而為了找出這些技巧,則需要先瞄一眼這種復雜度的基本構成。
?
?
軟件的構造過程牽涉了兩個最為基本的要素:一是軟件,一是構造軟件的人。
假設說存在著一個標準的人,這個人智力水平恒定,創新能力恒定,技能水平恒定。那么軟件的復雜度只決定于其自身,比如軟件所需要面對的業務規則,所需要的計算水平等。應對這類復雜度的有效手段是優化方法,好比說快速排序的效率大多時候就是比冒泡排序好。
?
當我們開始考慮人的可變因素時,復雜度的來源則發生了變化。人是有著許多與生俱來的特質的,比如說:人是會犯錯的,人同一時間可以處理的事情是有限度的。因為這些特性,人在應對軟件自身所擁有的復雜度的同時,又帶來了偶然的,與個人特質相關的復雜度。比如說:局部變量的名稱可能碰巧和一個全局變量相同,而我們又誤把這個局部變量作為全局變量使用了。
?
信息隱藏則是減少這類偶然性復雜度的一個有效手段。
對于方法或函數而言,輸入參數,輸出參數描述了它的邊界。
對于類而言,公有屬性和公有方法描述了它的邊界。
邊界以內的即是被隱藏掉的信息。
?
?
假設說我們用一個名為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被隱藏了,但絕不是毫無代價。
?
?
--------------------------------------------------------------
?
理想流 + 軟件 =?《完美軟件開發:方法與邏輯》
理想流 + 人生 = ??
理想流 + 管理 = ??
理想流 = 以概念和邏輯推演本質,追求真理。
?
總結
以上是生活随笔為你收集整理的设计的核心任务之二:信息隐藏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: erlang/thrift快速安装
- 下一篇: 返璞归真的Open×××的p2p模式