代码的坏味道——重复代码

        前言:遇到类似的功能,更好的做法是封装。

        重复代码:一般情况下,遇见重复的功能、逻辑,采用复制代码、粘贴这也是最简单的方式了,但这就是坏味道的开始。 而存在的问题原因就是copy了多次,容易遗漏出未修改的地方,每次迭代还会增加繁琐性。

一、避免重复的HTML结构

遇到重复的结构时,应当封装为组件

badCase:

componentA

<template>
  <div>
    <button class="primary">按钮</button>
  </div>
</template>


componentB

<template>
  <div>
    <button class="error">按钮</button>
  </div>
</template>

goodCase:

<template>
  <div>
    <button :class="[type]">
        <slot />
    </button>
  </div>
</template>

<script>
  export default {
     props: {
        type: {
           type: 'string',
           default: 'primary'
        }
     }
  }
</script>

<style>
.primary {
   color: 'green'
}

.error {
   color: 'red'
}
</style>

二、避免出现重复的逻辑 

遇到重复的逻辑时,应当抽离为函数。

badCase:

  const userList = [
    {
      name: "ultraman",
      age : 18,
      score: 100,
    },
    {
      name: "monsters",
      age: 30,
      score: 60,
    },
  ];


  const getAllUserListScore = () => {
    return userList
      .map((user) => user.score)
      .reduce((acc, score) => (acc += score));
  };

  const getAllUserListAge = () =>{
    return userList
      .map((user) => user.age)
      .reduce((acc, score) => (acc += score));
  }

goodCase:

  const getAllTotal = (data, prop) => {
    return userList
      .map((user) => user[prop])
      .reduce((acc, total) => (acc += total));
  };

  const getAllUserListScore = () => {
    return getAllTotal(userList, "score");
  };

  const getAllUserListAge = () => {
    return getAllTotal(userList, "age");
  };

三、避免使用过长的条件语句

遇到简单的if的语句时应当换成三元表达式,遇到字符串拼接应该采用模板字符串

badCase:

case1:
 
if ( a > 1 ) {
  this.$message('OK')
} else {
  this.$message('Error')
}

case2:

const userAge = 18
const userName = 'ultraman'
const text = '我叫' + userName + ',今年' + userAge + '岁'

goodCase:

case1:

this.$message( a > 1 ? 'OK' : 'Error')

case2:

const userAge = 18
const userName = 'ultraman'
const text = `我叫${userName},今年${userAge}岁`

四、避免硬编码

badCase:

const getDiscountedPrice = (price) => {
    return price × 0.8
}

goodCase:

const DISCOUNT_RATE = 0.8

const getDiscountedPrice = (price) => {
    return price × DISCOUNT_RATE 
}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重构(名词):对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本.重构(动词):使用一系列重构准则(手法),在不改变"软件之可察行为"前提下,调整其结构. 两种定义都强调是在不改变"软件的外部行为"前提下,不改变"软件之可察行为"就是说让修改不影响外部使用程序(程序员),在个外部来看,程序的行为和结果没有任何的变化.重构只是对程序内部结构进行调整,让代码更加容易理解,然后更容易维护. 本书清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。 章节列表如下: 目录 第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 2.1 何谓重构53 2.2 为何重构55 2.3 何时重构57 2.4 怎么对经理说60 2.5 重构的难题62 2.6 重构与设计66 2.7 重构与性能69 2.8 重构起源何处71 第3章 代码味道75 3.1 DuplicatedCode(重复代码)76 3.2 LongMethod(过长函数)76 3.3 LargeClass(过大的类)78 3.4 LongParameterList(过长参数列)78 3.5 DivergentChange(发散式变化)79 3.6 ShotgunSurgery(霰弹式修改)80 3.7 FeatureEnvy(依恋情结)80 3.8 DataClumps(数据泥团)81 3.9 PrimitiveObsession(基本类型偏执)81 3.10 SwitchStatements(switch惊悚现身)82 3.11 ParallelInheritanceHierarchies(平行继承体系)83 3.12 LazyClass(冗赘类)83 3.13 SpeculativeGenerality(夸夸其谈未来性)83 3.14 TemporaryField(令人迷惑的暂时字段)84 3.15 MessageChains(过度耦合的消息链)84 3.16 MiddleMan(中间人)85 3.17 InappropriateIntimacy(狎昵关系)85 3.18 AlternativeClasseswithDifferentInterfaces(异曲同工的类)85 3.19 IncompleteLibraryClass(不完美的库类)86 3.20 DataClass(纯稚的数据类)86 3.21 RefusedBequest(被拒绝的遗赠)87 3.22 Comments(过多的注释)87 第4章 构筑测试体系89 4.1 自测试代码的价值89 4.2 JUnit测试框架91 4.3 添加更多测试97 第5章 重构列表103 5.1 重构的记录格式103 5.2 寻找引用点105 5.3 这些重构手法有多成熟106 第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 IntroduceExplainingVariable(引入解释性变量)124 6.6 SplitTemporaryVariable(分解临时变量)128 6.7 RemoveAssignmentstoParameters(移除对参数的赋值)131 6.8 ReplaceMethodwithMethodObject(以函数对象取代函数)135 6.9 SubstituteAlgorithm(替换算法)139 第7章 在对象之间搬移特性141 7.1 MoveMethod(搬移函数)142 7.2 MoveField(搬移字段)146 7.3 ExtractClass(提炼类)149 7.4 InlineClass(将类内联化)154 7.5 HideDelegate(隐藏“委托关系”)157 7.6 RemoveMiddleMan(移除中间人)160 7.7 IntroduceForeignMethod(引入外加函数)162 7.8 IntroduceLocalExtension(引入本地扩展)164 第8章 重新组织数据169 8.1 SelfEncapsulateField(自封装字段)171 8.2 ReplaceDataValuewithObject(以对象取代数据值)175 8.3 ChangeValuetoReferen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值