函数应该以完成功能为前提,函数主体能短小就多短小。
函数应该只完成一件事,如果函数存在多种事件处理,需要进行解构整合。如果该函数处理的都在同一抽象层,则代表该函数制作一件事。
自顶向下阅读,如果出现不同抽象层级的应当进行重构。
尽量将它使用到抽象底层
函数越短小,功能越集中,就越容易取得好名称。不要害怕长名称。
参数最佳是零参数,其次是一参数,再次是双参数,如果没用特殊理由不要使用三(多)参数。
不要使用输出参数,阅读难度太大,使用返回值来替代。
例如:在检查账户和密码的时候
checkPassword(userName, password) {
let user = findUserName(userName)
if(user){
let codePhrase = getPhraseEncodeByPassword(userName)
let phtrase = decrypt(codePhrase, password)
if(phtrase === 'Vaild Password'){
Session.initialize()
return true
}
}
return false
}
这里Session
就是副作用,造成了时许耦合——checkPassword
只有在特定时候调用。如果在不合适的时候调用,就有可能造成会话数据沉默地丢失。如果这些副作用不可避免,应当在函数名体现:checkPasswordAndSessionInit
当函数需要同时需要修改与返回相关信息的时候,常常会混乱。
set(userName,unclebob)
这个是需要判断userName
的值是否设置为unclebob
,还是询问userName
的值是否成功设置为unclebobo
呢?从这行语句无法判断。
所以需要通过指令来分割
if(attributeExists(userName)){
setAttribute(userName, unclebobo)
}
例如:
if('ok'===deletePage(page)){
if('ok'===registyPage(page)){
//
}else{
throw new Error('registy error')
}
}else {
throw new Error('deletePage error')
}
如果用异常来替代
try{
deletePage(page)
registryPage(page)
}catch(e){
throw new Error(e)
}
这样就可以把错误主体分离出逻辑
每个函数应该保持一个输入、输出,循环中不能出现break,continue,尤其是goto永远不能出现。
这个适用于大函数编写,对于小函数而言,偶尔出现break、continue、return可以让函数表达更明确。
初稿或许会很难堪,你需要不断的斟酌推敲才能写出心目中的样子。从一开始就按照这些规则来写代码是不现实的,应该也没有几个人能做到。