契约
魔獸爭霸3中死亡騎士(Death Knight)出生時就會說一句:
The pact is sealed.
契約已簽訂。
?
看過N多童話故事和電影的小伙伴們肯定熟悉這種場景:
大反派斗不過主角,處于劣勢時,就會與諸如惡魔簽訂契約,以自己的青春換取強大的力量,即:
? 青春 --> 惡魔 ? ? 惡魔 ?--> 力量 ?
?
我們把這個再改變一下:
惡魔 【得到】{青春} ?-> ?{力量}
看起來有點眼熟,這不就是function/method干的事情嗎?
function 與惡魔簽訂契約(青春) {
return 力量;
}
? ?
拿一個PHP簡單的函數來說吧,此函數是這樣的:
function getFullName($givenName, $surname) {return $givenName.' '.$surname; }? 對于調用方來說,如此調用:$fullName = getFullName($realGivenName, $realSurname);
輸入 $realGivenName 和 $realSurname 不知道是否返回結果,有結果也不知道是什么。
這里 $givenName和?$surname 兩個形參對比之下就是契約條件,而返回的值就是契約回饋。
? ? ??
每天在敲代碼,原來就是在寫各種各樣的契約,然后各個契約被各種各樣的大反派(調用方)簽訂(調用)。
?
再來看Java的一個方法
public static String getFullName(String givenName, String surname) {return givenName + " " + surname; }?
?給一個String類型 和 一個String參數,返回一個String 類型的結果;
?
? ?
去跟PHP對比一下,發現Java的Method契約條件的限制更加嚴格了,而契約回饋的描述也更加準確了。
?
即PHP函數在調用時,函數形參如果不限制類型的話,可以是任意類型($givenName 可以是一個int,也可以是array,甚至是一個resource類型,或者干脆是null),
基于動態語言的特點,甚至還可以傳多于/少于(少于的話PHP會報Warning級別的錯誤)function規定的參數數目進去!
?
所以在上面這種實現在遇到特殊情況下,就會出現意想不到的結果,因此具體實現要對變量類型、值做各種判斷;
而Java在實現內則不需要做類型判斷,只需要處理空的情況即可;
?
對于return 的結果來說,PHP function實現可以返回 null、int,array,resource... 又是不限制類型和值!契約回饋又是模糊的描述……
?
所以,PHP function/method 契約是模糊的,契約回饋的描述也是模糊,而Java則更加強調契約發起方和契約執行方的明確的責任;
?
如此這般,PHP 一個function/method 實現(契約執行方)就頭大了,調用方(契約發起方)傳過來的參數(契約條件)很有可能存在
意想不到的情況,于是就需要在實現內加類型判斷, 處理空或者其他情況。調用方也不知道實現是否真的能達成契約描述(function/method名稱,注釋等)
那樣的美好的結果,調用方又得對實現返回進行判斷。
?
而Java則只是對象參數需要處理null的情況,因為有一步編譯的過程,類型則不需要費心。即在通過編譯后,契約雙方的基本條件和回饋描述被保證了。
PS:這么一說,編譯器(Compiler)聽起來就像是一個公證人似的。
?
總的來說,PHP因為不必在聲明變量或者制定方法簽名時聲明類型,所以是弱契約。 ? ?
?
弱契約的好處是顯而易見的:
調用方的責任限制變少,執行方(實現)的責任 加重(即兼容 各種參數情況),那么只需要一個契約執行方,就可以滿足多種調用方的情況。
即一個function/method實現,調用方多種情況來調用都是沒問題的;
我們也可以把這種實現成為健壯的實現;
?
Java則是強契約,好處不必多說,但是劣勢對比弱契約也是很明顯,調用方參數若是出現了另外一種類型或者參數變多/變少,則不得不重載(Overload),
如果業務復雜起來,重載方法寫起來簡直是惡心;
?
?
說道這里泛型橫空出世,我們可以理解泛型其實就是在強契約和弱契約之間的一種折中,即Method契約不再死板地限制某個具體類型,也不死板地規定
返回某個具體類型,而是規定為某一系列的類型,即在強契約的上弱化了一些,將類型限制放寬。
?
?
使用了泛型的方法,則可以滿足調用方的某一系列的參數類型情況,讓我們少些重載方法,減少了代碼量 :)
?
?
return ;
?
轉載于:https://www.cnblogs.com/Joynic/p/6828590.html
總結
- 上一篇: 保留小数点后两位小数
- 下一篇: 洛谷 P1767 家族_NOI导刊201