Skip to content

【智能中台】历史代码问题汇总 #17

Description

@ASkyBig

最近在做中台项目,优化一下历史代码

中台开发体会

接口评审需要注意的事项

  • 如果是 Select 数据源,希望返回 {label: xx, value: xx} 的格式

不足

  • 中台的响应速度要求很高,如果不能及时响应,会导致业务方block。但是中台业务很多,这个优先级就很难处理。
  • 多加一层,其实会多一点出错的概率。可能前端 mock 正常,服务自测也正常,但是中台服务挂了,这种就会浪费时间找问题。

代码问题

1、只有两种条件的时候,第二个返回不需要 else

修改前:

if (item.cbid) {
  return (
    <Link to={`/tagrulebook/booktag/${item.cbid}`} className='c404aff' target='_blank'>
      {text}
    </Link>
  );
} else {
  return text;
}

修改后:

if (item.cbid) {
  return (
    <Link to={`/tagrulebook/booktag/${item.cbid}`} className='c404aff' target='_blank'>
      {text}
    </Link>
  );
}
return text;

2、arr.length === 0

  • 判断一个数组是否为空,不需要加上 === 0
  • 利用可选链,不需要多判断一次是否存在

修改前:

if (value && value.length === 0) {
  // do something
} 

修改后:

if (value?.length) {
  // do something
}

3、重置数组对象不需要 [].concat(arr)

直接利用扩展运算符就好了

修改前:

dataRem[dataRem.indexOf(item)].status = 2
setDataRem([].concat(dataRem))

修改后:

dataRem[dataRem.indexOf(item)].status = 2
setDataRem([...dataRem])

4、利用空值合并操作符 ?? 代替 || 和 三目运算符

代替 ||:

  • 比如有些时候,我们就需要一个空,但是用 || 就有问题了,'' || 1 的结果是 1
  • 或者数值的时候,如果我们输入了 00 || '暂无金额' 的结果是 暂无金额

修改前:

<div>标签描述:{item?.description || '暂无描述'}</div>

修改后:

<div>标签描述:{item?.description ?? '暂无描述'}</div>

代替 ?...::
修改前:

const val = value ? value : ''

修改后:

const val = value ?? ''

5、利用三目运算符 ? :取代 if...else

可以让代码更加简洁

修改前:

if (item.value === '0') {
  const name = platform[0][0]['name']
  const value = platform[0][0]['value']
  onFilter({[name]: value})
} else {
  const name = platform[1][0]['name']
  const value = platform[1][0]['value']
  onFilter({[name]: value})
}

修改后:

const [name, value] = item.value === '0'
  ? [platform[0][0]['name'], platform[0][0]['value']]
  : [platform[1][0]['name'], platform[1][0]['value']]
onFilter({[name]: value})

6、将通用事件放到 catchthen 后面做

可能有些人不知道 catch 后面返回的还是一个 promise

修改前:

setLoading(true)

axios
  .get(url)
  .then(res => {
    setLoading(false)
     // do something
  })
  .catch(err => {
    setLoading(false)
    // do something
  })

修改后:

setLoading(true)

axios
  .get(url)
  .then(res => {
     // do something
  })
  .catch(err => {
    // do something
  })
  .then(() => {
     setLoading(false)
  })

7、减少无意义的代码

有时候,我们会写出一些冗余代码(当然,有时候适当冗余是好的)

修改前:

function foo () {
  if (val === null || val === undefined) return
  if (val === '') return
  // do something
}

修改后:

function foo () {
  if (!!val) return
  // do something
}

修改前:

const search = value => {
  if (!value) {
    initBookInfo(1, 10)
    return
  }
  initBookInfo(1, 10)
}

修改后:

const search = value => {
  initBookInfo(1, 10)
}

8、提取通用逻辑

下面的代码是分别点击黑白名单的时候展示对应的数据,代码基本上都是通用的:
修改前:

if (bookRadioBox.includes('1')) {
  const [res, err] = await $fetch(`/recSubject/subset_contents?subset_id=${sublibId}&page_size=10&page_num=1`, {
  method: 'GET'
  })
  if (err !== null) return
  setBookInfoLoading(false)
  setBookInfo(res.data)
} else if (bookRadioBox.includes('2')) {
  const [res, err] = await $fetch(`/recSubject/whiteBooks?subset_bw_id=${formData.whitelist}&page_size=10&page_num=1`, {
  method: 'GET'
  })
  if (err !== null) return
  setBookInfoLoading(false)
  setBookInfo(res.data)
} else if (bookRadioBox.includes('3')) {
  const [res, err] = await $fetch(`/recSubject/blackBooks?subset_bw_id=${formData.whitelist}&page_size=10&page_num=1`, {
  method: 'GET'
  })
  if (err !== null) return
  setBookInfoLoading(false)
  setBookInfo(res.data)
}

修改后:

let url
if (bookRadioBox.includes('1')) {
  url = `/recSubject/subset_contents?subset_id=${sublibId}&page_size=10&page_num=1`
} else if (bookRadioBox.includes('2')) {
  url = `/recSubject/whiteBooks?subset_bw_id=${formData.whitelist}&page_size=10&page_num=1`
} else if (bookRadioBox.includes('3')) {
  url = `/recSubject/blackBooks?subset_bw_id=${formData.whitelist}&page_size=10&page_num=1`
}

const [res, err] = await $fetch(url, { method: 'GET' })
if (err !== null) return
setBookInfoLoading(false)
setBookInfo(res.data)

9、表单字段不能空,需要区分类型

不能单纯利用 str.length > 0 判断字段,因为可能是 number。可以统一成 String(str).length > 0

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions