【转】[重构]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 ...
随机推荐
- jsp另外五大内置对象之response-操作cookie
responseo3.jsp <%@ page language="java" contentType="text/html; charset=utf-8" ...
- 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< ...
- java基础—基础语法1
一.标识符
- Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型
任何类都是object类的子类 用object对象接收数组 object类的向上向下转型
- c++ 拷贝资源方法
#include "stdio.h" #include "stdlib.h" #include <sys/types.h> #include < ...
- 如何在vue项目中引用Iview
iview 安装 npm install iview --save 引入iview import Vue from 'vue' import App from './App' import route ...
- 【思维题 线段树】cf446C. DZY Loves Fibonacci Numbers
我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...
- pandas中数据聚合【重点】
数据聚合 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值. 数据分类处理: 分组:先把数据分为几组 用函数处理:为不同组的数据应用不同的函数以转换数据 合并:把不同组得到的结果合 ...
- Voyager如何使用Compass
Compass由Resources,Commands,Logs三个部分组成 Resources包含了Links和Fonts: Commands可以执行php命令,比如创建model: 创建一个Down ...
- 让Web站点崩溃最常见的七大原因
转载自: https://blog.csdn.net/u012981511/article/details/53503242 1. 磁盘已满 导致系统无法正常运行的最可能的原因是磁盘已满.一个好的网络 ...