日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

契约

發布時間:2024/7/19 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 契约 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

魔獸爭霸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

總結

以上是生活随笔為你收集整理的契约的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。