代码的异味

代码的异味

一.duplicated  code

当相同或者相似的程序结构出现在一个以上的地方的时候,这段代码就需要合而为一,提炼出一个方法共调用。

分为3种情况,

1.同一个类的两个函数含有相同的表达式。

处理方式:使用extract method提炼出这重复代码,然后在这两个地方调用这个函数。

2.互为兄弟的两个子类含有相同的表达式

处理方式:对这两个类extract method提炼出重复代码到一个函数,然后采用pull up method推入他们的超类中。

3.两个无关的类中出现dulicated code。

处理方式:采用extract method提炼出重复代码,并将重复代码放到一个合适的类中(可以是单独的一个独立的类,也可以是这两个类中的一个。这个根据设计中职责划分的原则选择),然后在原来出现的地方调用这个方法。

 

二.long method

小型函数的有点:自解释能力,共享能力,选择能力(使用多态特性封装条件逻辑)。

 

为避免logn mehtod我们应该积极的分解函数,分解的过程中应遵循一个原则:每当感觉需要以注释来说明一段代码做什么事情的时候,就应该把这段代码封装到一个函数同,并以其用途或者功能(也就是注释的内容)来为其命名。

处理方式:使用extract method提炼函数。

 

提炼函数的过程中可能需要将大量的参数和临时变量当作新函数的参数传递过来使用,这会引起提炼出的函数参数过长。一般遇到这个问题可以使用replace temp with query来消除这些临时变量,采用instroduce parameter object 和 preserve whole object则可以将过长的参数列表变得简洁。

 

如果经过上述的处理后仍然有太多临时变量和参数,我们就可以使用repace method with method object。

 

三.large class

 

 

 

 

### 经典代码异味案例 #### 重复代码 在一个大型Java项目中,如果存在多个位置上的相似逻辑而未将其抽象化,则形成了重复代码。例如,在不同类的不同方法中有如下片段: ```java public void processOrder(Order order) { if (order != null && !order.isCancelled()) { // 处理订单的具体业务逻辑... } } ``` 这段检查`null`以及取消状态的判断可能散布于整个应用程序之中[^1]。 #### 过长函数 当一个函数承担过多职责时就会变得难以理解维护。比如下面这个假设的例子展示了如何把多种操作塞入单一函数内: ```java public void manageUser(User user, String actionType) { switch(actionType){ case "create": validateNewUserData(user); saveToDatabase(user); sendWelcomeEmail(); break; case "update": checkIfUserExists(user.id()); updateInDatabase(user); notifyChanges(); break; default: throw new UnsupportedOperationException("Action not supported"); } } ``` 此函数负责创建、更新用户的全部流程控制,显然违反了单一责任原则。 #### 复杂条件语句 复杂的条件分支同样会使程序难读易错。考虑这样一个场景——权限验证机制里充满了嵌套if-else结构: ```java boolean hasAccess(String role, int resourceLevel) { boolean result = false; if ("admin".equals(role)) { result = true; } else if ("editor".equals(role)){ if(resourceLevel <= 2){ result = true; } } else if ("viewer".equals(role)){ if(resourceLevel == 0 || resourceLevel == 1){ result = true; } } return result; } ``` 这种写法不仅冗长而且容易引入错误,应该重构为更简洁的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值