重构第12天 分解依赖(Break Dependencies)
理解:“分解依赖” 是指对部分不满足我们要求的类和方法进行依赖分解,通过装饰器来达到我们需要的功能。
详解:今天我们所讲的这个重构方法对于单元测试是非常有用的。如果你要在你的代码中加入单元测试但有一部分代码是你不想测试的,那么你应用使用这个的重构。
这个例子中我们客户端使用了一个静态类来完成部分工作,但是问题就在于进行单元测试的时候,我们无法模拟静态类进行测试。为了使单元测试能够进行,我们用一个接口来包装这个静态类来完成静态类的依赖分解。
重构前代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ReflectorDemo
{
public class AnimalFeedingService
{ private bool FoodBowlEmpty { get; set; } public void Feed()
{
if (FoodBowlEmpty)
{
Feeder.ReplenishFood();
}
// more code to feed the animal
}
} public static class Feeder
{ public static void ReplenishFood()
{
// fill up bowl
}
}
}
我们添加一个接口和一个实现类,在实现类中调用静态类的方法,所以说具体做什么事情没有改变,改变的只是形式,但这样做的一个好处是增加了了代码的可测试性。在应用了分解依赖模式后,我们就可以在单元测试的时候mock一个IFeederService对象并通过AnimalFeedingService的构造函数传递给它。这样就可以完成我们需要的功能。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ReflectorDemo
{
public class AnimalFeedingService
{ public IFeederService FeederService { get; set; } private bool FoodBowlEmpty { get; set; } public AnimalFeedingService(IFeederService feederServices)
{
FeederService = feederServices;
} public void Feed()
{
if (FoodBowlEmpty)
{
FeederService.ReplenishFood();
}
// more code to feed the animal
}
} public static class Feeder
{ public static void ReplenishFood()
{
// fill up bowl
}
}
public interface IFeederService
{
void ReplenishFood();
} public class FeederService : IFeederService
{ public void ReplenishFood()
{ Feeder.ReplenishFood();
}
}
}
这样,我们在单元测试的时候就可以模拟(MOCK)一个IFeederService 接口的实例,通过AnimalFeedingService 的构造函数传进去。
这个重构在很多时候和设计模式中的一些思想类似,使用中间的装饰接口来分解两个类之间的依赖,对类进行装饰,然后使它满足我们所需要的功能。
重构第12天 分解依赖(Break Dependencies)的更多相关文章
- 重构第22天 分解方法(Break Method)
理解:如果一个功能,里面比较复杂,代码量比较多,我们就可以把这个功能分解成多个小的method,每个方法实现该功能的一个小小的部分,并且方法命名成容易理解,和方法内容相关的名称,更有助于维护和可读性提 ...
- dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...
- 重构改善既有代码设计--重构手法12:Extract Class (提炼类)
某个类做了应该由2个类做的事.建立一个新类,将相关的字段和函数从旧类搬移到新类. 动机:一个类应该是一个清楚地抽象,处理一些明确的责任.但是在实际工作中,类会不断成长扩展.你会在这儿加入一些功能,在哪 ...
- 重构第24天 分解复杂的判断(Remove Arrowhead Antipattern)
理解: 当你的代码中有很深的嵌套条件时,花括号就会在代码中形成一个长长的箭头.我们经常在不同的代码中看到这种情况,并且这种情况也会扰乱代码的可读性. 如下代码所示,HasAccess方法里面包含一些嵌 ...
- 重构第14天 分离职责(Break Responsibilities)
理解:面向对象的五大特征: SOLID,其中S就是职责单一原则.分离职责指当一个类有许多职责时,将部分职责分离到独立的类中,这样也符合面向对象的五大特征之一的单一职责原则,同时也可以使代码的结构更加清 ...
- C#重构经典全面汇总
C#重构经典全面汇总 1. 封装集合 概念:本文所讲的封装集合就是把集合进行封装,仅仅提供调用端须要的接口. 正文:在非常多时候,我们都不希望把一些不必要的操作暴露给调用端,仅仅须要给它所须要的操作 ...
- Gradle 1.12用户指南翻译——第五十章. 依赖管理
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...
- npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!
以前一直在纠结一个npm安装的包依赖管理的问题.是这样的: 我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,他们是:--save- ...
- 【Java重构系列】重构31式之封装集合
2009年,Sean Chambers在其博客中发表了31 Days of Refactoring: Useful refactoring techniques you have to know系列文 ...
随机推荐
- Git教程学习(五)
14. 解决冲突 14.1. 场景 当分支A和分支B在同一个文件上都有修改时会出现冲突.常见的情况是从master分支的基础上生成了新分支dev,然后在dev上进行了修改并add&commit ...
- linux red hat 安装svn
安装步骤如下: 1.yum install subversion 2.输入rpm -ql subversion查看安装位置,如下图: 我们知道svn在bin目录下生成了几个二进制文件. 输入 ...
- Flash Builder中“Error: #2036 加载未完成”错误的解决方法
复制了一个名称为A的widget包,重命名为B,包含B.mxml和B.xml(配置文件),编译后无法加载B包创建的widget,报错为: 解决办法: 1.在工程的根目录下找到.actionScript ...
- IOS 开发环境,证书和授权文件等详解
(转自:http://blog.csdn.net/gtncwy/article/details/8617788) 一.成员介绍1. Certification(证书)证书是对电脑开发资格的认证, ...
- mysql用shell建100多字段表并导入
excel列超过160多个,导入时报错,把excel第一行另存为逗号分隔的csv文件,用shell建表 vim createTable.sh #!/bin/sh str="CA6430M,H ...
- 旧文—冬日感怀
冬日感怀 下雪了,虽不大,可那雪花落在手上,融在心里,便泛起淡淡的温柔,因为这是冬日的馈赠啊,是上苍的礼物,是往昔记忆的灰烬化作天地间的精灵装点纷繁琐碎的世界.于是,透过汽车上雾气氤氲的玻璃窗,人 ...
- 读取并创建excel文件(.xls)
第三方库,附件 缺点:该库只支持.xls文件的操作 1.读取excel文件 例子: try { /** * 后续考虑问题,比如Excel里面的图片以及其他数据类型的读取 **/ InputStream ...
- 使用WebApi时Post和Put的区别
简单的说Post是添加,Put是修改 吃不准的话,尝试用相同参数访问二次接口,结果不同的是Post(会产生多条记录),结果相同的是Put(仅为一条记录),例如:写博客就是Post:更新签名就是Put
- (笔记)VC6插件安装--Unable to register this add-in because its DllRegisterServer returns an error
在安装插件(如VC6显示行号的插件VC6LineNumberAddin.dll)的时候经常会提示"Unable to register this add-in because its Dl ...
- saiku 展示优化第二步(要诀和技巧)
经历了上几篇博客的分享,可以无密码登录 : http://www.cnblogs.com/liqiu/p/5246015.html 随着使用的深入,公司需要将现有的报表平台与saiku整合,其中最便捷 ...