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. jsp另外五大内置对象之response-操作cookie

    responseo3.jsp <%@ page language="java" contentType="text/html; charset=utf-8" ...

  2. Codeforces Round #319 (Div. 2) B Modulo Sum (dp,鸽巢)

    直接O(n*m)的dp也可以直接跑过. 因为上最多跑到m就终止了,因为前缀sum[i]取余数,i = 0,1,2,3...,m,有m+1个余数,m的余数只有m种必然有两个相同. #include< ...

  3. java基础—基础语法1

    一.标识符

  4. Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型

    任何类都是object类的子类 用object对象接收数组 object类的向上向下转型

  5. c++ 拷贝资源方法

    #include "stdio.h" #include "stdlib.h" #include <sys/types.h> #include < ...

  6. 如何在vue项目中引用Iview

    iview 安装 npm install iview --save 引入iview import Vue from 'vue' import App from './App' import route ...

  7. 【思维题 线段树】cf446C. DZY Loves Fibonacci Numbers

    我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...

  8. pandas中数据聚合【重点】

    数据聚合 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值. 数据分类处理: 分组:先把数据分为几组 用函数处理:为不同组的数据应用不同的函数以转换数据 合并:把不同组得到的结果合 ...

  9. Voyager如何使用Compass

    Compass由Resources,Commands,Logs三个部分组成 Resources包含了Links和Fonts: Commands可以执行php命令,比如创建model: 创建一个Down ...

  10. 让Web站点崩溃最常见的七大原因

    转载自: https://blog.csdn.net/u012981511/article/details/53503242 1. 磁盘已满 导致系统无法正常运行的最可能的原因是磁盘已满.一个好的网络 ...