测试构造器它山之玉可以重构:身份证号(第四天)
文章结束给大家来个程序员笑话:[M]
可以说,到了明天,我才真正能开始做我想要的重构/改良。之前,只是弥补测试,调整了一下结构。
是的,非常的迟缓,这居然被称为“捷敏”!? 你说奇异不奇异?
还好,种这节拍适合我种这大龄青年,适用就好,关它是风花还是雪月。
==》 测试覆盖
上一次漏掉了最主要的异步,测试覆盖:
本以为会秀一个英俊的100%覆盖率的测试出来,人算不如天算,居然有一个方法是75%!
(本文权版属于© 2012 - 2013 予沁安)
恩,无效的日生没有测试。
很简单,就加增一个测试而已,就不在这罗嗦了。直接贴覆盖率,显摆一下。
再显摆一下代码量质参数:
杂复度 最大的就是构造器了。可护维标指还是不错的 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,
完整代码,是否是很清晰了?
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币”即可。
转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/02/3055417.html
测试构造器它山之玉可以重构:身份证号(第四天)相关推荐
- 代码整洁之道------它山之玉可以重构:身份证号码解析、验证工具(第一天)
首先感谢原作者的代码: < 面向对象的15位.18位中国大陆身份证号码解析.验证工具>. 如果有版权问题,敬请告知. 原代码给了我很好的起点,是的,这些代码都是玉,我在这只是再琢磨琢磨. ...
- python 身份证号的有效性、生日(阴历阳历)、星座、生肖、性别、年龄、户籍所在地测试
python 身份证号的有效性.生日(阴历阳历).星座.生肖.性别.年龄.户籍所在地测试 0x01 前言 0x02 身份证号码格式 0x03 地区 0x04 代码 0x05 效果 0x01 前言 本项 ...
- 手机模拟续航测试软件,3D模拟+1080p视频 中兴星星1号续航测试
在韩剧<来自星星的你>大热的时候,一颗来自国产的"星星"于韩国横空出世.中兴星星1号这款一经面世便号称最美的手机经过了我们一轮又一轮的测试,也向我们证明了它不仅拥有精致 ...
- 【它山之玉】慎重选择博士后(或博士生)导师-科学网马臻
在科学界,很多人(包括以前的我)认为只要做好科研,就能成功.很多导师不知是不懂或是愚民,对学生说只要你好好做科研,你就能得到你想要的东西.的确,没有good science,就可能没有good fut ...
- 【它山之玉】研究生回复审稿意见的门道---科学网马臻
[笔记] 还有的作者长篇大论地向审稿人解释,并把修改过的段落附上,但长篇解释和新增段落的内容几乎一样,这就没有必要了.逐条回复要务实.干脆利落,要不惊不乍,而不要让编辑觉得"问题很大&quo ...
- 【它山之玉】提高文章命中率的秘诀-科学网马臻
在网上经常看到这样的情况,有的研究生说自己的文章从高到低投了四次才中,还有的人投了七.八次才中的呢.要我说来,这全是胡搞.我以前的博士生导师发表30多篇Nature Materials.PNAS.JA ...
- 【它山之玉】写科研论文的高级方法学-科学网马臻
写科技论文,有基本功要求,主要是如何遣词造句,如何用标点符号,如何用缩略语等.关于这一方面的书有:The ACS Style Guide和The Elements of Style.可以说,这些都是科 ...
- 【它山之玉】关于年龄的焦虑的一些安慰
1. 这个世界不是线性的 一个典型的学生思维就是,这个世界是线性的.因为小学.初中.高中.大学全都是按部就班这么过来的,所以就会认为如果别人22岁毕业,那么我21岁毕业就会有无限大的优势,同理可证硕士 ...
- 【它山之玉】人生的自然法则-科学网马臻
最近在旧书摊上捡到一本Brain Tracy写的Eat that Frog: 21 Great Ways to Stop Procrastinating and Get More Done in Le ...
最新文章
- nodejs php web,nodejs实现的简单web服务器功能示例
- webhook简单部署
- 10万,买一辆自驾无忧的智能汽车
- 加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案
- pygame做的著名游戏_pygame教程(十):汉诺塔游戏
- 【项目管理】项目工作绩效域管理
- 如何使用代码区分service contract和service contract quotation
- 中小企业虚拟化解决方案-VMware vSphere 6.5-日常管理入口v0.0.1
- java员工编号程序_用JAVA编写一个employee类 为员工自动产生员工号
- python网络编程---TCP客户端
- java项目导入不了怎么办_Myeclipse导入项目无法部署或者丢失了.setting文件夹怎么办...
- C++:new[]和delete[]一定要配对使用吗?
- 【翻译】Ext JS——高效的编码风格指南
- hive explain 源码分析
- 百度网盘 不限速下载文件
- 博客整理——软件工程实践总结
- Initialization of variable was never used; consider replacing with assignment to ‘_’ or removing it
- 【CSDN竞赛第四期】编程赛后总结与分享
- python获取字典长度_Python中的字典
- 电子取证技术的三大方向
热门文章
- @PropertySource读取properties属性 中文乱码问题
- 字符串%百分号 和 format 格式化
- 彻底理解js中的和||
- proxychains 一个好用的终端用代理拦截器
- Sublime Text 全程指南
- 《Linux内核设计与实现》读书笔记(12)--- 内存管理(2)
- 024、JVM实战总结:动手实验:线上部署系统时,如何设置垃圾回收相关参数?
- 贝叶斯算法伪代码_字节跳动算法面经
- php mysql销售_计算用于销售应用程序的php / mysql中的损益(每日,每月和每年)...
- python socketserver模块详解_Python: SocketServer模块