爲什麼要解耦呢?
舉個例子:
getScore($student){
}
假如一個課程類,裏面有一個獲取學生分數的的方法getScore()。該方法要求傳入一學號。
在這個方法中,就跟學生類student耦合了。
因爲在getScore方法中,需要$student->getNum();
假如現在學生類被類作者改變了,取消了getNum()這個方法,那麼你這個方法,就需要重新寫了。
當開發人員只有很少人時,這個耦合帶來的影響是比較小的,因爲我們大概都知道在哪裏用了,改起來也不麻煩。
但是當項目比較大,開發人員多起來的時候,改動一個,幾乎就需要改動很多類了。
解耦比較好的方法,就是需要什麼,就要求什麼:
getScore($StudentId){
}
這樣,當學生類變動的時候,就不需要擔心自己的類需要改變了。
這裏有出現了幾個問題:
1、 學生類不符合開閉原則,如果學生類符合開閉原則,那麼我們這個耦合關係也沒問題。
需求是經常變更的,在開發項目過程中,完全做到開閉原則是不可能的。很多項目在開發過程中,也是需要不斷地重構。
2、 如果所有類都解耦,那麼是否是一個類修改了,那麼其他地方都無需改變了呢?
有些改動是不影響其他地方,比如getNum()方法裏面加了一個判斷,這樣只是更改了這個方法,在地方來說,依然調用的是getNum(),所以是不會改變的。
但是很多時候,其他地方也是需要改動的。不過這個時候,改動的,只是場景方法中而已。比如現在刪除了學生類中的getNum()方法。在getScore($StudentId)裏面就無需改變的。但是在場景中,還需要改變獲取學號的方法,然後再傳進去這個getScore中。
3、 像上面的getScore方法,如果在方法裏面修改獲取學號,也只需要修改一次,但是如果解耦的話,就需要所有場景都需要修改。
的確是這樣的。但是如果類能夠解耦的話,這個類的開發人員無需瞭解另外一個類具體功能功能是什麼。當有多個人同時開發的時候,兩個類就能並行開發,而無需擔心需要哪個類先開發完才能繼續開發下一個類。
在像c++,java語言中,類解耦能夠使類不需要再重編譯。要知道,中大型項目編譯起來,往往是幾個小時(甚至是幾天)。所以類解耦,能夠讓類無需重編譯,減少編譯時間。
綜合起來就有以下優點:
1、 在c++,java這種語言中,能夠減少編譯時間
2、 各個類能夠同時開發