对立色彩空间

Martin Fowler在他的精彩的重构书中写道:“如果在多个地方看到相同的代码结构,那么,如果可以找到一种统一它们的方法,就可以确保程序会更好。” 然后,他描述了熟练的程序员如何使用提取和替换的双解剖刀切除重复的表达和转移的算法。

一连串的好建议几乎使人迷失了“结构”一词。 福勒似乎以一种不太正统的方式使用它。 Fowler所指的结构是一组元素及其之间的关系,当然表达了结构:构成元素的源代码行,顺序控制流,关系。 确实,在这种情况下(代码行)的多重性代表了最基本的复制形式,所有其他复制都建立在该复制形式上。 还有其他结构,更传统的结构,也反映了(也许是不完美的)基础文本基础。

更高层次的结构将方法建模为元素,将依赖项建模为关系。 在这种情况下,复制看起来像什么? 图1显示了缠满恶性疾病的程序的Spoiklin图 。

图1:结构重复的第一印象。

在图1中, a()调用了其他五个方法, e()f()g()h()i()b()c() 。 这种结构形式不能保留方法调用的顺序,因此图1只能暗示而不是重复-抽象在源代码上浮起时抽象就流失了它们的信息-但是,正如我们稍后将看到的,实用主义轻易地消除了这种情况。理论约束。

考虑到图1成功地标识了一个结构重复,即a()b()c()都完全容纳相同的方法调用序列。 该怎么办,结构解决方案应如何显示? 当然,该解决方案将三个序列一起粉碎为一个新方法d() ,然后调用原始的前三个方法,见图2。

图2:结构解决方案。

在这里,我们可以看到,即使不是相反的情况,至少也要消除它的代价: 深度 。 图1的传递依存关系长两个元素。 在图2中,它们都拉伸了三个元素。 因此,这种根除的风险有增加连锁React的风险,但是重复(软件设计中所有邪恶的根源)似乎值得付出代价。

这可能很简单。 有什么比这种减少重复更为明显的呢? 在这一点上,大多数软件界人士都很少同意。 Fowler将代码重复提升到他的书中最重要的代码味道。 肯特·贝克(Kent Beck)在他的《极限编程说明》中写道:“当系统要求您重复代码时,它便要求重构。” JB Rainsberger声称只有简单设计的两个要求 ,其中之一是“最小化重复”。

问题在于,复制最小化首先需要复制标识,而在这一任务上,就像性能优化一样,机器出色,而人类却没有。 几种现代设计过程都敦促程序员首先满足功能要求,并暂时推迟功能闪烁设计所必需的结构调整。 在这种推迟的重构过程中,这些程序员自然会将精力集中在新增加的逻辑上,因此当本地添加内容反映远程未研究的软件包中的现有代码时,可能不会注意到。

手动根除重复的这种努力徒劳无功,即使是最流行的程序发布后很久也很伤心。 对最近审阅的FitNesse的一个随意处理显示,它散布着许多相同或几乎相同的代码片段,大多数很小,但是却引人注目,例如触手可及的PageDriver.requestPageSaveWithContentsByUserAndPassword()和ResponseRequester.execute()如图所示。 3。

图3:FitNesse中的结构重复。

放大到更高的水平,图4展示了整个FitNesse程序的程序包图,其中黑色表示庆祝那些没有代码重复的程序包,而托管有重复代码的程序包则以红色表示,与所包含的重复次数成比例。

图4:FitNesse封装结构。

图4仅提供了方法级结构复制的摘要; 谁知道逐行代码分析器可能显示什么? 确实,问题已变得如此普遍,以至于某些程序员放弃了所有手动识别代码重复的尝试,而只依靠其不失败的源代码分析器来揭示问题。

当无脑的机械化彻底彻底消亡时,重复仍然需要如此令人恐惧的尊重,这并不奇怪吗?

摘要

上面的FitNesse的作者罗伯特·C·马丁(Robert C. Martin)出色,也许最雄辩地说 :“重复的代码是软件设计中万恶之源。 当一个系统中散布着许多相同或几乎相同代码的代码片段时,表明系统草率,粗心和纯粹的专业性。 所有软件开发人员应负有责无旁贷的责任,即在他们发现时消除并消除重复。”

发送无人机。

参考: 复制的对立面是什么? 从我们的JCG合作伙伴 Edmund Kirwan在有关软件的A博客上获得。 博客。

翻译自: https://www.javacodegeeks.com/2014/03/whats-the-opposite-of-duplication.html

对立色彩空间

对立色彩空间_复制的对立面是什么?相关推荐

  1. VBA小程序_遍历所有工作表_复制粘贴为数值

    Sub VBA小程序_遍历所有工作表_复制粘贴为数值()Dim sht As WorksheetFor Each sht In Worksheetssht.Activatesht.Cells.Copy ...

  2. 隐形字符复制_复制器的隐形传送翘曲驱动以及科幻小说实现的可能性更高

    隐形字符复制 Science fiction shaped all my ideas about human society as a child. From Star Trek to Asimov ...

  3. 快速复制快捷键_复制粘贴额效率之王Ctrl+D都不掌握,那就真的Out了

    在Excel中,如果要批量填充,大家会怎么做? 一般情况下,小编用到最多的就是快捷键Ctrl+Enter,其实还有一个批量填充的高效率快捷键就是Ctrl+D. 一.快捷键Ctrl+D:批量填充内容.目 ...

  4. mysql 默认当前时间_复制信息记录表|全方位认识 mysql 系统库

    在上一期<时区信息记录表|全方位认识 mysql 系统库>中,我们详细介绍了mysql系统库中的时区信息记录表,本期我们将为大家带来系列第七篇<复制信息记录表|全方位认识 mysql ...

  5. SSIS数据转换组件_复制转换、数据转换、行计数

    一 复制转换 复制列转换是一种很简单的转换机制.它主要是将一列或多列地数据复制一份.然后后续的工作可以对复制的列中的数据做任何操作.而不影响被复制列的数据.下面我们接着上一篇的条件性拆分的包来介绍如何 ...

  6. 缓冲流的效率测试_复制文件

    package com.learn.demo02.CopyFile;import java.io.FileInputStream; import java.io.FileOutputStream; i ...

  7. ext不能选中复制属性_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...

    复制文件时速度比较慢,从一个分区里剪切出数据再粘贴到另外一个分区里,有的时候会丢数据,有时复制文件的时候不知道己拷贝的文件数量但又不愿中断重新再来一遍等等一些因复制文件时产生的问题,相信应该有挺多人都 ...

  8. mysql 单表字段多少合适_复制信息记录表|全方位认识 mysql 系统库

    在上一期<时区信息记录表|全方位认识 mysql 系统库>中,我们详细介绍了mysql系统库中的时区信息记录表,本期我们将为大家带来系列第七篇<复制信息记录表|全方位认识 mysql ...

  9. java 队列复制_复制一个文件夹里的文件到另一个目录下 (使用队列的方法实现)...

    最近在由于准备实习,在学android,也会用到Java,所以想实现复制文件夹的功能,当然也参考了别人的代码.这里是我参考的网址:http://blog.csdn.net/etzmico/articl ...

最新文章

  1. mysql启动错误1067进程意外终止的解决方法
  2. 精通python-精通Python设计模式
  3. 谈谈 Tomcat 请求处理流程
  4. 一份来自一月寒冬互联网一线的面经(附面试题)
  5. python测试用例图_pytest以函数形式的测试用例
  6. [入门]理想的小白程序员成长曲线
  7. usb2.0/3.0/3.1/3.2/4 各版本速率
  8. java 文件目录_Java——文件及目录File操作
  9. SpringBoot整合RabbitMQ测试代码
  10. Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)
  11. Java 代码精简之道 | 凌云时刻
  12. c++ 求点到直线的距离
  13. 硬盘格式化怎么操作?
  14. Elasticsearch:使用 Debian 软件包安装 Elasticsearch
  15. 【bzoj1406】【AHOI2007】【密码箱】【数论】
  16. 支付宝小程序设置服务器维护,支付宝小程序配置
  17. 左宗棠:大清朝最后一棵顶梁柱
  18. vue的tap插件_vue移动端touch插件
  19. OllyICE 调试的程序无法处理异常 解决方法
  20. CSS设置高斯模糊效果

热门文章

  1. flex 居中并两端对齐
  2. 数据库对日期进行比较
  3. 抖音显示服务器升级要多久,抖音服务器升级要多久才能恢复正常
  4. thx是什么意思_THX是什么意思
  5. 微信小程序码的生成方式
  6. win10 10074版本qq显示问题
  7. spring的DI,IOP,AOC,Spring的简单介绍
  8. 特斯拉Powerwall网关可能受到黑客攻击
  9. AltiumDesigner 安装
  10. Java数组基础使用下标、遍历、存取与本质