<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    皇家方舟

    數據的合法性檢測

    一般的數據類都應該有自己的數據合法性檢查,如一個Person類,它的年齡屬性是int型的,但是如果給它賦值10000則為不合法,一個人不可能活那么長時間。因此需要在創建該類的對象時必需對其進行合法性檢查,若構造方法傳入的是非法數據,則不讓其創建該對象,并拋出異常。也許大多數人認為只需要對構造方法傳入的參數進行合法性檢查即可。如下所示:
    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;
    ?????????}
    }
    實際上這種合法性并不可靠,這樣只是保證了在構造方法中傳入的數據是合法的,但是不能保證程序員在使用該對象時能傳入合法的數據。如下程序代碼:
    ValidClass validClass = new ValidClass(2, "123");
    validClass.set(200);
    這樣使用的話,程序運行并不會報錯,但是實際上我們已經傳入了非法數據到該對象中去了,因此為了避免出現程序員在使用的時候也犯這種錯誤,對數據的合法性檢查的正確方式應如下所示:
    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方法中進行合法性檢查,然后在構造方法中也調用set方法設置字段值,而不直接使用類中的字段。這樣做的好處很明顯:不僅保證了構造方法中傳入的數據必須合法,而且可以保證程序在使用的過程中不能使用非法數據,如果程序員使用了非法數據,程序運行必然出錯,并且能夠很快的找到錯誤的根源所在。

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

    ?????????我認為,應該在自己類中的所有使用“this.value = data;”字樣的代碼都應該使用setValue(),因為也許這個字段現在不需要進行合法性檢查,但是不能保證將來也沒有合法性要求。而一旦以后需要對該字段進行合法檢查的時候,就需要在set方法中增加合法性檢查代碼,而且需要將該類中所有對該字段的賦值語句均改用set方法。一旦有某處漏掉,則很可能帶來致命的錯誤。也許在某個運算中帶來了非法數據,但是你卻怎么也不會往這方面去想,因為你一直以為自己全部都作了合法性檢查的。



    posted on 2006-12-01 10:59 阿輝 閱讀(544) 評論(0)  編輯  收藏 所屬分類: 學習日志

    My Links

    Blog Stats

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲av无码乱码国产精品fc2| 亚洲午夜无码毛片av久久京东热| 2021精品国产品免费观看 | 亚洲av无码成h人动漫无遮挡| 30岁的女人韩剧免费观看| 亚洲欧美日韩一区二区三区在线| 亚洲精品无码永久在线观看| 一区二区三区四区免费视频| 亚洲狠狠色丁香婷婷综合| 亚洲精品无码久久久久| 我要看WWW免费看插插视频| 久久久久久久久久免免费精品 | 国产99视频精品免费视频76| 亚洲福利视频网站| 亚洲午夜国产片在线观看| 91精品全国免费观看含羞草| 免费一级毛片在线播放放视频| 337p日本欧洲亚洲大胆艺术| 亚洲成人国产精品| 在线观看无码AV网站永久免费| 久久av免费天堂小草播放| 亚洲中文字幕乱码一区| 亚洲第一成年男人的天堂| 亚洲成a人无码av波多野按摩| 波多野结衣在线免费观看| 中国性猛交xxxxx免费看| 亚洲人成人伊人成综合网无码| 亚洲成av人在线视| 国产三级免费观看| 国产精品69白浆在线观看免费| 免费看少妇高潮成人片| 国产精品亚洲二区在线| 亚洲av永久无码精品三区在线4| 九月丁香婷婷亚洲综合色| 亚洲精品久久久www| 日本二区免费一片黄2019| 波多野结衣免费在线观看| 久久香蕉国产线看免费| 美女无遮挡拍拍拍免费视频 | 亚洲经典在线观看| 国产成人精品日本亚洲网站|