偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

程序員你如何檢查參數(shù)的合法性?

開(kāi)發(fā) 前端
大部分的方法和構(gòu)造函數(shù)對(duì)傳入的參數(shù)值有一些限制,比如:常見(jiàn)的索引值必須是非負(fù)數(shù),對(duì)象引用不能為空。你應(yīng)該使用清晰的文檔來(lái)標(biāo)注所有的這些限制,然后在方法體開(kāi)始的地方強(qiáng)制他們檢查。

作為程序員的你,代碼中最多的就是各種方法了,你是如何對(duì)參數(shù)進(jìn)行校驗(yàn)的呢?

背景

大部分的方法和構(gòu)造函數(shù)對(duì)傳入的參數(shù)值有一些限制,比如:常見(jiàn)的索引值必須是非負(fù)數(shù),對(duì)象引用不能為空。

你應(yīng)該使用清晰的文檔來(lái)標(biāo)注所有的這些限制,然后在方法體開(kāi)始的地方強(qiáng)制他們檢查。

[[342104]]

應(yīng)該在錯(cuò)誤發(fā)生的時(shí)候盡快的檢查出來(lái),這是基本原則。

如果你不這么做,當(dāng)錯(cuò)誤發(fā)生的時(shí)候,錯(cuò)誤將不會(huì)被檢測(cè)出來(lái),這讓定位錯(cuò)誤的源頭變得更困難。

如果一個(gè)非法參數(shù)傳遞到一個(gè)方法中,在方法執(zhí)行前進(jìn)行了參數(shù)檢查。它將會(huì)快速失敗,并給出清晰的異常信息。

如果方法沒(méi)有檢查參數(shù),下面這些事情會(huì)發(fā)生。

程度說(shuō)明

  • 糟糕方法會(huì)在執(zhí)行過(guò)程中失敗然后拋出一個(gè)不明確的異常;
  • 更糟糕方法會(huì)正常返回,但是悄悄的計(jì)算了一個(gè)錯(cuò)誤的值。

最糟糕方法正常返回,但是一些對(duì)象處在一個(gè)不正確的狀態(tài),未來(lái)一個(gè)不確定的時(shí)間點(diǎn)在某些無(wú)關(guān)聯(lián)的點(diǎn)會(huì)造成一個(gè)錯(cuò)誤。

一句話總結(jié):參數(shù)不校驗(yàn)會(huì)導(dǎo)致原子性失敗。

推薦做法

對(duì)公共和保護(hù)方法,使用java文檔的@throws標(biāo)簽來(lái)標(biāo)注參數(shù)值不合法將拋出的異常。

常見(jiàn)的參數(shù)校驗(yàn)的異常類型如下:

只要你已經(jīng)已經(jīng)在文檔中標(biāo)注了方法參數(shù)的限制和違反限制會(huì)拋出的異常,限制將是一個(gè)簡(jiǎn)單的事情,下面是一個(gè)典型的例子。

  1. /** 
  2. *@param m 必須是正整數(shù) 
  3. *@throws ArithmeticException 如果m<=0 
  4. **/ 
  5. public BigInteger mod(BigInteger m){ 
  6.     if(m<=0){ 
  7.         throw new ArithmeticException("modulus <=0: "+ m); 
  8.     }    //todo 其它代碼 

注意:

  • 文檔注釋并沒(méi)有說(shuō), 如果m是空,mod將拋出NullPointException, 盡管這個(gè)方法確實(shí)會(huì)這樣。調(diào)用m.signum()的時(shí)候這個(gè)異常被標(biāo)注在類級(jí)別BigInteger的文檔注釋上,類級(jí)別的注釋適用于所有的公共方法的參數(shù),這是一個(gè)避免在每個(gè)方法單獨(dú)的文檔化標(biāo)注NullPointException這種混亂的好方法。

也許可以結(jié)合@Nullable或者類似的注解來(lái)指明特殊參數(shù)可以為空,但是這個(gè)實(shí)踐并不是標(biāo)準(zhǔn)的,并且有很多注解可以用來(lái)達(dá)到這個(gè)目的。

Objects實(shí)用類

Objects.requireNonNull方法,在Java7中添加的,非常的靈活和方便,所以沒(méi)有理由手動(dòng)的執(zhí)行空指針檢查。 你也可以指定異常的詳細(xì)信息,這個(gè)方法返回自己的輸入,所以你可以在使用該值的時(shí)候執(zhí)行一個(gè)空指針檢查。

  1. //一行代碼使用java的空指針檢查 
  2. this.strategy = Objects.requireNonNull(strategy,"strategy"

如果你可以忽略返回值,你也可以根據(jù)你的需要使用Objects.requireNonNull作為獨(dú)立的空指針檢查。在Java9中,一個(gè)范圍檢查的方法被添加到了java.util.Objects中,包含了3個(gè)方法:

這3個(gè)方法沒(méi)有空指針檢查方法靈活,它無(wú)法讓你指定自己的異常詳細(xì)信息,它被設(shè)計(jì)用在List和Array的索引檢查上。 它也無(wú)法處理閉區(qū)間,但是只要你需要,這就是一個(gè)小便利。

Java斷言

對(duì)一個(gè)不開(kāi)放的方法,你作為包的作者,控制著方法的調(diào)用狀況,你必須保證只有合法的參數(shù)值傳遞進(jìn)去了。所以,對(duì)非公開(kāi)的方法,你可以使用斷言來(lái)進(jìn)行參數(shù)檢查,如下所示:

  1. //私有幫助排序函數(shù) 
  2. private static void sort(long a[] , int offset, int length){ 
  3.     assert a != null ;    //更多代碼 

本質(zhì)上來(lái)講,斷言申明條件一定是true , 忽略客戶端如何使用對(duì)應(yīng)的包。跟一般的合法性檢查不同,斷言失敗的時(shí)候拋出AssertError;跟一般的合法性檢查不同,除非你啟用他們否則斷言對(duì)你沒(méi)有任何影響和消耗。在java命令行啟用指令:

  1. -ea 
  2. 或者 
  3. -enableassertions 

更多斷言的信息,查看java手冊(cè)的Asserts;

檢查參數(shù)的合法性非常重要,即使你的方法中沒(méi)有用到,但是存儲(chǔ)起來(lái)了,后面會(huì)用到。

舉個(gè)例子: 靜態(tài)工廠方法: 輸入一個(gè) int數(shù)組 ,返回一個(gè)array的 list視圖, 如果客戶端傳入 null, 這個(gè)方法會(huì)拋出NPE, 因?yàn)榉椒〞?huì)有一個(gè)直接檢查,調(diào)用了Objects.requireNonNull。如果忽略檢查,方法會(huì)返回一個(gè)引用新創(chuàng)建的List的實(shí)例;

而客戶端嘗試使用的時(shí)候回拋出NPE; 這個(gè)時(shí)候,原始的List實(shí)例很難決定,很大可能會(huì)復(fù)雜到變成一個(gè)調(diào)試任務(wù)。

構(gòu)造函數(shù)代表了一個(gè)特殊例子的原則: 你應(yīng)該檢查即將存儲(chǔ)稍后會(huì)用到的參數(shù)的合法性。

檢查構(gòu)造函數(shù)參數(shù)的合法性非常重要,它可以防止構(gòu)造一個(gè)違反類的不變性的對(duì)象。

異常情況

在執(zhí)行方法計(jì)算之前,你應(yīng)該檢查方法參數(shù) 。 這個(gè)規(guī)則也有異常情況。

一個(gè)重要的異常情況是:合法性檢查代價(jià)非常高并且重要, 并且檢查是在執(zhí)行計(jì)算的過(guò)程中執(zhí)行的。舉個(gè)例子:有一個(gè)方法對(duì)一個(gè)對(duì)象list排序,比如 Collectios.sort(list),所有的list中的對(duì)象必須是可互相比較的。在處理list比較的時(shí)候,每個(gè)對(duì)象將會(huì)跟其它的對(duì)象進(jìn)行比較,

如果對(duì)象不能互相比較,其中一個(gè)或多個(gè)比較會(huì)拋出ClassCastException,這是排序方法應(yīng)該做的。

所以:這里有一個(gè)小店,在開(kāi)始的時(shí)候檢查列表中的元素應(yīng)該是可以互相比較的,注意:修改合法性檢查會(huì)喪失原子失敗。

偶爾,一個(gè)計(jì)算執(zhí)行了一個(gè)需要的合法性檢查,但是當(dāng)執(zhí)行檢查失敗的時(shí)候,拋出了一個(gè)錯(cuò)誤的異常。換句話說(shuō),計(jì)算常常會(huì)拋出參數(shù)合法性檢查的異常,并不會(huì)匹配方法在文檔中申明的異常。這種場(chǎng)景下,你應(yīng)該使用異常翻譯成語(yǔ)。 轉(zhuǎn)換自然異常為正確的異常。

這個(gè)原則并不是說(shuō)武斷的限制參數(shù)是一件好事,而是說(shuō):你應(yīng)該設(shè)計(jì)通用實(shí)際的方法。假設(shè)你的方法接受所有的參數(shù)組合而可以做一些合理事情,你的參數(shù)限制越少越好,然而,一些限制本質(zhì)上在抽象類中已經(jīng)被實(shí)現(xiàn)了。

小結(jié)

如果看完之后你只能記住一句話:每次你寫(xiě)一個(gè)方法或者一個(gè)構(gòu)造函數(shù),你應(yīng)該思考參數(shù)的限制是否存在,你應(yīng)該把限制寫(xiě)在文檔中,并在方法體的開(kāi)始部分確保進(jìn)行了檢查。

養(yǎng)成這個(gè)習(xí)慣很重要,適當(dāng)?shù)墓ぷ鲿?huì)在第一次合法性檢查失敗的時(shí)候回饋你。

 

程序員你如何檢查參數(shù)的合法性?

 

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2015-07-28 09:54:43

2020-06-05 07:42:16

參數(shù)驗(yàn)證合法

2009-05-21 15:58:12

程序員工作經(jīng)驗(yàn)職場(chǎng)

2013-06-17 11:01:49

程序員離職

2015-04-10 19:37:34

程序員

2015-12-14 17:26:42

程序員生活

2015-12-07 11:44:31

程序員厭倦工作

2015-12-09 09:17:11

情緒厭倦程序員

2012-04-26 17:12:36

程序員夢(mèng)想

2011-05-18 15:32:02

程序員

2021-07-26 18:14:58

人臉識(shí)別AI人工智能

2013-03-18 09:34:35

Office 365云計(jì)算

2013-08-20 09:33:59

程序員

2020-03-02 15:15:37

程序員工資協(xié)議

2014-12-01 10:05:25

程序員

2014-07-14 11:28:41

2015-09-16 11:32:38

程序員匠心

2009-01-08 09:04:18

2015-05-27 09:45:59

程序員

2012-09-10 09:16:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)