《代码整洁之道》笔记02——函数

函数主体短小

函数应该以完成功能为前提,函数主体能短小就多短小。

一件事

函数应该只完成一件事,如果函数存在多种事件处理,需要进行解构整合。如果该函数处理的都在同一抽象层,则代表该函数制作一件事。

每个函数一个抽象层级

自顶向下阅读,如果出现不同抽象层级的应当进行重构。

Swtich语句

尽量将它使用到抽象底层

使用描述名称

函数越短小,功能越集中,就越容易取得好名称。不要害怕长名称。

函数参数

参数最佳是零参数,其次是一参数,再次是双参数,如果没用特殊理由不要使用三(多)参数。

不要使用输出参数,阅读难度太大,使用返回值来替代。

无副作用

例如:在检查账户和密码的时候

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可以让函数表达更明确。

多次修改才能出现好函数

初稿或许会很难堪,你需要不断的斟酌推敲才能写出心目中的样子。从一开始就按照这些规则来写代码是不现实的,应该也没有几个人能做到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章