重构,体现一个工程师的基本素养和底蕴

重构小记(重构,改善既有代码的设计读后总结)

我们要时时刻刻保持一颗项目要重构的心。
在非技术出身的领导看来,能用的代码就是好代码,只关注功能。
在工程师看来,代码不仅要好用,更要好看,好理解,好修改。
重构就是让你的代码更时尚,更方便,更高效。

什么是重构

在不改变现有行为的前提下,通过改变内部结构,提高项目的可理解性和易修改性。
所以重构的目的就是使项目更容易理解和修改。

重构时机

代码复杂(复杂到不想改了或者改不动了)
时间允许(进度驱动转为质量驱动)
代码洁癖(容不得一点坏味道)
项目迁移(项目交接后迁移并重构)

重构常用快捷键(以idea为例)

shift + F6(一键修改变量名,变量名不规范常用)
ctrl + F6(一键修改类名或方法名,也是命名不规范修改常用)
ctrl + alt + m(将选中代码一键抽出成函数,过长函数常用)
ctrl + t(将选中代码提取至各种块中,比如if-else;try-catch等)

具体重构细节

重复代码

重构时应该把重复代码提炼出来,可以提炼到公共父类,或者静态函数等地方。

过长函数

重构时应该避免过长的函数,应该尽量的将大函数分解成多个小函数,并标明每个小函数的意思。

过大的类

一个类最好不要做太多事情,也不要有太多的代码,否则就会难以理解。

过长参数列

方法的入参如果超过5个,就试着将一些入参抽成一个对象,用对象来作为入参。

发散式变化

一个类中,如果每次修改都要设计到几个不同的函数,那么就要考虑将这个类拆分了。
针对某一外界变化的所有相应修改,都应该只发生在单一类中。

霰弹式修改

与发散式变化相反
当发现某种变化必须在多个不同类中做许多修改,就应该把这些所有需要修改的代码放入同一个类中。

依恋情节

将总是一起变化的东西放在一块

数据泥团

两个类中相同的字段,应该拥有他们自己的对象

平行继承体系

是霰弹式修改的特殊情况
每当你为某个类怎增加一个子类,也必须为另一个类相应增加一个子类,就该重构了
一般策略是:让一个继承体系的实例引用另一个继承体系的实例。

冗赘类

如果一个类的所得不值其身价,它就应该消失

夸夸其谈未来性

如果一个类其实没多大作用,只是想着以后会怎么样怎么样,就先把他去掉

令人迷惑的暂时字段

如果类中的某些实例变量仅为某种特殊情况而设,那么就需要把这些变量和其相关函数都提炼到一个独立类中。

中间人

如果某个类接口有一般的函数都委托给其他类,那么就是过度调用了。这时候应该去掉委托,直接调用。

亲昵关系

如果两个类过于亲密,有太多相互调用引用的地方,就必须拆散。
注意,继承往往会造成过度亲密,因为子类对父类的了解总是超过父类的主观愿望,这时候就应该用委托代替继承
详细做法就是去掉原继承,将原父类当成子类的一个属性,用到父类的方法时去委托调用就行。

不完美的库类

当引用的库不能满足我们的需求,需要扩展库类的功能时,考虑引入本地扩展(创建子类继承原库中的父类或者父类委托)

被拒绝的馈赠

如果子类不需要继承父类的所有函数和数据,这就意味着继承体系的错误。这时应该去掉继承关系,用父类委托来代替(原父类作为原子类的一个属性)

过多的注释

注释应该是简单明了,而不是为难懂的代码擦屁股,解决这类问题,还需要从代码提炼等方面做起,增加代码的可读性。

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

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

相关文章

应用内购买(IAP)各类型在服务端的验证规则

一、非消耗品(比如单本杂志购买,苹果服务器支持恢复) 1.先验证服务器有没有购买记录,如果有,则不处理,此次操作成功 ;2.如果服务器没有购买记录,则到苹果服务器验证(1)首先到正式验证地址验证收据,如果返回…

@Transactional事务生效条件与样例

Transactional事务生效条件 Transactional注释的方法,不能是private修饰 Transactional注释的方法,必须是有接口的方法实现(通用的Spring面向接口编程的套路) Transactional注释的方法,必须要通过接口的方式调用&…

利用.dSYM和.app文件准确定位Crash位置

当发布到iPhone上的应用程序Crash之后,iPhone会自动生成一个Crash Log(*.crash),这个文件包含了一些有用的调试信息,但对于堆栈,它只记录的函数地址,而无法显示函数名。函数名保存在一个叫dSYM的…

使用maven的profile区分本地环境和线上环境

使用maven的profile区分本地环境和线上环境 多环境开发,使用maven-profile,就可以在打包的时候通过参数的调整,最终打的包也不同。 以区分本地数据库和线上数据库为例 比如测试环境,用的是本地测试数据库;生产环境用…

查看函数库.a函数符号信息

一、概述 nm命令可以列出一个函数库文件中的符号表。它对于静态的函数库和共享的函数库都起作用。对于一个给定的函数库,nm命令可以列出函数库中定义的所有符号,包括每个符号的值和类型。还可以给出在原程序中这个函数(符号)是在多…

重构,体现一个工程师的基本素养和底蕴(细节篇)

重构小记(重构,改善既有代码的设计读后总结) 方法级别 提炼函数: 将一个大方法,拆成多个小方法,难点在于小方法的命名。 假如有早上上学的一个大方法, 那么就应该在里面有起床,穿衣…

MVPVM模式介绍

一、概述MVPVM即:Model-View-Presenter-ViewModel。此模式是MVVM和MVP模式的结合体。但是交互模式发生了比较大的变化。MVVM参考本博客文章:iOS-MVVM-模式介绍MVP参考本博客文章:MVP模式介绍 二、原理:Presenter同时持有View、Mod…

[线程池] ------ 形象的描述线程池,用一个特好记的例子来记忆

线程池 为了减少线程频繁的创建和销毁过程,引入池的概念。 将一些线程先创建好放在线程池中,每次来任务就用池中的线程执行,空闲时池中线程就等待,但不销毁。 原始线程池的创建: ThreadPoolExecutor executor1 new …

分组密码的工作模式

一、理论基础1.概述密码学中,块密码的工作模式允许使用同一个块密码密钥对多于一块的数据进行加密,并保证其安全性。块密码自身只能加密长度等于密码块长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通…

数据仓库基本认知

数据仓库概念: 数据仓库,英文名称Data Warehouse,简写为DW。 是一种面向分析的存储系统。 他是一个很大的数据存储集合,出于企业的分析性报告和决策支持目的而创建,对多样的业务数据进行筛选与整合。 它为企业提供一…

PBOC3.0中使用的国密SM2算法

一、知识准备 PBOC3.0规范就是《中国金融集成电路(IC)卡规范》3.0版本。SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法。本身是基于ECC椭圆曲线算法的,所以要讲SM2, 先要弄懂ECC。 完全理解ECC算法需要一定的数学功底…

mapper注入失败,NoSuchBeanDefinitionException: No qualifying bean of type [com.xxx.XxxMapper] found for d

mapper注入失败: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xxx.XxxMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependen…

战地体能训练模拟器

一、名称:战地体能训练模拟器二、整体介绍: 1.体验者身处一个封闭空间的正中央,空间内部表面全部附着显示器,包含地板(因为地板是平的,可以使用投影的方式实现),经过视角上的设计,体验者就像身处…

java读文件写文件

使用了try-with-resource语法(JDK1.7及以上),代码更加便捷 Junit测试样例,先写入文件,再读出来: RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations "classpath:spring-conf…

Markdown入门

Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为…

bean注入失败的几种情况和解决思路:NoSuchBeanDefinitionException: No qualifying bean of type

bean注入失败,无非是两种情况,要么注入的写法出错,要么被注入的Bean未定义。 1.Bean未定义 如果是直接在XML中配置bean标签的时候 检查id和class是否写对 如果是用注解形式申明Bean 先检查Controller、Service、Repository、 Component …

通过AVFoundation框架获取摄像头数据

一、概述 从iOS4开始,AVFoundation框架增加了几个类,AVCaptureDevice、AVCaptureSession等,可以获取摄像头的数据,而不会弹出类似于ImagePicker一样的界面,我们可以将数据转为一张张的图片,然后我们可以即时…

mysql数据库支持emoji表情的详解

mysql存储emoji表情的时候,就会报错,如下: Error updating database. Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8A\xF0\x9F…’ for column ‘这是我表中的字段’ at row 1 初步定位是我的数据库是utf8编码…

CoreText使用介绍

一、概述 1.CoreText是苹果创建的一个用于文字排版的框架,可以实现文字排版、图文混排等复杂的界面效果。从iOS3.2启用。2.一个开源工具类-OHAttributedLabel,就是使用CoreText框架实现的,能够实现一个Label中有不同的文字大小、文字颜色、字…

编程规范:长函数的思考

在工作,我们应该都不想看到非常的长函数。对于一个运行5年左右的项目,极有可能出现这种情况。由于长函数的长、if/else嵌套,导致代码的可读性非常差,这对于项目的维护和开发带来了极大的困难。所以我们应该避免写长函数&#xff0…