http://blog.csdn.net/wxr0323/article/details/7913950

Primitive Obsession(基本类型偏执)

偏执这个词实在是有点难懂。百度百科传送门

定义:Coding的时候总喜欢用基本类型,而不喜欢用对象。

影响:增加扩展和修改的复杂性。

来看两个函数。

Primitive:

  1. public void Method(string id, string name, string address)
  2. {
  3. //...
  4. }

Object:

  1. public void Method(object obj)
  2. {
  3. //obj.id.....
  4. //obj.name....
  5. //...
  6. }

随着需求日益变化,我们的参数会越来越多。那么使用基本类型的Method就会有很长的参数,演变成Long Parameter。Long Parameter会导致可读性差以及维护成本增加,直觉是这个方法职责太多。

Demo:媒婆、有Iphone4的小伙

小伙:

  1. class Boy
  2. {
  3. public string Name { get; set; }
  4. public string TelephoneNumber { get; set; }
  5. }

媒婆:

  1. class WomanMatchmaker
  2. {
  3. private readonly Boy boy;
  4. ...
  5. public string getBoyTelephoneNumberLastFourDigit()
  6. {
  7. const int digit = 4;
  8. var length = boy.TelephoneNumber.Length;
  9. return length > digit ? boy.TelephoneNumber.Substring(length - digit, length) : boy.TelephoneNumber;
  10. }
  11. }

媒婆需要小伙电话号码的后四位与姑娘电话号码后四位配对。配对成功后,问姑娘还有什么要求?

姑娘说只要用IPone4的小伙。无奈之下只好给小伙添加个属性。

  1. class Boy
  2. {
  3. public string Name { get; set; }
  4. public string TelephoneNumber { get; set; }
  5. public string TelePhoneType { get; set; }
  6. }

相应的还要给媒婆类添加一个方法:

  1. class WomanMatchmaker
  2. {
  3. private readonly Boy boy;
  4. public WomanMatchmaker(Boy boy)
  5. {
  6. this.boy = boy;
  7. }
  8. public string GetBoyTelephoneNumberLastFourDigit()
  9. {
  10. const int digit = 4;
  11. var length = boy.TelephoneNumber.Length;
  12. return length > digit ? boy.TelephoneNumber.Substring(length - digit, length) : boy.TelephoneNumber;
  13. }
  14. public string GetBoyTelephoneType()
  15. {
  16. return boy.TelePhoneType;
  17. }
  18. }

到此为止。如果姑娘还要问手机用的什么操作系统,那还要加属性加方法?另外这段代码有个很明显的BadSmell:Feature Envy。

重构:将基本类型替换为Object。 将所有关于手机的信息放在一起。

Extract Phone Class:

  1. class Phone
  2. {
  3. private const int DIGIT = 4;
  4. public string Number { get; set; }
  5. public string Category { get; set; }
  6. public string GetLastFourDigit()
  7. {
  8. var length = Number.Length;
  9. return length > DIGIT ? Number.Substring(length - DIGIT, length) : Number;
  10. }
  11. public string GetCategory()
  12. {
  13. return BuildCategory(Category);
  14. }
  15. }

小伙带个手机就行了:

  1. class Boy
  2. {
  3. public string Name { get; set; }
  4. public Phone phone { get; set; }
  5. }

媒婆也轻松了:

  1. class WomanMatchmaker
  2. {
  3. private readonly Boy boy;
  4. public R_WomanMatchmaker(Boy boy)
  5. {
  6. this.boy = boy;
  7. }
  8. public string getBoyTelephoneNumberLastFourDigit()
  9. {
  10. return boy.phone.GetLastFourDigit();
  11. }
  12. public string GetBoyTelephoneCategory()
  13. {
  14. return boy.phone.GetCategory();
  15. }
  16. }

姑娘问手机是哪个地方产的? 我们就在Phone中添加一属性,媒婆类里加一委托即可。

【转】[重构]Primitive Obsession的更多相关文章

  1. 代码的坏味道(3)——基本类型偏执(Primitive Obsession)

    坏味道--基本类型偏执(Primitive Obsession) 特征 使用基本类型而不是小对象来实现简单任务(例如货币.范围.电话号码字符串等). 使用常量编码信息(例如一个用于引用管理员权限的常量 ...

  2. 重构与模式(Refactoring to Patterns)-读书笔记

    第一章 ☛过度设计:是指代码的灵活性和复杂性超出所需. 第二章 ☛重构是一种保持行为的转换. 第三章 ☛每一个模式都是由三部分组成的规则,他表达的是某一环境,一个问题以及解决问题的方案之间的关系. ☛ ...

  3. C#重构之道

    定义 重构的定义:在不改变软件可观察行为的前提下,改善其内部结构. 其中,不改变软件行为,是重构最基本的要求.要想真正发挥威力,就必须做到“不需了解软件行为”. 如果一段代码能让你容易了解其行为,说明 ...

  4. 《重构——改善既有代码的设计》【PDF】下载

    <重构--改善既有代码的设计>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196358 编辑推荐 重构,一言以蔽之,就是在不改变外 ...

  5. 重构(Refactoring)技巧读书笔记(General Refactoring Tips)

    重构(Refactoring)技巧读书笔记 之一 General Refactoring Tips, Part 1 本文简要整理重构方法的读书笔记及个人在做Code Review过程中,对程序代码常用 ...

  6. 重构 改善既有代码的设计 (Martin Fowler 著)

    第1章 重构, 第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组 statement() 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 ...

  7. 重构与模式 (Joshua Kerievsky 著)

    第1章 本书的写作缘由 第2章 重构 第3章 模式 第4章 代码坏味 第5章 模式导向的重构目录 第6章 创建 第7章 简化 第8章 泛化 第9章 保护 第10章 聚集操作 第11章 实用重构 参考文 ...

  8. [转] Agile Software Development 敏捷软件开发

    原文作者:kkun 原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷是什么 ...

  9. 敏捷软件开发 Agile software Development(转)

    原文链接: http://www.cnblogs.com/kkun/archive/2011/07/06/2099253.html 敏捷软件开发 Agile software Development ...

随机推荐

  1. tsung基准测试方法、理解tsung.xml配置文件、tsung统计报告简介

    网上搜集的资料,资料来源于:http://blog.sina.com.cn/ishouke 1.tsung基准测试方法 https://pan.baidu.com/s/1Ne3FYo8XyelnJy8 ...

  2. Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)

    排序以后枚举尾部.尺取,头部单调,维护一下就好. 排序O(nlogn),枚举O(n) #include<bits/stdc++.h> using namespace std; typede ...

  3. 组件的通信 :provide / inject 对象进入后,就等于不用props,然后内部对象,直接复制可以接受数组,属性不能直接复制,可以用Object.assgin覆盖对象,或者Vue的set 双向绑定数据

    组件的通信 :provide / inject 对象进入后,就等于不用props,然后内部对象,直接复制可以接受数组,属性不能直接复制,可以用Object.assgin覆盖对象,或者Vue的set 双 ...

  4. 摘自 dd大牛的《背包九讲》

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...

  5. exportfs: /mnt/demo requires fsid= for NFS export

    解决方法:/mnt/demo 10.0.1.57(fsid=0,rw,async) //加入fsid=0参数就可.

  6. javaweb基础(4)_http协议

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  7. webgis技术在智慧城市综合治理网格化社会管理平台(综治平台)的应用

      网格化社会管理平台功能:1 实有人口管理人口数据管理按照人口分类进行管理,分为常住人口.流动人口.特殊人群.弱势群体,功能包括人口信息管理.归口负责.人房关联.统计汇总.地图监管服务等功能.人口信 ...

  8. cocos2d-x中的字符串操作

    1:循环体中字符串的构造.      通常用于多个有规律的文件的名字,诸如:[NSString stringWithFormat:@"filed.png",i].我们可以通过spr ...

  9. 66. Plus One@python

    Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...

  10. NOIP模拟赛 混合图

    [题目描述] Hzwer神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. Hzwer的国家有n个点,m条边,而作为国王,他十分喜欢游览自己的国家.他一般会从任意一个点出发,随便找边走,沿途欣赏 ...