皇家方舟

          數(shù)據(jù)的合法性檢測(cè)

          一般的數(shù)據(jù)類都應(yīng)該有自己的數(shù)據(jù)合法性檢查,如一個(gè)Person類,它的年齡屬性是int型的,但是如果給它賦值10000則為不合法,一個(gè)人不可能活那么長時(shí)間。因此需要在創(chuàng)建該類的對(duì)象時(shí)必需對(duì)其進(jìn)行合法性檢查,若構(gòu)造方法傳入的是非法數(shù)據(jù),則不讓其創(chuàng)建該對(duì)象,并拋出異常。也許大多數(shù)人認(rèn)為只需要對(duì)構(gòu)造方法傳入的參數(shù)進(jìn)行合法性檢查即可。如下所示:
          class ValidClass
          {
          ????????int ?dataValid1;
          ????????String dataValid2;

          ?????????public ValidClass(int i, String str)
          ?????????{
          ???????????????check(int i, String str);
          ???????????????dataValid1 = i;
          ???????????????dataValid2 = str;
          ?????????}

          ?????????void?check(int i, String str)
          ?????????{
          ????????????if(i >100 && i <= 0) throws new RuntimeException("message");
          ????????????if(str == "str") throws new RuntimeException("message");
          ?????????}

          ?????????void setDataValid1(int dataValid1)
          ?????????{
          ???????????????this.dataValid1 = dataValid1;
          ?????????}
          }
          實(shí)際上這種合法性并不可靠,這樣只是保證了在構(gòu)造方法中傳入的數(shù)據(jù)是合法的,但是不能保證程序員在使用該對(duì)象時(shí)能傳入合法的數(shù)據(jù)。如下程序代碼:
          ValidClass validClass = new ValidClass(2, "123");
          validClass.set(200);
          這樣使用的話,程序運(yùn)行并不會(huì)報(bào)錯(cuò),但是實(shí)際上我們已經(jīng)傳入了非法數(shù)據(jù)到該對(duì)象中去了,因此為了避免出現(xiàn)程序員在使用的時(shí)候也犯這種錯(cuò)誤,對(duì)數(shù)據(jù)的合法性檢查的正確方式應(yīng)如下所示:
          class ValidClass

          ?????? {

          ????????????? int ?dataValid;

          ?????????????

          ????????????? protected checkDataValid()

          ????????????? {

          ???????????????????? check if dataValid valid

          ???????????????????? if (fail)

          ???????????????????? {???? throws new RZXDataException(this, “.needValidate=”

          +needValidate); }

          ????????????? }

          public ValidClass(int in)

          ????????????? {????

          setDataValid(in);????

          }

          ????????????? public setDataValid(int in)

          ????????????? {?????????????????????
          ?????????????????????checkNeedValidate();

          ???????????????????? dataValid = in;

          ????????????? }

          ?????? }

          在set方法中進(jìn)行合法性檢查,然后在構(gòu)造方法中也調(diào)用set方法設(shè)置字段值,而不直接使用類中的字段。這樣做的好處很明顯:不僅保證了構(gòu)造方法中傳入的數(shù)據(jù)必須合法,而且可以保證程序在使用的過程中不能使用非法數(shù)據(jù),如果程序員使用了非法數(shù)據(jù),程序運(yùn)行必然出錯(cuò),并且能夠很快的找到錯(cuò)誤的根源所在。

          ?????????另外,有些程序員認(rèn)為,有些數(shù)據(jù)類的對(duì)象全部來自于另一個(gè)數(shù)據(jù)對(duì)象,也就是說該類的構(gòu)造方法中的參數(shù)即另一個(gè)數(shù)據(jù)類對(duì)象,因此在該類中所有與被傳入對(duì)象類中有相同的合法性檢查的數(shù)據(jù)字段不需要再進(jìn)行合法性檢查了。其實(shí)這種想法是錯(cuò)誤的,問題與上面所說的一樣,你能保證傳入的數(shù)據(jù)是合法的,但不能保證使用者在調(diào)用你的set方法時(shí)能100%傳入合法數(shù)據(jù)。因此,程序員是不應(yīng)該偷這個(gè)懶的。也許有人會(huì)說,他們的合法性檢查完全一樣,如果在該類中再寫的話就會(huì)出現(xiàn)大量的重復(fù)代碼了。能想到這里是對(duì)的,但是如果你有一定的經(jīng)驗(yàn),你就知道去建立一個(gè)專門保存合法性檢查方法的類,這樣你就可以在需要進(jìn)行合法性檢查的時(shí)候就使用該類里面的方法,如果該類中沒有你所需要的方法,你就可以在里面加入你所需要的合法性檢查方法,再去使用它。這樣做會(huì)使得代碼非常的清晰。

          ?????????我認(rèn)為,應(yīng)該在自己類中的所有使用“this.value = data;”字樣的代碼都應(yīng)該使用setValue(),因?yàn)橐苍S這個(gè)字段現(xiàn)在不需要進(jìn)行合法性檢查,但是不能保證將來也沒有合法性要求。而一旦以后需要對(duì)該字段進(jìn)行合法檢查的時(shí)候,就需要在set方法中增加合法性檢查代碼,而且需要將該類中所有對(duì)該字段的賦值語句均改用set方法。一旦有某處漏掉,則很可能帶來致命的錯(cuò)誤。也許在某個(gè)運(yùn)算中帶來了非法數(shù)據(jù),但是你卻怎么也不會(huì)往這方面去想,因?yàn)槟阋恢币詾樽约喝慷甲髁撕戏ㄐ詸z查的。



          posted on 2006-12-01 10:59 阿輝 閱讀(549) 評(píng)論(0)  編輯  收藏 所屬分類: 學(xué)習(xí)日志

          My Links

          Blog Stats

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 家居| 肥西县| 淮南市| 新津县| 高州市| 白城市| 吴川市| 汽车| 淮南市| 景德镇市| 磴口县| 彭泽县| 六安市| 崇信县| 呼图壁县| 响水县| 兰考县| 高淳县| 桦甸市| 无为县| 运城市| 西乌珠穆沁旗| 宜宾市| 岳池县| 穆棱市| 和林格尔县| 广灵县| 江川县| 安化县| 昌都县| 武宁县| 玛沁县| 谷城县| 保定市| 常宁市| 米泉市| 兴安盟| 广州市| 峨山| 涞源县| 台东县|