它山之玉可以重構(gòu):身份證號4(第四天)
可以說,到了今天,我才真正能開始做我想要的重構(gòu)/改進(jìn)。之前,只是補充測試,調(diào)整了一下結(jié)構(gòu)。
是的,非常的緩慢,這居然被稱為“敏捷”!? 你說奇怪不奇怪?
還好,這種節(jié)奏適合我這種大齡青年,合用就好,關(guān)它是風(fēng)花還是雪月。
==》 測試覆蓋
上一次漏掉了最重要的異步,測試覆蓋:
本以為會秀一個漂亮的100%覆蓋率的測試出來,人算不如天算,居然有一個方法是75%!
(本文版權(quán)屬于? 2012 - 2013 予沁安)
恩,無效的生日沒有測試。
很簡單,就增加一個測試而已,就不在這羅嗦了。直接貼覆蓋率,顯擺一下。
再顯擺一下代碼質(zhì)量參數(shù):
復(fù)雜度 最大的就是構(gòu)造器了。可維護(hù)指標(biāo)還是不錯的 76分。
==>優(yōu)化改進(jìn):屬性,靜態(tài)設(shè)值和其他
零零碎碎的改進(jìn),你可以如前面一樣,基于一個一個測試縱向改,也可以全部改完在一起測試,沒有太大關(guān)系,前者是嚴(yán)格的測試驅(qū)動。但是,我覺得不需太學(xué)術(shù)化,關(guān)鍵是,你的任務(wù)足夠小,能在今天完成,那就是合適。
1。 把所有的信息塊改成屬性方式,因為,一個是Java與C#的區(qū)別,第二,把原代碼的緩沖生日的邏輯做到極致(極限編程?呵),一開始就緩沖(構(gòu)造器中)
public string CardNumber { get;private set; }
public string AddressCode { get; private set; }
public DateTime BirthDate { get; private set; }
public Gender Gender { get; private set; }
2。數(shù)據(jù)解析放在構(gòu)造器中,并且獨立成方法,只是在構(gòu)造器中調(diào)用
void extract()
{
AddressCode = CardNumber.Substring(0, 6);
Gender = ((int) CardNumber[CARD_NUMBER_LENGTH - 2])%2 == 0 ? Gender.Female : Gender.Male;
BirthDate = extract_birth_date();
}
日期足夠復(fù)雜,所以又獨立出方法
public DateTime extract_birth_date()
{
try
{
return DateTime.ParseExact(CardNumber.Substring(6, 8), BIRTH_DATE_FORMAT, null);
}
catch (Exception e)
{
throw new ApplicationException("身份證的出生日期無效");
}
}
3。從之前的代碼分析參數(shù),看到構(gòu)造器復(fù)雜度太高,主要是幾個驗證。做一個改進(jìn),一個提出驗證方法,二個去掉null, empty的驗證,因為正則表達(dá)式已經(jīng)包含了。
private void validate(string cardNumber)
{
if (!SOCIAL_NUMBER_PATTERN.IsMatch(cardNumber))
throw new ApplicationException("Card Number has wrong charactor(s).");
if (cardNumber[CARD_NUMBER_LENGTH - 1] != verifier.verify(cardNumber))
throw new ApplicationException("Card Number verified code is not match.");
}
public SocialID(String cardNumber)
{
validate(cardNumber);
CardNumber= cardNumber;
extract();
}
==》OK,現(xiàn)在可以站起來,來杯咖啡,欣賞一下我們的成果
可維護(hù)性提高到82,復(fù)雜度最高是validate() 3,
完全代碼,是不是很清晰了?
using System;
using System.Text.RegularExpressions;
namespace Skight.eLiteWeb.Domain
{
public enum Gender
{
Female,
Male
}
public class SocialID
{
private static Verifier verifier = new Verifier();
private static String BIRTH_DATE_FORMAT = "yyyyMMdd";
private static int CARD_NUMBER_LENGTH = 18;
private static Regex SOCIAL_NUMBER_PATTERN = new Regex(@"^[0-9]{17}[0-9X]$");
public SocialID(String cardNumber)
{
validate(cardNumber);
CardNumber= cardNumber;
extract();
}
private void validate(string cardNumber)
{
if (!SOCIAL_NUMBER_PATTERN.IsMatch(cardNumber))
throw new ApplicationException("Card Number has wrong charactor(s).");
if (cardNumber[CARD_NUMBER_LENGTH - 1] != verifier.verify(cardNumber))
throw new ApplicationException("Card Number verified code is not match.");
}
void extract()
{
AddressCode = CardNumber.Substring(0, 6);
Gender = ((int) CardNumber[CARD_NUMBER_LENGTH - 2])%2 == 0 ? Gender.Female : Gender.Male;
BirthDate = extract_birth_date();
}
public DateTime extract_birth_date()
{
try
{
return DateTime.ParseExact(CardNumber.Substring(6, 8), BIRTH_DATE_FORMAT, null);
}
catch (Exception e)
{
throw new ApplicationException("身份證的出生日期無效");
}
}
public string CardNumber { get;private set; }
public string AddressCode { get; private set; }
public DateTime BirthDate { get; private set; }
public Gender Gender { get; private set; }
}
}
皓月碧空,漫野如洗,行往卓越的路上






浙公網(wǎng)安備 33010602011771號