必会重构技巧(三):提取接口
提取接口:当有多余一个类使用另外一个类中的方法时,可以考虑引入接口,解除这种依赖。
举例理解:比如说类A中有个方法为Call(Type T),类B和类C中都有方法都要调用Call这个方法,那么我们推荐引入一个接口,这样传参时可以直接new一个接口,可以解除调用方法和实现方法之间的耦合关系。面向接口编程也算是OO中比较重要的吧。
项目实例:一般而言在设计的时候,对于比较可能扩展的部分都会用接口或者是抽象方法来处理,对于接口,个人并不是很喜欢,因为接口写好了要修改就很困难,只能再加新的接口,这对设计的要求很高,抽象方法相对好用点。下面的代码扩展于原文的Demo Code,希望可以讲得稍微详细点。
先来看看原始的未经过重构的代码:
{
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;
}
}
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
registrationProcessor.ProcessRegistrationAdmin(new ClassRegistration());
}
protected void CreateUser_Click(object sender, EventArgs e)
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
registrationProcessor.ProcessRegistrationUser(new ClassRegistration());
}
{
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;
}
}
{
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;
}
}
}
转载于:https://www.cnblogs.com/flashbar/archive/2010/07/12/1775834.html
必会重构技巧(三):提取接口相关推荐
- 小酌重构系列[8]——提取接口
前言 世间唯一"不变"的是"变化"本身,这句话同样适用于软件设计和开发. 在软件系统中,模块(类.方法)应该依赖于抽象,而不应该依赖于实现. 当需求发生&quo ...
- 必会重构技巧:使用多态替换条件
使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象 举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型 ...
- IDEA代码重构技巧--抽取类和接口
IDEA代码重构技巧--目录页 1. 小声哔哔 重构和检视代码过程中,我们有时会碰到由于项目交接或者人员替换导致的代码腐化,比较常见的是类的职责不单一,此时比较好的重构技巧就是按照职责抽取函数或者类, ...
- 31 天重构学习笔记9. 提取接口
摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...
- 代码重构技巧宝典,学透本篇就足够了!
本文来源:http://n5d.net/ma76k 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演进过程中,代码不停地在堆砌.如果没有人为代码的质量负责,代码总是会往越来越混乱的方向 ...
- 为什么要代码重构?如何重构?常见重构技巧,值得收藏!
>>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...
- 常见代码重构技巧(非常实用)
点击关注公众号,Java干货及时送达 作者:VectorJin juejin.cn/post/6954378167947624484 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演 ...
- 设计原则与思想【面向对象、设计原则、编程规范、重构技巧】
一.高质量代码的评判标准: 可维护性:在不破化原有代码设计.不引入新的bug的情况下,能够快速的修改或者添加代码 可读性:我们需要看代码是否符合编码规范.命名是否达意.注释是否详尽.函数是否长短合适. ...
- IntelliJ IDEA 复杂的重构技巧(二)
本文作者:ice1000 原文链接:http://ice1000.org/2017/12/25/IDEARefactoring2/ 上次我说了一些 "复杂的重构技巧" ,讲的是一些 ...
最新文章
- 老板扣了我1000,因为我没记住阿里巴巴开发手册的这条规则。
- javascript---》arguments对象
- omwin密立根油滴实验数据处理程序_大物实验报告更新啦~
- 谈谈NullableT的类型转换问题
- uboot启动 及命令分析(3)
- phpcmsV9重装 - 踩坑篇
- 看懂Oracle执行计划(转载)
- 页面输出缓存[转载]
- kitti数据集_神秘的Waymo一反常态,CVPR现场发布大型自动驾驶数据集
- spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法
- 利用DllPlugin分割你的第三方库
- [C#] Microsoft .Net框架SerialPort类的用法与示例
- 使用js获取ajax对象,JS获取dom 对象 ajax操作 读写cookie函数
- 手机性能测试软件汇总,手机的各项性能测试
- Codeforces 1016C Vasya And The Mushrooms(动态规划)
- 据说是最健康的作息时间表
- 机器学习之密度聚类算法
- 推荐免费的svn空间
- Label 标签使用
- AI笔记: 数学基础之直线、圆和方程
热门文章
- GaussianBlur函数
- 聚类之K-means均值聚类
- 某些列满足特定条件,然后改变另外的某些列的值(Python)
- Keras函数式API
- 2.1.5 梯度检验
- mysql 修改时间段内_详解mysql数据库MyISAM存储引擎如何转为Innodb及其中的注意点...
- 解决socket粘包的两种low版模式 os.popen()和struct模块
- Android开发自定义View
- 017.Zabbix宏介绍
- centos6.8_64部署django项目