【转】[重构]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 ...
随机推荐
- tsung基准测试方法、理解tsung.xml配置文件、tsung统计报告简介
网上搜集的资料,资料来源于:http://blog.sina.com.cn/ishouke 1.tsung基准测试方法 https://pan.baidu.com/s/1Ne3FYo8XyelnJy8 ...
- Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)
排序以后枚举尾部.尺取,头部单调,维护一下就好. 排序O(nlogn),枚举O(n) #include<bits/stdc++.h> using namespace std; typede ...
- 组件的通信 :provide / inject 对象进入后,就等于不用props,然后内部对象,直接复制可以接受数组,属性不能直接复制,可以用Object.assgin覆盖对象,或者Vue的set 双向绑定数据
组件的通信 :provide / inject 对象进入后,就等于不用props,然后内部对象,直接复制可以接受数组,属性不能直接复制,可以用Object.assgin覆盖对象,或者Vue的set 双 ...
- 摘自 dd大牛的《背包九讲》
P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...
- exportfs: /mnt/demo requires fsid= for NFS export
解决方法:/mnt/demo 10.0.1.57(fsid=0,rw,async) //加入fsid=0参数就可.
- javaweb基础(4)_http协议
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- webgis技术在智慧城市综合治理网格化社会管理平台(综治平台)的应用
网格化社会管理平台功能:1 实有人口管理人口数据管理按照人口分类进行管理,分为常住人口.流动人口.特殊人群.弱势群体,功能包括人口信息管理.归口负责.人房关联.统计汇总.地图监管服务等功能.人口信 ...
- cocos2d-x中的字符串操作
1:循环体中字符串的构造. 通常用于多个有规律的文件的名字,诸如:[NSString stringWithFormat:@"filed.png",i].我们可以通过spr ...
- 66. Plus One@python
Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...
- NOIP模拟赛 混合图
[题目描述] Hzwer神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. Hzwer的国家有n个点,m条边,而作为国王,他十分喜欢游览自己的国家.他一般会从任意一个点出发,随便找边走,沿途欣赏 ...