前兩天的進度似乎有些慢,今天加快了一點, 不把每一步說的那麼詳細了.
繼性別和生日之後,最後乙個資訊塊,只是列出測試如下.
這是乙個比較大的問題. 前面,我臨時性的把不同地方的驗證去掉了. **原作者也過來, 暢敘了他關於驗證的看法. 他是對的, 這種完全驗證的方式,根本上說是 ddd的設計思想。不過,想我所說,我知識臨時性的去掉,保證測試的單元性。驗證的功能,由驗證的測試來驅動。而第二點考慮,我的驗證打算放在構造器中,也就是說,如果,有任何錯誤的輸入,連第一道門都進不來。
這裡,測試和實現都很簡單,看起來很多,只是一些羅列,不同的錯誤場景而已。
[c#]view plain
copy
[subject(
"身份證,有效性"
)]
public
class
when_create_social_id_with_valid_format
[subject("身份證,有效性"
)]
public
class
when_create_social_id_with_null_string
[subject("身份證,有效性"
)]
public
class
when_create_social_id_with_empty_string
[subject("身份證,有效性"
)]
public
class
when_create_social_id_with_2_length_string
[subject("身份證,有效性"
)]
public
class
when_create_social_id_with_20_length_string
[subject("身份證,有效性"
)]
public
class
when_create_social_id_alphet_length_string
實現[c#]view plain
copy
public
socialid(string cardnumber)
驗證碼是個特殊的有效性檢查,較為複雜,我這裡,把這部分邏輯**提煉出來成為乙個驗證器。
測試極其簡單,和實現幾乎原封不動。
測試:[c#]view plain
copy
public
class
when_verify_soical_number:specification
; private
it verify_code_should_match =
() => code.shouldequal('4'
);
private
static
char
code;
} 實現
[c#]view plain
copy
namespace
skight.eliteweb.domain.specs.properties
; /**
* 18位身份證中,各個數字的生成校驗碼時的權值
*/private
static
int verify_code_weight =
; private
static
intcard_number_length = 18;
public
char
verify(
string
source)
return
verify_code[sum%11];
} }
} 這時候,身份證構造器的完整實現就變成了
[c#]view plain
copy
public
socialid(string cardnumber)
至此,**已經很乾淨了。 是的,還有進一步的改進,如,3個元素(地區,生日,性別)的提煉應該移到構造器中,各個提取的功能就變成了,簡單的資料讀取。social 的型別,不是class而是struct,因為這是典型的value object。 另外,我把15轉18位的部分也去掉了,這可以看作乙個utilit,可以在外部做,不是核心功能。
最後,欣賞一下測試結果:
完整**:
身份證號碼驗證
說明 驗證身份證的有效性 引數 cid 身份證號碼 返回 地方 出生時間 性別 private string checkcidinfo string cid if cid.length 18 char c cid cid.length 1 bool last false if c 0 c 9 c a...
驗證身份證號碼
好久沒更新了,今天簽到啦。感覺這個驗證挺重要的,也挺常用的,所以分享給需要的朋友。驗證身份證號碼,在網上找到的好東東 function checkidcard idcard var idcard,y,jym var s,m var idcard array new array idcard arra...
驗證身份證號碼
var idcardnoutil powers 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 paritybit 1 0 x 9 8 7 6 5 4 3 2 genders checkaddresscode function addresscode test address...