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 724 G Xor-matic Number of the Graph 线性基+DFS

    G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...

  3. Java 守护线程(Daemon) 例子

    当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序.当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程 ...

  4. 【Python全栈-JavaScript】JavaScript-字符串详解

    JavaScript-字符串详解 预热:Number() 方法 <script> //重要等级 1,2,3,4,5 var s=10; //最高级别5 var s1=new Number( ...

  5. jqury点击返回顶部代码

    效果请看右下角:代码如下: <div class="totop"><img src="https://www.cnblogs.com/images/cn ...

  6. Eclipse:Win10中设置Courier New字体

    问题:在Eclipse中设置字体的时候,没有找到Courier New字体.系统为Win10. 解决:Eclipse使用的字体为系统字体.在系统字体中有一部分是隐藏的.Courier New已经在系统 ...

  7. 使用mfc CHtmlView内存泄露解决方法

    第一步,谷歌有文章说CHtmlView部分api使用BSTR没释放: 解决方法是重写一下接口: CString GetFullName() const; CString GetFullName() c ...

  8. 解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题

    打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 : library = cdll.Lo ...

  9. 【转】MFC 程序入口和执行流程

    一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用 ...

  10. Linux Ptrace 详解

    转 https://blog.csdn.net/u012417380/article/details/60470075 Linux Ptrace 详解 2017年03月05日 18:59:58 阅读数 ...