首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有任何简单易懂/可靠的方法来简化代码?

是否有任何简单易懂/可靠的方法来简化代码?
EN

Software Engineering用户
提问于 2015-02-09 12:44:45
回答 8查看 9.5K关注 0票数 13

我的编码方式有问题。不管我事先写了多少计划,代码很快就会变得过于复杂。

阅读关于良好实践的书籍,并试图遵循它们的原则是行不通的。

除了在规划阶段更加彻底和专注之外,是否有可靠的审计代码的方法来简化它呢?

EN

回答 8

Software Engineering用户

回答已采纳

发布于 2015-02-09 22:55:39

确实有一些技术可以逐步简化代码,并通过这样做改进设计。一般的技术被称为“重构”。请注意,这个术语是非正式地使用的(意思是“在不改变代码功能的情况下改变代码的设计方式的任何东西”)和形式上(意思是“遵循特定的重构规则”)。我指的是后一种定义。

特别是,Martin对这个问题进行了大量的研究,他的著作"重构:改进现有代码的设计“是软件工程的经典书籍之一,值得一读。

这本书所建议的一般技巧是:

1)为您打算重构的代码部分编写非常详细的测试。

2)对代码做一个特定的小改动。例如,内联一个方法,重命名一个类,将一些代码提取到一个新的方法中,从一个现有的类中提取一个超类,等等(Fowler在他的书中列出了许多这样的小转换的详细列表,以及关于如何/何时进行这些转换的建议。现有的“自动重构”功能的大多数名称,如Eclipse、IntelliJ等,都是从他的书中使用的。本质上,这些类似于“设计模式”,但用于修改现有代码,而不是最初用于设计代码。)

3)重新运行你的测试,以验证你还没有破坏任何东西。

4)重复,直到你对结果满意为止。

因此,可以通过积累多个小的更改来对代码进行较大的更改,并在每个更改之间进行测试。

显然,如果您一开始就习惯于为代码编写和保留详细的测试(单元测试套件、回归测试套件等),那么上述过程将比在开始重构之前必须编写测试容易得多。而且,如果在每个更改之间重新运行的测试套件中的部分能够相当快地运行,那么这样做就容易多了。

请注意,以这种方式重构代码是一项纪律。这与简单地随意地改变代码是不一样的。在此过程中进行频繁的测试对于确保您对程序的行为所做的任何无意中的更改都能很快被捕捉到,而您仍然可以记住您做过的事情。因此,将重构与添加或更改程序行为的其他开发分开通常也是一个好主意,因为这些更改可能会使现有的测试无效。例如,您可以选择一个阶段:添加一个特性,然后稍微重构一下,然后添加另一个特性,然后再重构一些,然后修复一个bug,然后重构等等。

如果使用这些技术来简化代码的编程是一致的,那么随着时间的推移,代码的总体趋势将是逐渐变得更简单、更容易阅读,而不是相反(遗憾的是,这在行业中更为常见)。

您还可能会发现,围绕敏捷和/或XP软件开发方法的一些社区对于如何/何时/如何重构可能很有帮助,因为以这种方式进行持续重构被认为是许多此类方法所必需的特性。

我看到许多项目逐渐变得如此残酷和复杂,以至于没有人理解它们,它们最终不得不被抛弃,因为维护它们最终比重写它们花费更多的精力。重构是避免此问题的一种方法。

票数 20
EN

Software Engineering用户

发布于 2015-02-09 12:53:56

练习。

不,真的。

在你写完第一盘意大利面或大泥球之前,你永远不会完全欣赏一本书或博客文章中的一项技术,并意识到这些技术中的许多都是驯服复杂性的有效方法。然后你会在一个更深的层次上理解他们,远比那些只是把图案串在一起看上去酷,但并不完全理解背后的原因的货主更深。

看看这些图案。他们中的任何一个容易吗?好吧,他们肯定比写一盘意大利面或一大团泥巴简单得多,而且以后还要保持它。但你还是得研究一下这些模式。即使是最好的画家也使用不止一种画笔。

票数 47
EN

Software Engineering用户

发布于 2015-02-09 13:26:58

我唯一肯定的方法是:

第一次暗示代码变得复杂时,不要害怕重构计划。

(当然,这一点丝毫不否定你已经提到的关于在规划阶段更加彻底和专注的说法。)

票数 23
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/272669

复制
相关文章
[译] 为什么String在Java中是不可变的
String 在 Java 中是不可变的。 不可变类只是一个无法修改其实例的类。 创建实例时,将初始化实例中的所有信息,并且无法修改信息。 不可变类有许多优点。 本文总结了为什么 String 设计为不可变的。 这篇文章从内存,同步和数据结构的角度说明了不变性概念。
haifeiWu
2020/02/10
1.3K0
jsp中在href中传递参数
<% Configuration conf = new Configuration(); URI uri = new URI("hdfs://192.168.0.52:9010"); FileSystem fileSystem = FileSystem.get(uri, conf); //System.out.println("Hdfs directory is"+"\n"); Path src1 = new Path("hdfs://192.168.0.52:9
闵开慧
2018/03/30
4.7K0
什么是线程组,为什么在 Java 中不推荐使用?
线程组是使用 Java 线程进行管理和组织的一种模型。Java 中的线程组是一个 ThreadGroup 类对象,它充当了一个父容器,可以将同一类线程分成一组,并提供追踪这些线程状态、统计信息及管理这些线程的方法。在线程组中,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。
用户1289394
2023/08/22
3380
什么是线程组,为什么在 Java 中不推荐使用?
在 Vue 中,使用 $attrs 构建高级组件
这节课,我们来看下 Vue3 中的 $attrs 属性。首先,我们会介绍它的用途以及它的实现与 Vue2 有哪些不两同点,并通过事例来加深对它的理解。
前端小智@大迁世界
2022/10/27
2.5K0
在 Vue 中,使用 $attrs 构建高级组件
我是这样在 React 中实践 TDD 编程的
在Redux中编写测试听起来肯定有悖直觉。如果你使用了Redux,它可能看起来更加复杂。
前端修罗场
2022/07/29
2K0
在gradle中构建java项目
之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。
程序那些事
2021/02/20
1.8K0
在gradle中构建java项目
之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。
程序那些事
2021/02/25
1.3K0
在gradle中构建java项目
之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。
子润先生
2021/06/21
1.7K0
在 Gitlab 中构建 Docker 镜像
有了 Gitlab CI 的脚本能力,又有容器镜像仓库的支持,自然的一个想法就是,在 Gitlab 上构建容器镜像,并推送到镜像仓库之中。
崔秀龙
2019/07/22
2.3K0
在 Gitlab 中构建 Docker 镜像
为什么在静态方法中不能使用this
在JVM的运行时数据区中有个虚拟机栈(或Java栈),在它的里面是由栈帧'叠加'而成.栈帧由局部变量表,操作数栈,动态连接,方法返回地址等组成.
书唐瑞
2022/06/02
1.9K0
为什么在静态方法中不能使用this
我在ThoughtWorks中的敏捷实践
E项目是一个在线的物资跟踪监控系统。由ThoughtWorks团队为客户提供的一套完善的软件交付服务。
袁慎建@ThoughtWorks
2018/09/29
2.1K0
我在ThoughtWorks中的敏捷实践
python2中为什么在进行类定义时最好
Person类很明显能够看出区别,不继承object对象,只拥有了doc , module 和 自己定义的name变量, 也就是说这个类的命名空间只有三个对象可以操作. Animal类继承了object对象,拥有了好多可操作对象,这些都是类中的高级特性。
py3study
2020/01/09
1.2K0
我应该使用 PyCharm 在 Python 中编程吗?
Python 是一种广泛使用的编程语言,以其简单、多功能和庞大的开发人员社区而闻名。这个社区不断创建新的库和工具,以提高Python编程的效率和便利性。选择正确的环境来编写和调试 Python 代码可能具有挑战性,但 PyCharm 是一个很好的选择,从其他选项中脱颖而出。
很酷的站长
2023/02/20
4.7K0
我应该使用 PyCharm 在 Python 中编程吗?
在LR中动态拼接参数的问题
在很多时候系统是提供了多选并且组合提交的操作,这个时候请求就需要动态拼接了,这里举个参考的例子给大家,希望能够让大家明白怎么回事。
TestOps
2022/04/04
2K0
在LR中动态拼接参数的问题
在java中构建高效的结果缓存
缓存是现代应用服务器中非常常用的组件。除了第三方缓存以外,我们通常也需要在java中构建内部使用的缓存。那么怎么才能构建一个高效的缓存呢? 本文将会一步步的进行揭秘。
程序那些事
2020/07/08
1.5K0
在React中如何使用history.push传递参数
第一种和第三种,在目标路由刷新后,参数还可以取到,但是第二种页面刷新后,参数就取不到了,第二种适合开发winform类的应用。
挥刀北上
2021/12/19
21.5K0
在React中如何使用history.push传递参数
React 必学SSR框架——next.js
F首先我们就回顾一下,我们到底是怎么告别了使用 php/jsp 做服务器端渲染,进入前后端分离的客户端渲染时代,又为什么重新回到了服务端渲染。
狂奔滴小马
2021/11/15
7.7K0
React 必学SSR框架——next.js
如何使用ParamSpider在Web文档中搜索敏感参数
ParamSpider是一款功能强大的Web参数挖掘工具,广大研究人员可以利用ParamSpider来从Web文档的最深处挖掘出目标参数。
FB客服
2020/09/14
3.7K0
如何使用ParamSpider在Web文档中搜索敏感参数
我在使用 Go 过程中犯过的低级错误
循环迭代器变量是一个在每次循环迭代中采用不同值的单个变量。如果我们一直使用一个变量,可能会导致不可预知的行为。
用户5166556
2023/03/18
2.1K0
我在使用 Go 过程中犯过的低级错误
在Pytorch中构建流数据集
在处理监督机器学习任务时,最重要的东西是数据——而且是大量的数据。当面对少量数据时,特别是需要深度神经网络的任务时,该怎么办?如何创建一个快速高效的数据管道来生成更多的数据,从而在不花费数百美元在昂贵
deephub
2020/12/11
1.2K0
在Pytorch中构建流数据集

相似问题

getInitialProps在Next.js中是什么

19

getInitialProps在Next.js中的条件执行

12

getInitialProps在Next.js与TypeScript中的应用

61

在Next.js中重定向getInitialProps时出现无限循环

157

next.js - getInitialProps在组件中不起作用

239
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文