提取接口:当有多余一个类使用另外一个类中的方法时,可以考虑引入接口,解除这种依赖。
举例理解:比如说类A中有个方法为Call(Type T),类B和类C中都有方法都要调用Call这个方法,那么我们推荐引入一个接口,这样传参时可以直接new一个接口,可以解除调用方法和实现方法之间的耦合关系。面向接口编程也算是OO中比较重要的吧。
项目实例:一般而言在设计的时候,对于比较可能扩展的部分都会用接口或者是抽象方法来处理,对于接口,个人并不是很喜欢,因为接口写好了要修改就很困难,只能再加新的接口,这对设计的要求很高,抽象方法相对好用点。下面的代码扩展于原文的Demo Code,希望可以讲得稍微详细点。

  提取接口:当有多余一个类使用另外一个类中的方法时,可以考虑引入接口,解除这种依赖。

  举例理解:比如说类A中有个方法为Call(Type T),类B和类C中都有方法都要调用Call这个方法,那么我们推荐引入一个接口,这样传参时可以直接new一个接口,可以解除调用方法和实现方法之间的耦合关系。面向接口编程也算是OO中比较重要的吧。

  项目实例:一般而言在设计的时候,对于比较可能扩展的部分都会用接口或者是抽象方法来处理,对于接口,个人并不是很喜欢,因为接口写好了要修改就很困难,只能再加新的接口,这对设计的要求很高,抽象方法相对好用点。下面的代码扩展于原文的Demo Code,希望可以讲得稍微详细点。

  先来看看原始的未经过重构的代码:

实现类

public class ClassRegistration
{
public void CreateAdmin()
{
// create registration code
}
public void CreateUser()
{
// create registration code
}

public decimal Total { get; private set; }
}
public class RegistrationProcessor
{
public decimal ProcessRegistrationAdmin(ClassRegistration registration)
{
registration.CreateAdmin();
return registration.Total;
}
public decimal ProcessRegistrationUser(ClassRegistration registration)
{
registration.CreateUser();
return registration.Total;
}
}

调用方法

protected void CreateAdmin_Click(object sender, EventArgs e)
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
registrationProcessor.ProcessRegistrationAdmin(new ClassRegistration());
}

protected void CreateUser_Click(object sender, EventArgs e)
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
registrationProcessor.ProcessRegistrationUser(new ClassRegistration());
}

上面的伪代码实现了创建Admin和User的主要类和主要实现方法及调用事件,这样的代码看似没问题,其实是非常不方便扩展的。请大家想想,如果我现在要添加一个创建Viewer用户的事件,需要改几个方法?我整理如下:
(1)在类ClassRegistration中增加一个CreateViewer()的方法;
(2)在类RegistrationProcessor中增加一个处理注册Viewer用户的方法ProcessRegistrationViewer();
(3)在CreateViewer的Button事件中添加代码;
如上,改的地方实在太多了,这里对于创建用户的这个方法完全可以抽象出来,把它作为一个接口方法处理,重构后的代码如下:
重构后的实现类

public interface IClassRegistration
{
void Create();
decimal Total { get; }
}
public class ClassRegistrationAdmin : IClassRegistration
{
public void Create()
{
// create registration code
}
public decimal Total { get; private set; }
}
public class ClassRegistrationUser : IClassRegistration
{
public void Create()
{
// create registration code
}
public decimal Total { get; private set; }
}
public class RegistrationProcessor
{
public decimal ProcessRegistration(IClassRegistration registration)
{
registration.Create();
return registration.Total;
}
}

重构后的调用方法

protected void Create_Click(object sender, EventArgs e)
{
var btn = sender as Button;
if (btn != null)
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
IClassRegistration registration;
switch (btn.CommandArgument)
{
case "CreateAdmin":
registration = new ClassRegistrationAdmin();
registrationProcessor.ProcessRegistration(registration);
break;
case "CreateUser":
registration = new ClassRegistrationUser();
registrationProcessor.ProcessRegistration(registration);
break;
}
}
}

如上,提取接口后,对于新类型用户的创建就方便多了,新建一个基于接口的创建新用户的类,然后在Button的事件中加个分支就好了。并且我们只需要实现接口中的方法Create()就OK了。
面向接口编程,能大大提高程序的可扩展性和可维护性,对于程序的模块化很有帮助,非常适合用于多模块,多团队合作的项目。

转载于:https://www.cnblogs.com/flashbar/archive/2010/07/12/1775834.html

必会重构技巧(三):提取接口相关推荐

  1. 小酌重构系列[8]——提取接口

    前言 世间唯一"不变"的是"变化"本身,这句话同样适用于软件设计和开发. 在软件系统中,模块(类.方法)应该依赖于抽象,而不应该依赖于实现. 当需求发生&quo ...

  2. 必会重构技巧:使用多态替换条件

    使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象 举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型 ...

  3. IDEA代码重构技巧--抽取类和接口

    IDEA代码重构技巧--目录页 1. 小声哔哔 重构和检视代码过程中,我们有时会碰到由于项目交接或者人员替换导致的代码腐化,比较常见的是类的职责不单一,此时比较好的重构技巧就是按照职责抽取函数或者类, ...

  4. 31 天重构学习笔记9. 提取接口

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

  5. 代码重构技巧宝典,学透本篇就足够了!

    本文来源:http://n5d.net/ma76k 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演进过程中,代码不停地在堆砌.如果没有人为代码的质量负责,代码总是会往越来越混乱的方向 ...

  6. 为什么要代码重构?如何重构?常见重构技巧,值得收藏!

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  7. 常见代码重构技巧(非常实用)

    点击关注公众号,Java干货及时送达  作者:VectorJin juejin.cn/post/6954378167947624484 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演 ...

  8. 设计原则与思想【面向对象、设计原则、编程规范、重构技巧】

    一.高质量代码的评判标准: 可维护性:在不破化原有代码设计.不引入新的bug的情况下,能够快速的修改或者添加代码 可读性:我们需要看代码是否符合编码规范.命名是否达意.注释是否详尽.函数是否长短合适. ...

  9. IntelliJ IDEA 复杂的重构技巧(二)

    本文作者:ice1000 原文链接:http://ice1000.org/2017/12/25/IDEARefactoring2/ 上次我说了一些 "复杂的重构技巧" ,讲的是一些 ...

最新文章

  1. 老板扣了我1000,因为我没记住阿里巴巴开发手册的这条规则。
  2. javascript---》arguments对象
  3. omwin密立根油滴实验数据处理程序_大物实验报告更新啦~
  4. 谈谈NullableT的类型转换问题
  5. uboot启动 及命令分析(3)
  6. phpcmsV9重装 - 踩坑篇
  7. 看懂Oracle执行计划(转载)
  8. 页面输出缓存[转载]
  9. kitti数据集_神秘的Waymo一反常态,CVPR现场发布大型自动驾驶数据集
  10. spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法
  11. 利用DllPlugin分割你的第三方库
  12. [C#] Microsoft .Net框架SerialPort类的用法与示例
  13. 使用js获取ajax对象,JS获取dom 对象 ajax操作 读写cookie函数
  14. 手机性能测试软件汇总,手机的各项性能测试
  15. Codeforces 1016C Vasya And The Mushrooms(动态规划)
  16. 据说是最健康的作息时间表
  17. 机器学习之密度聚类算法
  18. 推荐免费的svn空间
  19. Label 标签使用
  20. AI笔记: 数学基础之直线、圆和方程

热门文章

  1. GaussianBlur函数
  2. 聚类之K-means均值聚类
  3. 某些列满足特定条件,然后改变另外的某些列的值(Python)
  4. Keras函数式API
  5. 2.1.5 梯度检验
  6. mysql 修改时间段内_详解mysql数据库MyISAM存储引擎如何转为Innodb及其中的注意点...
  7. 解决socket粘包的两种low版模式 os.popen()和struct模块
  8. Android开发自定义View
  9. 017.Zabbix宏介绍
  10. centos6.8_64部署django项目