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. Python + selenium之组织unittest单元测试用例

    当增加被测功能和相应的测试用例之后unittest单元测试框架如何扩展和组织新增的测试用例的. # coding =utf-8 # calculator class Count (): def __i ...

  2. 微信 Android版隐藏功能代码

  3. lastlog命令

    lastlog——检查某特定用户上次登录的时间 命令所在路径:/usr/bin/lastlog 示例1: # lastlog 列出所有用户,并显示用户最后一次登录的时间等信息 示例2: # lastl ...

  4. cluvfy stage命令用法

    1.获取集群验证工具cluvfy的帮助信息 grid@rac1:/home/grid>cluvfy -help USAGE: cluvfy [ -help ] cluvfy stage { -l ...

  5. 如何使用TensorFlow Hub和代码示例

    任何深度学习框架,为了获得成功,必须提供一系列最先进的模型,以及在流行和广泛接受的数据集上训练的权重,即与训练模型. TensorFlow现在已经提出了一个更好的框架,称为TensorFlow Hub ...

  6. 用python Image读图

    https://www.cnblogs.com/kongzhagen/p/6295925.html import os name = [] with open('/media/hdc/xing/Dee ...

  7. 剑指offer22 栈的压入、弹出序列

    写的一个代码,虽然正确通过了,但我觉得会报vector越界的错误 class Solution { public: bool IsPopOrder(vector<int> pushV,ve ...

  8. Google「Game Builder」:不懂编程,也能开发 3D 游戏

    简评: 之前微软曾推出过「Kodu Game Lab」,它可以让完全没有编程经验的人通过简单的步骤打造属于自己的游戏.无独有偶,Google 最近在 Steam 也推出了类似的程序「Game Buil ...

  9. Bootstrap历练实例:向列表组添加链接

    向列表组添加链接 通过使用锚标签代替列表项,我们可以向列表组添加链接.我们需要使用 <div> 代替 <ul> 元素.下面的实例演示了这点: <!DOCTYPE html ...

  10. Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

    package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...