欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cleancode思想-函数篇

程序员文章站 2024-03-21 20:12:40
...

下面是针对cleancode函数方面的分享

1. 只做一件事

  • 应遵循单一职责原则
  • 一个函数只做一件事,且函数名能准确表达出这件事
  • 确保一个函数在同一个抽象层
  • 不能出现副作用

eg:

改进前(缺点:存在副作用,不只是做一件事,不在同一个抽象层)

const viewModel = {
  userList: [],
  firstUser: {},
}

function getUserList () {
  return getUserListRequest().then(response => {
    viewModel.firstUser = response[0]
    return response
  })
}

viewModel.userList = getUserList()

改进后

const viewModel = {
  userList: [],
  firstUser: {},
}

function getUserList () {
  return getUserListRequest().then(response => {
    return response
  })
}

viewModel.userList = getUserList()
viewModel.firstUser = viewModel.userList[0]

我们现在都知道,上一节改进后的getCouponList()函数只做了一件事,

但其实也可以看作是以下2件事:

A.请求接口

B.返回接口的数据

所以这算是一件事还是两件事呢?

因为”请求接口“和”返回接口的数据“,这两件事是在同一个抽象层
的,都是属于getUserList的抽象层,因此是只做了一件事。

2. 向下规则

eg:

改进前:(缺点:getUserList()在调用之后声明,有悖阅读习惯)

const userList = getUserList()

function getUserList () {
  // your code
}

改进后

function getUserList () {
  // your code
}

const userList = getUserList()

3. 函数参数

  • 尽量控制参数数量,因为它们有太多概念性
  • 不要用标识参数,应该把它们拆成两个函数
  • 当函数参数大于3个时,改为以对象方式传入

eg:

改进前(缺点:参数太多,可读性差)

function handleUserInfo (name, age, phone, address) {
  // your code
}

改进后

function handleUserInfo (userInfo) {
  const { name, age, phone, address } = userInfo
  // your code
}

eg:

改进前:(缺点:当需要新增code时,需修改函数内部实现,不符合开闭原则)

function getErrorMessage (code) {
  switch (code) {
    case 4912001:
      return '兑换码未找到'
    case 5912002:
      return '不支持该兑换码,请联系客服'
    case 4912003:
      return '兑换码已被使用'
    case 4912004:
      return '兑换码已过期'
    case 4912005:
      return '和您当前权益冲突,无法兑换'
    case 5001002:
      return '操作频率过快'
    default:
      return '未知错误'
  }
}

改进后

const codeMessageMap = {
  '4912001': '兑换码未找到',
  '5912002': '不支持该兑换码,请联系客服',
  '4912003': '兑换码已被使用',
  '4912004': '兑换码已过期',
  '4912005': '和您当前权益冲突,无法兑换',
  '5001002': '操作频率率过快',
  'unkonw': '未知错误',
}

function getErrorMessage (code) {
  return codeMessageMap[code] = codeMessageMap['unkonw']
}

eg:

改进前(缺点:使用标识参数,不符合单一职责原则)

function getUserList (isVip) {
  if (isVip) {
    return ajax.get('/get_vip_list')
  }
  return ajax.get('/get_user_list')
}

改进后

function getUserList () {
    return ajax.get('/get_user_list')
}

function getVipList () {
  return ajax.get('/get_vip_list')
}

4. 多态代替条件语句

eg:

改进前

class Animal {
  private type

  constructor (type) {
    this.type = type
  }

  say () {
    if (this.type === 'dog') {
      console.log('wang wang wang ~~~')
    } else if (this.type === 'duck') {
      console.log('ga ga ga ~~~')
    }
  }

  eyeNumber () {
    console.log('I have two eyes')
  }
}

改进后

class Animal {
  say () {}

  eyeNumber () {
    console.log('I have two eyes')
  }
}

class Dog extends Animal {
  say () {
    console.log('wang wang wang ~~~')
  }
}

class Duck extends Animal {
  say () {
    console.log('ga ga ga ~~~')
  }
}

其他

  • 使用getter和setter函数
  • 函数代码不超过50行
  • 删除重复代码



ps: 转载请注明出处