【转】[重构]Primitive Obsession
http://blog.csdn.net/wxr0323/article/details/7913950
Primitive Obsession(基本类型偏执)
偏执这个词实在是有点难懂。百度百科传送门
定义:Coding的时候总喜欢用基本类型,而不喜欢用对象。
影响:增加扩展和修改的复杂性。
来看两个函数。
Primitive:
- public void Method(string id, string name, string address)
- {
- //...
- }
Object:
- public void Method(object obj)
- {
- //obj.id.....
- //obj.name....
- //...
- }
随着需求日益变化,我们的参数会越来越多。那么使用基本类型的Method就会有很长的参数,演变成Long Parameter。Long Parameter会导致可读性差以及维护成本增加,直觉是这个方法职责太多。
Demo:媒婆、有Iphone4的小伙
小伙:
- class Boy
- {
- public string Name { get; set; }
- public string TelephoneNumber { get; set; }
- }
媒婆:
- class WomanMatchmaker
- {
- private readonly Boy boy;
- ...
- public string getBoyTelephoneNumberLastFourDigit()
- {
- const int digit = 4;
- var length = boy.TelephoneNumber.Length;
- return length > digit ? boy.TelephoneNumber.Substring(length - digit, length) : boy.TelephoneNumber;
- }
- }
媒婆需要小伙电话号码的后四位与姑娘电话号码后四位配对。配对成功后,问姑娘还有什么要求?
姑娘说只要用IPone4的小伙。无奈之下只好给小伙添加个属性。
- class Boy
- {
- public string Name { get; set; }
- public string TelephoneNumber { get; set; }
- public string TelePhoneType { get; set; }
- }
相应的还要给媒婆类添加一个方法:
- class WomanMatchmaker
- {
- private readonly Boy boy;
- public WomanMatchmaker(Boy boy)
- {
- this.boy = boy;
- }
- public string GetBoyTelephoneNumberLastFourDigit()
- {
- const int digit = 4;
- var length = boy.TelephoneNumber.Length;
- return length > digit ? boy.TelephoneNumber.Substring(length - digit, length) : boy.TelephoneNumber;
- }
- public string GetBoyTelephoneType()
- {
- return boy.TelePhoneType;
- }
- }
到此为止。如果姑娘还要问手机用的什么操作系统,那还要加属性加方法?另外这段代码有个很明显的BadSmell:Feature Envy。
重构:将基本类型替换为Object。 将所有关于手机的信息放在一起。
Extract Phone Class:
- class Phone
- {
- private const int DIGIT = 4;
- public string Number { get; set; }
- public string Category { get; set; }
- public string GetLastFourDigit()
- {
- var length = Number.Length;
- return length > DIGIT ? Number.Substring(length - DIGIT, length) : Number;
- }
- public string GetCategory()
- {
- return BuildCategory(Category);
- }
- }
小伙带个手机就行了:
- class Boy
- {
- public string Name { get; set; }
- public Phone phone { get; set; }
- }
媒婆也轻松了:
- class WomanMatchmaker
- {
- private readonly Boy boy;
- public R_WomanMatchmaker(Boy boy)
- {
- this.boy = boy;
- }
- public string getBoyTelephoneNumberLastFourDigit()
- {
- return boy.phone.GetLastFourDigit();
- }
- public string GetBoyTelephoneCategory()
- {
- return boy.phone.GetCategory();
- }
- }
姑娘问手机是哪个地方产的? 我们就在Phone中添加一属性,媒婆类里加一委托即可。
【转】[重构]Primitive Obsession的更多相关文章
- 代码的坏味道(3)——基本类型偏执(Primitive Obsession)
坏味道--基本类型偏执(Primitive Obsession) 特征 使用基本类型而不是小对象来实现简单任务(例如货币.范围.电话号码字符串等). 使用常量编码信息(例如一个用于引用管理员权限的常量 ...
- 重构与模式(Refactoring to Patterns)-读书笔记
第一章 ☛过度设计:是指代码的灵活性和复杂性超出所需. 第二章 ☛重构是一种保持行为的转换. 第三章 ☛每一个模式都是由三部分组成的规则,他表达的是某一环境,一个问题以及解决问题的方案之间的关系. ☛ ...
- C#重构之道
定义 重构的定义:在不改变软件可观察行为的前提下,改善其内部结构. 其中,不改变软件行为,是重构最基本的要求.要想真正发挥威力,就必须做到“不需了解软件行为”. 如果一段代码能让你容易了解其行为,说明 ...
- 《重构——改善既有代码的设计》【PDF】下载
<重构--改善既有代码的设计>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196358 编辑推荐 重构,一言以蔽之,就是在不改变外 ...
- 重构(Refactoring)技巧读书笔记(General Refactoring Tips)
重构(Refactoring)技巧读书笔记 之一 General Refactoring Tips, Part 1 本文简要整理重构方法的读书笔记及个人在做Code Review过程中,对程序代码常用 ...
- 重构 改善既有代码的设计 (Martin Fowler 著)
第1章 重构, 第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组 statement() 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 ...
- 重构与模式 (Joshua Kerievsky 著)
第1章 本书的写作缘由 第2章 重构 第3章 模式 第4章 代码坏味 第5章 模式导向的重构目录 第6章 创建 第7章 简化 第8章 泛化 第9章 保护 第10章 聚集操作 第11章 实用重构 参考文 ...
- [转] Agile Software Development 敏捷软件开发
原文作者:kkun 原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷是什么 ...
- 敏捷软件开发 Agile software Development(转)
原文链接: http://www.cnblogs.com/kkun/archive/2011/07/06/2099253.html 敏捷软件开发 Agile software Development ...
随机推荐
- 到底什么样的ABAP系统能运行Fiori应用
有朋友在微信上问我两个问题: S/4 fiori是标配吗? 如果是ERP R/3,可以激活fiori配置吗? 先回答第二个问题. 在Jerry的微信公众号文章SAP Fiori应用的三种部署方式曾经提 ...
- processing制作动态山水背景
效果代码 float theta, step; int num=5, frames = 1200; Layer[] layers = new Layer[num]; // void setup() { ...
- 关于"动态语言" "静态语言" "静态类型语言" "动态类型语言"的区别
参考链接:关于“编译型”“解释型”“动态语言”“静态语言”“动态类型语言”“静态类型语言”的区分以及优缺点(汇总整理) 很多人把这两类混为一谈,但是这是完全不同的两个概念!!! 动态和静态语言主要看的 ...
- 1_HDFS理论及安装部署
一.hadoop简介 1.hadoop的初衷是为了解决Nutch的海量数据爬取和存储的需要,HDFS来源于google的GFS,MapReduce来源于Google的MapReduce,HBase来源 ...
- 微信iOS多设备多字体适配方案总结
一.背景 2014下半年,微信iOS版先后适配iPad, iPhone6/6plus.随着这些大屏设备的登场,部分用户觉得微信的字体太小,但也有很多用户不喜欢太大的字体.为了满足不同用户的需求,我们做 ...
- django logging日志优先级
原创博文 转载请注明出处! 参考官方文档:https://docs.djangoproject.com/en/2.1/topics/logging/ Loggers¶ A logger is the ...
- d3网址
官网: http://d3js.com D3创始人 http://bost.ocks.org.mike 教程: http://www.dashingd3js.com/table-of-contents ...
- Element-ui tree组件自定义节点使用方法
工作上使用到element-ui tree 组件,主要功能是要实现节点拖拽和置顶,通过自定义内容方法(render-content)渲染树代码如下~ <template> <di ...
- [BZOJ] 1127: [POI2008]KUP
似曾相识的感觉 考虑另一个判断问题,给定一个k,问这个k是否可行 存在矩形和\(sum>2k\),则该矩阵不对判定做出贡献 存在矩形和\(sum\in [k,2k]\),则我们找到了一个解 于是 ...
- Vim编辑器基础
Vim编辑器基础 vi:Visual Interface vim:VI iMproved Vim模式 1.编辑模式(命令模式) 只能下达命令,不能键入字符 2.输入模式 键入字符 3.末行模式 左下角 ...