代码编织梦想

汇总常见的编程习惯

1. 语义简单明确

 含义:写代码时考虑读者,优先采取易于读者理解的写法。

#define THROTL_UNSET      -2
#define THROTL_NO_LIMIT   -1

bool throttle_is_quota_valid(int64_t value)
{
    // 复杂的判断条件
    // 请你在三秒内说出 value 如何取值是合法的?
    if (value < 0 && value != THROTL_UNSET && value != THROTL_NO_LIMIT)
    {
        return false;
    }
    return true;
}

bool throttle_is_quota_valid(int64_t value)
{
    // 这是修改后的代码,value 取值合法有三种情况,一目了然
    return value >= 0 || value == THROTL_UNSET || value == THROTL_NO_LIMIT;
}

2. 简洁 ≠ 代码短

简洁≠代码短,复杂的问号表达式反而不如 if..else 方便理解。

void RecycleBin::Load(BindCallbackR1<Status>* done)
{
    ......
    FOREACH(iter, fileStats)
    {
        RecycleFile item;
        Status status = ParseDeletedFileName(iter->path, &item.timestamp);
        if (!status.IsOk() { ...... }
        item.fileName = iter->path;
        item.size = iter->size;
        item.physicalSize = iter->refCount > 1 ? 0 : iter->physicalSize;
        ......
        // 这是修改前的代码
         earliestTimestamp[item.medium] =
             item.timestamp != 0 && item.timestamp < earliestTimestamp[item.medium] ?
             item.timestamp : earliestTimestamp[item.medium];
         }
        // 这是修改后的代码
        if (item.timestamp != 0 &&
            item.timestamp < earliestTimestamp[item.medium])
        {
            earliestTimestamp[item.medium] = item.timestamp;
        }
    }
    ......
}

3. 提前返错

提前返错能减少主体逻辑的缩进数量,让主体代码逻辑显得更醒目。

Status Foo()
{
    Status status = Check1();
    if (!status.IsOk())
    {
        return status;
    }
    else
    {
        status = Check2();
        if (!status.IsOk())
        {
            return status;
        }
        else
        {
            ..............
        }
      }
}
//修改为

Status Foo()
{
   Status status = Check1();
   if (!status.IsOk())
   {
       return status;
   }
   status = Check2();
   if (!status.IsOk())
   {
       return status;
   }
}

4.利用析构函数做清理工作(针对C++)

利用 C++ 析构函数做清理工作,在复杂冗长代码中不会漏掉。典型的清理工作有执行回调、关闭文件、释放内存等。


void Foo(RpcController* ctrl,
         const FooRequest* request,
         FooResponse* response,
         Closure* done)
{
    Status status = Check1(request);
    if (!status.IsOk())
    {
        response->set_errorcode(status.Code());
        // 第一处
        done->Run();
        return;
    }
    status = Check2(request);
    if (!status.IsOk())
    {
        response->set_errorcode(status.Code());
        // 第二处
        done->Run();
        return;
    }
    DoSomeRealWork(...);
    // 第三处
    done->Run();
}

//修改为:
void Foo(RpcController* ctrl,
         const FooRequest* request,
         FooResponse* response,
         Closure* _done)
{
    // 仅一处,不遗漏
    erpc::ScopedCallback done(_done);
    Status status = Check1(request);
    if (!status.IsOk())
    {
         response->set_errorcode(status.Code());
         return;
    }
    status = Check2(request);
    if (!status.IsOk())
    {
         response->set_errorcode(status.Code());
         return;
    }
    DoSomeRealWork(...);
}

5. 用朴素直观的算法

在非关键路径上,优先使用朴素直观的算法,此时代码可维护性更重要。


void CompactTask::checkFileUtilizationRewrite()
{
    // 此处采取朴素的排序算法,并未采取更高效的 TopK 算法
    std::sort(sealedFilesUsage.begin(), sealedFilesUsage.end(), GarbageCollectionCompare);
    
    int64_t sealedFileMaxSize = INT64_FLAG(lsm_CompactionSealedMaxSize);
    int32_t sealedFileMaxNum = INT32_FLAG(lsm_CompactionSealedMaxFileNum);
    int64_t targetFileSize = 0;
    int32_t sourceFileCnt = 0;                                                                                                                                      
    // 前者简单清淅,并在几十个 File 中选择前几个文件的场景并不算太慢
    FOREACH(itr, sealedFilesUsage)
    {
        LogicalFileId fileId = itr->fileId;
        const FileUsage* usage = baseMap->GetFileUsage(fileId);
        const File* file = fileSet->GetFile(fileId);
        targetFileSize += usage->blocks * mBlockSize;
        sourceFileCnt++;

        if (targetFileSize > sealedFileMaxSize || sourceFileCnt > sealedFileMaxNum)
        {
            break;
        }
        mRewriteSealedFiles[fileId] = true;
    }
    ......
}

6.用轮循代替条件变量

在非关键路径上使用简单的轮循代替精巧的条件变量同步,代码简洁且不容易出 bug。

7. 避免有歧义的函数名和参数表

函数名和参数表要符合直觉,大多数使用者没空读你的注释,小部分使用者读了你的注释也看不明白。

参考文献:

1. 阿里云块存储团队软件工程实践

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_31437863/article/details/127311528

android studio中常见问题汇总_chuannayou0499的博客-爱代码爱编程

当你从Eclipse切换到Android Studio(以下简称AS)的时候,我觉得正常人都会骂Google的产品经理, 但最后还是得用AS,没办法github上大多数都是用其构建的; 给程序员做一款优秀的工具真是很困难,我想所有人都不喜欢在编译环境,编辑器上浪费时间,只想专注于code; 当你从网上下一个用AS的demo时,我觉得至少

SLAM常见问题汇总-爱代码爱编程

注:本文内容大多数来源于“计算机视觉life”微信公众号,因文章较多,笔者记忆又不强,所以整理成博客形式,感兴趣的伙伴可以移步微信公众号浏览更多精彩内容哦! 一.为什么要学SLAM? 计算机视觉主要分为两大方向:基于学习的方法(代表:深度学习)和基于几何的方法(代表:视觉SLAM) 1.深度学习在检测、识别领域具有强大能力,但涉及多视角几何相关的SLA

01HM代码学习笔记:HM中常见的类和数据结构的具体含义汇总-爱代码爱编程

名称含义TComPic图片类,它包含TComPicSym(图像符号类)和TComPicYuv(yuv数据类:包括原始数据,预测数据和残差数据)TvideoIOYuv用来读取yuv文件的类,读取出来之后把数据放到TComPicYuv中TComPicSym该类中存放了指向片(TComSlice)的二级指针,和指向CU(TComDataCU)的二维指针,其实片和

收藏 | 精华文章汇总:代码实践篇-爱代码爱编程

【周末AI课堂】 | 机器学习你会遇到的“坑” 第1-2讲 过拟合问题: 理论篇 代码篇 第3-4讲 如何进行特征选择: 理论篇 代码篇 第5-6讲 线性降维方法: 理论篇 代码篇 第7-8讲 非线性降维方法: 理论篇 代码篇 第9-10讲 核技巧: 理论篇 代码篇 第11-12讲 基于贝叶斯推断的分类模型: 理论篇 代码篇

aistudio使用常见问题汇总-爱代码爱编程

aistudio 常见问题汇总 aistudio 说明: https://aistudio.baidu.com/aistudio/messagedetail/74/system 0. 课程资源 0.1 b站直播 如果有直播通常在 20:30,具体时间QQ群班班会有通知 0.2 课程位置 图像分割7日打卡营 0.3 直播回放位置 0.4 P

Java及JavaScript常见框架汇总-爱代码爱编程

Java的九大顶级框架: 顶级Java框架#1:Spring Spring排在第一位,是由于它能够开发以高性能著称的复杂web应用程序的出色能力。它能够使Java开发人员轻松地创建企业级应用程序。 Web应用程序开发人员可以担保Spring框架的能力。这也是Spring成为Java开发人员的最爱的原因。下面的数据进一步证明了这一点。以下是选择Java

数学建模国赛论文latex代码汇总-爱代码爱编程

目录 一、写在前面的话 二、latex环境安装和编辑器的选择 三、基础配置(写作环境、中文支持、页面设置、分级目录) 四、数学公式、方程、矩阵编写与特殊符号的输入 五、三线表的输入 六、图片和参考文献的插入 七、最后附上完整配置代码 一、写在前面的话 对于很多准备国赛的同学来说,latex绝对是一个又爱又恨的软件。在国赛中使用late

Golang优秀开源项目汇总-爱代码爱编程

根据go语言中文社区提供的资料,还有互联网企业架构设计中的常见组件分类, 共精心挑选了154个开源项目(项目不限于在github开源的项目), 分成以下17个大类。 监控系统 项目简介Star数grafana/grafanaGrafana 是一个用于监控指标分析和图表展示的工具, 后端支持 Graphite, InfluxDB & Promet

代码托管平台汇总-爱代码爱编程

代码托管平台 统一的代码托管平台是#DevOps#的基础,也是管理代码的科学手段,为了方便各位程序员朋友们更好的选择代码托管平台,特此总结分享一下国内外代码托管平台。 序号平台特点1github全球最流行的面向开源及私有软件项目的托管平台,有超过2600万的用户群体,被微软收购。随着越来越多的应用程序转移到了云上,GitHub已经成为了管

哪些c++源代码项目值得阅读_转正风的博客-爱代码爱编程

必须是 Facebook Folly!这是facebook 开源的基于C++14的库,在facebook内部广泛使用 很多 C++ 项目都不错,但是不适合全部阅读,比如 Chromium ,源码总计 2000w+行,可以说没有任何人能够完全掌握,就算是1/100难度也不小,我看有不少博主在鼓吹看了 Chromium,这种除了是内核开发者,其它人说大概率是