测试构造器它山之玉可以重构:身份证号(第四天)Strut2教程-java教程

文章结束给大家来个程序员笑话:[M]

    可以说,到了明天,我才真正能开始做我想要的重构/改良。之前,只是弥补测试,调整了一下结构。
是的,非常的迟缓,这居然被称为“捷敏”!? 你说奇异不奇异?
还好,种这节拍适合我种这大龄青年,适用就好,关它是风花还是雪月。

    

==》 测试覆盖

    上一次漏掉了最主要的异步,测试覆盖:

    4_1

    本以为会秀一个英俊的100%覆盖率的测试出来,人算不如天算,居然有一个方法是75%!

    

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

    4_2

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

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

    4_3

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

    4_4

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

    

==>优化改良:属性,态静设值和其他

    零零碎碎的改良,你可以如后面一样,基于一个一个测试向纵改,也可以全体改完在一起测试,没有太大关系,前者是格严的测试驱动。但是,我认为不需太学术化,关键是,你的务任够足小,能在明天实现,那就是适合。

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

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,

    4_5

    完整代码,是否是很清晰了?

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 予沁安 | 转载请注明作者和出处

文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
  最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值