代码整洁之道------它山之玉能够重构:身份证号码解析、验证工具(第一天)

首先感谢原做者的代码: 《 面向对象的15位、18位中国大陆身份证号码解析、验证工具》. 若是有版权问题,敬请告知。

原代码给了我很好的起点,是的,这些代码都是玉,我在这只是再琢磨琢磨。
即便如此,重构的过程依然很繁琐,文章也许会很长,每一次的重构都须要把所有代码显示一遍。

知易行难, 重构是个动态过程, 不那么容易呈现出来,须要点耐心,慢慢看啊。
(本文版权属于© 2012 - 2013 予沁安

1 - 转化为C#代码,增长第一个测试

是的,这不是必须的,能够说是我本身的缘由,不会Java。可是,你也能够看做是一种重构的场景,不是吗? java

更改的代码就再也不放了,比较简单,与C#和Java的区别有关,留个链接 SocialID.cs。但是,个人测试代码却很重要。可能不少人会诟病个人测试框架(Machine.Specification)和代码风格。前者,我想之后会多介绍MSpec和BDD让你们根熟悉,后者,只能是但愿你们适应了。 git

==>写测试

第一个测试代码:当用正确的输入建立身份证时,应该可以获得正确的生日。

namespace Skight.eLiteWeb.Domain.Specs
{
    public class  when_create_social_id_with_proper_input
    {
        private Because of = () => subject = new SocialID("43010319801120753");

        private It should_get_birth_date_correctly =
            () => subject.getBirthDate().ShouldEqual(new DateTime(1980, 11, 20));
        private static SocialID subject;
    }
}

==>运行第一个测试,失败 :)

有意思的是,解决C#语法翻译以后,个人第一个测试就失败了。

==>重构

原来,看似相同的语法Substring,第二个参数却有不一样的含义。再经典不过的场景了,测试能够理顺这个过程。 程序员

private String getBirthDayPart() {
		return this.cardNumber.substring(6, 14);
	}
改成
private String getBirthDayPart()
{
return this.cardNumber.Substring(6, 8);
	}

==>再测试

==>第一个迭代结束,休息.

好了,阶段性的成果,一个测试/行为就能够标示为一个里程碑,今天就到这里了,你的支持,让我明天继续。 github

哦,少等. 最后一步,确实最重要的一步. 给咱们客户(这中状况下,个人客户是其余开发人员,是的,高级程序员的客户就是其余中级,初级程序员,换一下思想吧)的测试/功能报告,以下: c#

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

相关文章
相关标签/搜索