它山之玉能够重构:身份证号(第四天)

能够说,到了今天,我才真正能开始作我想要的重构/改进。以前,只是补充测试,调整了一下结构。
是的,很是的缓慢,这竟然被称为“敏捷”!? 你说奇怪不奇怪? 
还好,这种节奏适合我这种大龄青年,合用就好,关它是风花仍是雪月。

==》 测试覆盖

上一次漏掉了最重要的异步,测试覆盖: 正则表达式

本觉得会秀一个漂亮的100%覆盖率的测试出来,人算不如天算,竟然有一个方法是75%! 编程

(本文版权属于© 2012 - 2013 予沁安c#

恩,无效的生日没有测试。 异步

很简单,就增长一个测试而已,就不在这罗嗦了。直接贴覆盖率,显摆一下。 测试

再显摆一下代码质量参数: 优化

复杂度 最大的就是构造器了。可维护指标仍是不错的 76分。 spa

==>优化改进:属性,静态设值和其余

零零碎碎的改进,你能够如前面同样,基于一个一个测试纵向改,也能够所有改完在一块儿测试,没有太大关系,前者是严格的测试驱动。可是,我以为不需太学术化,关键是,你的任务足够小,能在今天完成,那就是合适。 code

1。 把全部的信息块改为属性方式,由于,一个是Java与C#的区别,第二,把原代码的缓冲生日的逻辑作到极致(极限编程?呵),一开始就缓冲(构造器中) blog

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。数据解析放在构造器中,而且独立成方法,只是在构造器中调用
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("身份证的出生日期无效");
            }
        }
3。从以前的代码分析参数,看到构造器复杂度过高,主要是几个验证。作一个改进,一个提出验证方法,二个去掉null, empty的验证,由于正则表达式已经包含了。
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,如今能够站起来,来杯咖啡,欣赏一下咱们的成果

可维护性提升到82,复杂度最高是validate() 3, ci

彻底代码,是否是很清晰了?
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; }
    }
}

(本文版权属于© 2012 - 2013 予沁安 | 转载请注明做者和出处

相关文章
相关标签/搜索