• 测试构造器它山之玉可以重构:身份证号(第四天)


    文章结束给大家来个程序员笑话:[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 予沁安 | 转载请注明作者和出处

    文章结束给大家分享下程序员的一些笑话语录: 腾讯总舵主马化腾,有人曾经戏称如果在Z国选举总统,马化腾一定当选,因为只要QQ来一个弹窗”投马总,送Q币”即可。

  • 相关阅读:
    HTML DOM教程 9HTML DOM Window 对象
    HTML DOM教程 11HTML DOM Screen 对象
    Android项目中把bin文件夹里面的.apk文件删除,怎么让它再生成
    Qt把ping www.baidu.com之后的内容的内容输出到一个名为output的文档
    Qt之QProcess 和 c语言对比
    Git的Windows版本Msysgit的中文乱码解决
    多系统 grub之ubuntu的 grub
    QT中调用外部程序:QProcess的使用
    repo的小结
    恢复Ubuntu默认的面板
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3055417.html
Copyright © 2020-2023  润新知