工作业务中简单易读的代码还是复杂酷炫的代码?不断提醒自己能跑再说

1,568 阅读1分钟

写了 入行4年,今天也是正常上班的一天,正常来公司,正常和后端沟通需求,正常改动了数据结构,但是不正常的事情发生了,我写了一段愚蠢的代码

昨天需要做一个数据转换是这样的

后端返回一个数据

{
  passwordWrongLimit: '3',
  passwordWrongLimitNumber: '3',
  passwordWrongLimitType: 'LOCK',
  passwordWrongLockDuration: '5',
  passwordWrongLockDurationUnit: 'DAY '
}

我需要转换成这样的

{
   "passwordWrongLimit": {
        "enable": true,
        "limitCount": 5,
        "limitType": "VERIFICATION_CODE",
        "lockTime": {
            "time": 5,
            "unit": "MINUTE"
        }
   }
}

就是这样的简单的一段逻辑,注意,这里没有任何人要求我复用,我完全是我自己的编写逻辑

然后我想要写一个通用的函数,结果写成了这样的

dataAdapter(res, type = 'BEFORE' || 'AFTER') {
   const resClone = this.$lodash.cloneDeep(res)
   const rules = {
     passwordWrongLimit: 'passwordWrongLimit.enable',
     passwordWrongLimitNumber: 'passwordWrongLimit.limitCount',
     passwordWrongLimitType: 'passwordWrongLimit.limitType',
     passwordWrongLockDuration: 'passwordWrongLimit.lockTime.time',
     passwordWrongLockDurationUnit: 'passwordWrongLimit.lockTime.unit'
   }
   if (type === 'BEFORE') {
     debugger
     // 在网络数据请求之前,将数据转换为服务器需要的数据,rules key 为页面数据的key, value 为服务器需要的key
     Object.keys(rules).forEach((key) => {
       const data = getDataByPath(resClone, rules[key])
       setDataByPath(resClone, key, data)
     })
   } else if (type === 'AFTER') {
     // 在网络数据请求之后,将数据转换为页面需要的数据,rules key 为服务器数据的key, value 为页面需要的key
     Object.keys(rules).forEach((key) => {
       const value = rules[key]
       const data = getDataByPath(resClone, key)
       setDataByPath(resClone, value, data)
     })
   }

   // 根据数据路径获取数据
   function getDataByPath(data, path) {
     if (path.indexOf('.') > -1) {
       const pathArray = path.split('.')
       let targetObj = data
       pathArray.forEach((item) => {
         targetObj = targetObj[item]
       })
       return targetObj
     } else {
       return data[path]
     }
   }
   // 根据数据路径设置数据
   function setDataByPath(data, path, value) {
     if (path.indexOf('.') > -1) {
       const pathArray = path.split('.')
       let targetObj = data
       pathArray.forEach((item, index) => {
         if (index === pathArray.length - 1) {
           targetObj[item] = value
         } else {
           if (typeof targetObj[item] === 'object') {
             targetObj = targetObj[item]
           } else {
             targetObj[item] = {}
             targetObj = targetObj[item]
           }
         }
       })
     } else {
       data[path] = value
     }
   }
   return resClone
 }

本来是想要写一个通用的,即使是字段增多也可以适配的函数,想要在业务代码里面酷炫,这个函数写的复杂的一,需要定义数据转化规则数据,又要实现数据转化,又要实现数据获取,又要实现数据设置,又要实现数据路径的获取, 啊啊啊啊啊啊,昨天写了1.5h,写出了一段跑不通的代码😤,这是为什么啊,这是一段纯纯的业务代码,没有任何复用性可言,别的地方也不会用到,我也没打算把他抽离成为一个通用的方法,我就是想要写一个函数,把数据转化一下,然后就是这样的一个函数,我写了1.5h,还没跑通。原因我想一想:想要写牛B的代码,看不上下面这段

dataAdapter(res, type = 'BEFORE' || 'AFTER') {
   const resClone = this.$lodash.cloneDeep(res)
   if (type === 'BEFORE') {
     resClone.passwordWrongLimit = res.passwordWrongLimit.enable
     resClone.passwordWrongLimitNumber = res.passwordWrongLimit.limitCount
     resClone.passwordWrongLimitType = res.passwordWrongLimit.limitType
     resClone.passwordWrongLockDuration = res.passwordWrongLimit.lockTime.time
     resClone.passwordWrongLockDurationUnit = res.passwordWrongLimit.lockTime.unit
   } else if (type === 'AFTER') {
     resClone.passwordWrongLimit = {
       enable: res.passwordWrongLimit,
       limitCount: res.passwordWrongLimitNumber,
       limitType: res.passwordWrongLimitType,
       lockTime: {
         time: res.passwordWrongLockDuration,
         unit: res.passwordWrongLockDurationUnit
       }
     }
   }
   return resClone
}

结果,苦苦写不出来,或者是要接着写的话,越来令我费劲,并且增加的系统的复杂度,看的人也是看不明白,吃力不讨好,我不想写了,花费1分钟写上面的代码,然后节省出来的一个多小时完全可以用来写其他的业务逻辑或者是看看别人的代码,或者是开一个仓库写一些真正的可以想要写的牛B的代码,这才是我想要的

总结:先写能跑的代码,再写跑的好的代码,拒绝复杂度暴增的代码

工作的时候什么事情费力不讨好,让你觉得是在浪费时间,欢迎留言分享~~