信息隱藏是面向對象設計的一個原則,是對封裝和模塊化的一個更高維度的概括。從Java的整個訪問限制設計就體現了信息隱藏的原則,各種訪問修飾符:public,protect,private,在類設計的時候,我們就要決定什么暴露給外部,什么隱藏起來。
舉一個例子下面的代碼表示一個有自增ID的Person類。
1
2
3
4
5
6
7
|
public class Person { int id; private static int G_MAX_ID = 0 ; public Person() { this .id = ++G_MAX_ID; } } |
上面的類設計有什么問題呢?它違反了信息隱藏的原則,直接將ID分配的方式暴露了,這會給后面的維護帶來很多問題:當你想給id的范圍做出限制的時候怎么辦?當你在所有代碼中使用++G_MAX_ID分配ID時突然需要修改ID分配的算法怎么辦?是不是需要去改所有++G_MAX_ID出現的地方?更好的設計是將ID的分配算法隱藏起來。
1
2
3
4
5
6
7
8
9
10
|
public class Person { int id; private static int G_MAX_ID = 0 ; public Person() { this .id = NewId(); } private int NewId() { return ++G_MAX_ID; } } |
咋一看只是將++G_MAX_ID寫到一個方法里面而已,但是它隱藏了ID分配的算法,讓調用者不需要關心里面的實現,同時控制了變化,不管ID分配算法怎么變,都不會影響其他的代碼。調用者了解的信息越多,受到的影響就越大,信息隱藏可以降低復雜度,控制變化的范圍。
上面的例子只是信息隱藏的一個簡單應用,下面我們來舉幾個其他的應用例子:
最后總結一下信息隱藏的好處:
我們先來看看函數與過程區別:
平時我們編程其實沒有太區別函數與過程,什么時候用函數,什么時候用過程其實沒有過多的考慮,感覺都可以用。一個選擇的規則就是當你的方法的目的是想返回跟你方法名稱相符的值的時候用函數,否則用過程
舉個例子,我看過很多XXProcessor接口里面的方法都是XX process(),嚴格來講,這樣的命名是不符合上面的規則的,process是一個沒有含義的命名,但是卻有返回值,如果沒有返回值那它的命名才是合理的。
當然了,上面的規則僅供參考,世事無絕對,具體情況具體分析,當你不清楚用函數還是用過程的時候,可以參考這個規則。
相信大家看到一個if語句有很多條件的時候都會特別頭痛,因為很難理解。例如下面的例子:
1
2
3
|
if ( ( elementIndex < 0 ) || ( MAX_ELEMENTS < elementIndex ) || elementIndex == lastElementIndex) { do .... } |
但如果換成下面的寫法,用boolean值的名字來給if語句注釋,看起來就很好理解了。
1
2
3
4
5
|
finished = ( ( elementIndex < 0 ) || ( MAX_ELEMENTS < elementIndex ) ); repeatedEntry = ( elementIndex == lastElementIndex ); if ( finished || repeatedEntry ) { ... } |
怎么寫高質量的代碼是一個很大的話題,這里只是拋磚引玉,其實面向對象設計的很多原則都能夠給我們寫代碼的時候提供指導,寫代碼的時候要時刻記得學以致用,而不是敷衍了事,專業的軟件工程師必然要能寫得一手好代碼。