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

重复代码Duplicated Code

    臭味集合里面排第一的就是重复代码了。如果你在不止一处发现了同样结构的代码,你可以确定如果你找到一种方法来统一他们的话,你的程序将会改善。

    最简单的重复代码问题是当你在同一个类中有两个方法有相同的表达时出现的。那么你需要做的所有步骤只是提取方法然后在两处调用代码。

    另一种常见的重复问题是当你在两个兄弟类中有相同的表达。你可以通过在两个类中提取方法然后拉升方法(Pull up Method)来消灭重复。如果这段代码相似但不相同,你需要通过提取方法来分离相同和不同的部分。你可能会发现你可以使用构成模版方法(Form Template Method)。如果这些方法是在用不同的算法做同样的事情,你可以选择两种算法中比较清楚的那个然后替换算法。

        如果你的重复代码在两个不相关的类中,考虑在一个类中使用提取类,然后在另一个类中使用这个新部件。另一种可能是这个方法只属于其中一个类,并且要被其他类调用;或者方法属于另一个类需要参考原始类。你必须决定这个方法在哪更有意义,并且确认他只在那里不在其他任何地方。

 

长方法Long Method

    对象程序存在的最好最长的都是那些短方法组成的。新接触对象的程序员经常觉得对象程序是无尽的委托,没有一点计算发生。当你和这样的程序相处一些年份,你会学到小方法是多么的有价值。所有间接带来的好处——解释,分享,选择都被小方法支持。

    早在编程最初时期人们就意识到一段流程越长就越难被理解。老一些的语言对子程序的调用付出更多的代价,阻止了人们接触小方法。现代面对对象语言差不多消除了进程中的调用的代价。对于代码的读者仍然还有代价,就是如果要看子程序做了什么需要切换内容。开发环境允许同时看两个方法帮助消除了这个代价,但真正让理解小方法更容易的是好的命名。如果对一个方法你有好的名字,那么你就不需要看他的方法体了。

    网络效应即你应该在分解方法上更积极一些。一个我们遵循的启示是,当我们觉得需要注释的时候,我们写一个方法来取代之。这样的一个方法包含被注释过的代码,但被以代码的意图命名了,而不是代码怎样做命名。我们可能对几行代码这样做,也可能只针对一行。我们这样做即使我们调用的方法比他代替的代码还要长,但提供的方法名解释代码的意图。这里的关键不是方法的长度,而是方法做什么和怎么做之间的语义距离。

     百分之九十九的时候,简短方法你所需要做的全部就是提取方法。把方法中看起来很适合在一起的部分找到,然后作为一个新的方法。

    如果你有一个许多参数和临时变量的方法,这些元素碍了提取方法的事。如果你试图提取方法,你以传递那么多参数和临时变量作为提取方法的参数收尾,那么这个结果几乎不比原来的状况可读性更高。你常常可以通过用请求替代临时变量来消除临时变量。一长列参数可以被引入参数对象和保留整个对象(Preserve Whole Object)来精简。

    如果你尝试了并且你仍然有许多临时变量和参数,那么是时候使用重型火炮:用方法对象替代方法了。

    你怎么鉴别需要被提取的代码块呢?一个好的技巧是寻找注释。注释常常是这类语义距离的信号。一块带有注释的代码告诉你,这段代码做的事可以被基于这个注释命名的方法替代。即使是一行代码也值得提取,如果它需要解释。

    条件语句和循环也是提取的信号。用分解条件语句来处理条件语句表达。对待循环,提取循环和循环中的代码到他们自己的方法里去。

        

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程连接mysql速度慢的解决方法

PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的MYSQL开启了DNS的反向解析,在MY.INI(WINDOWS系统下)或MY.CNF(UNIX或LINUX系统下)文件的[mysqld]下加入skip-name-resolve这一句。连接mysql速度慢的解决方法.…

C#中的表达式和运算符

欢迎您成为我的读者,希望这篇文章能给你一些帮助。前言今天和大家一起学习下C#中的表达式和运算符,都是很基础的知识点。在日常的编码过程中,对于表达式和运算符我们每天都在使用。比如像下面的代码int age27;就是一种表达式。运算符是一个符…

【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别

bind() 简要描述 bind()向匹配元素添加一个或多个事件处理器。…

LeetCode之Two Sum II - Input array is sorted

1、题目 Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index…

php 怎么定义一个空对象,php定义空对象的方法

本文主要和大家分享php定义空对象的方法&#xff0c;有时候我们直接对不存在的数组直接定义其下标的值,不会报错,但是我们定义不存在的对象的时候,就会报错,这个时候我们定义一个空对象即可.有以下三种方法:<?php $obj1 new \stdClass;// Instantiate stdClass object$obj…

C#利用Socket实现客户端之间直接通信

2019独角兽企业重金招聘Python工程师标准>>> 实验功能&#xff1a; 设计程序&#xff0c;分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式&#xff0c;实现双方的数据的发送和接收&#xff08;S发给C&#xff0c…

如何在画面中摆放大量图片

2019独角兽企业重金招聘Python工程师标准>>> 有设计经验的一般都知道&#xff0c;版式设计需要对画面元素之间的关系有充分的认识&#xff0c;并能够在足够有限空间内合理布局&#xff0c;将图形与文字合理结合&#xff0c;下面就来给大家介绍下版式设计的方法。 如…

实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

/** ****************************************************************************** * file main.c * author iuc * version version 1.0 * date 2015-5-19 19:37:52 * brief 流水灯闪烁 ****************************************************************************** …

Android之解决360奇酷手机控制台打印全等级日志(默认只打印W、E等级日志)

1、问题 360奇酷手机很奇葩&#xff0c;默认安卓日志只打印等级W、E,现在我想打印所有等级日志 2、解决办法 1、在桌面点击拨号&#xff0c;在拨号盘输入“*20121220#”&#xff0c;进入工程模式; 2、点击“日志输出等级” 3、选择下面的选项 Log print enable 选 enable J…

php为什么在变量前加,php中变量前加、@等符号是什么意思?

如&#xff1a;$this->config &$config;如&#xff1a;if($_POST[add]){...}还有这个static function &instance() {static $object;if(empty($object)) {$object new self();}return $object;}分别都是什么意思和作用&#xff0c;请说明&#xff0c;感谢&#xf…

几个想法,有兴趣的可以深入下去

这些想法都是不成熟的想法&#xff0c;但是觉得会很有意思&#xff0c;先记于此&#xff0c;有兴趣的可以研究。 转载于:https://www.cnblogs.com/todoit/p/3793887.html

Windows获取CPU、内存和磁盘使用率脚本

获取CPU使用率脚本&#xff08;vbs&#xff09;&#xff0c;另存为cpu.vbs&#xff1a;On Error Resume Next Set objProc GetObject("winmgmts:\\.\root\cimv2:win32_processorcpu0") Wscript.Echo "CPU 使用率: " & objProc.LoadPercentage & …

ASP.NET Core 替换 Action 实际执行方法

RequestDelegate上次&#xff0c;我们在《如何判断当前请求的API类型》中查看endpoints.MapControllers()实现时&#xff0c;最终定位到ActionEndpointFactory.cs&#xff0c;其中有这样一段代码&#xff1a;private static RequestDelegate CreateRequestDelegate() {// We do…

最新版富文本编辑器UEditor操作教程

最近项目中使用到了富文本编辑器&#xff0c;选择的是百度的UEditor。所以对其进行了研究&#xff0c;发现最近发布了新版本&#xff0c;与以往的用法有的改变。一下对UEditotr 的是用做一下详细的介绍。 首先是UEditotr的下载&#xff0c;下载地址&#xff1a;http://ueditor.…

LeetCode之Construct the Rectangle

1、题目 For a web developer, it is very important to know how to design a web pages size. So, given a specific rectangular web page’s area, your job by now is to design a rectangular web page, whose length L and width W satisfy the following requirements:…

php ftp 创建文件夹失败,PHP使用FTP函数创建目录

这篇文章主要为大家详细介绍了PHP使用FTP函数创建目录&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。经测试代码如下&#xff1a;// create directory through FTP connectionfunction FtpMkdir($path, $newDir) {$serverftp.yourserver.com; // ftp 地址$conn…

Servlet请求转发中文乱码解决

2019独角兽企业重金招聘Python工程师标准>>> 在Servlet的使用过程中&#xff0c;如果在请求转发的同时需要获得输出流并且写出数据的时候&#xff0c;需要设定resp 的编码格式&#xff0c;否则的话&#xff0c;跳转之后的页面很可能会出现中文乱码的问题。 转载于:h…

NodeJs .net core connect Azure service bus

最近有个项目需要使用nodejs 使用语言是Typescript 发送消息给Azure service bus消息格式是XML.但是发送到queue中并不是xml格式,而是string.string格式的消息直到看到azure/service-bus sdk 接口的定义才发现.如果接收消息应用不是javascript sdk框架(因为使用是.net sdk框架接…

Angular 2 Decorators - 1

在我们深入了解 Angular 2 中 NgModule、Component、Injectable 等常见的装饰器之前&#xff0c;我们要先了解 TypeScript 中的装饰器。装饰器是一个非常酷的特性&#xff0c;最早出现在 Google 的 AtScript 中&#xff0c;它出现的目的是为了让开发者&#xff0c;开发出更容易…

LeetCode之Relative Ranks

1、题目 Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: "Gold Medal", "Silver Medal" and "Bronze Medal". Example 1: Input: [5, 4, 3, 2, 1] Out…