当前位置: 首页 > news >正文

代码的坏味道之五 ——译自《重构》

夸夸其谈未来性Speculative Generality

       Brian Foote 为一个我们都很敏感的味道建议的名字。你会遇到它当有人说“哦,我认为我们某一天会需要能力去做那一类的事”然后这样一来希望得到各种钓钩和特别的例子去处理并不需要的事情。结果往往是更难懂也难维护。如果所有的这些机制被用上,那这样做还是值得的。如果不是这样,也就不值得。这个机制就是这样产生的,所以处理掉它。

       如果你有抽象类并没有做很多事,用Collapse Hierarchy.不必要的委托可以用Inline Class去掉。如果函数的某些参数未被用上,实施Remove Parameter。如果函数名称带有多余的意味,使用Rename Method。当函数和类的唯一用户是测试用例,夸夸其谈未来性可以被当成斑点。如果找到这样的函数或方法,删除它和调用它的测试用例。如果你有一个方法或类是调用遗产功能的测试用例的辅助,你当然不得不把他留在那里。

 

临时字段Temporary Field

       有时你看到一个对象中的实例变量只在特定的情况下被设置。这种代码很难理解,因为你期待一个对象需要它所有的变量。试图理解为什么有一个变量但它并不被使用可以让你疯掉。

       用Extract Class来为这些可怜的孤儿变量创建一个家。把所有关系到这个变量的代码放到这个组件里。你可能也能够当变量无效的时候依靠Introduce Null Object来创建可替换组件消灭条件代码。

       一个普通情况出现临时字段是当一个复杂算法需要若干变量。因为实现代码的人不希望传入巨大的参数列表,于是他把他们放到字段里面。但字段只在算法中有效;在其他情况下他们只是普通的干扰项。在这种情况下你可以用对这些变量和需要他们的方法使用Extract Class。新的对象是一个方法对象。

 

消息链Message Chains

        当一个客户向一个对象要求另一个对象,这个客户又向那个对象要求另一个对象,又要求另一个对象,这样,你看到消息链。你可能看到这些以一个长串getThis方法或者一列临时变量。这种方式的导航意味着客户与导航结构耦合了。任何中间关系的改变导致客户不得不改变。

       在这里采取的行动是Hide Delegate。你可以在链中的多点这样做。原则上你可以对链中的每一个对象这样做,但这样做经常把每一个中间对象变成中间人。通常较好的替代是看结果对象被用来做什么。看能否使用Extract Method来取一部分代码然后Move Method来下压这个链。如果链中对象中其一的若干客户希望用这种方式导航剩下的,添加一个方法来这样做。

       有的人把任何消息链当作糟糕的事。我们知道因为我们的冷静,有理有据节制。至少在这种情况我们是。

转载于:https://www.cnblogs.com/browncrane/p/refactoring_5.html

相关文章:

  • 【转载】跨语言通信方案比较
  • 【WP 8.1开发】自定义(RAW)通知的使用
  • java 递归函数
  • jQuery Validation Engine 表单验证
  • GLES Shader Language 易错集锦
  • python的getopt
  • mac下mysql忘记root密码
  • 编程语言,变量
  • 关于git和github用法
  • Python学习(一)——数据类型
  • 定制微型Linux系统(续)
  • Redis进阶 ----事务
  • 【Spark亚太研究院-构建Spark集群-配置Hadoop伪分布模式并运行Wordcount(2)
  • 《设计模式系列》---组合模式
  • Exchange 2013sp1邮件系统部署-(九)
  • 「面试题」如何实现一个圣杯布局?
  • 【css3】浏览器内核及其兼容性
  • 〔开发系列〕一次关于小程序开发的深度总结
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • C++类中的特殊成员函数
  • canvas 高仿 Apple Watch 表盘
  • JavaScript服务器推送技术之 WebSocket
  • js中forEach回调同异步问题
  • mysql 数据库四种事务隔离级别
  • node学习系列之简单文件上传
  • php面试题 汇集2
  • Spring-boot 启动时碰到的错误
  • 服务器从安装到部署全过程(二)
  • 前端面试总结(at, md)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 正则表达式-基础知识Review
  • ​520就是要宠粉,你的心头书我买单
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $.ajax中的eval及dataType
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)STL算法之遍历容器
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)构建dubbo分布式平台-平台功能导图
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)Neo4j下载安装以及初次使用
  • (转)母版页和相对路径
  • (转)重识new
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .pop ----remove 删除
  • [ C++ ] STL---stack与queue
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [1127]图形打印 sdutOJ
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AAuto]给百宝箱增加娱乐功能
  • [android] 切换界面的通用处理