用于记录工作中出现的问题和编程时需要注意的重点,保证代码质量和编程效率


 

 

代码质量控制

  1. 编写程序时注意编程注意项,保证代码格式 / 性能 等方面的质量
  2. 程序编写完成后需要自测所有改动,并在 JIRA  上详细备注变更内容;

    还要使用 valgrind 工具检查内存泄漏 / 内存越界,确认功能是正常的
  3. 自测完成后,与开发前代码对比,严格检查两遍冲突后方可提交代码

编程注意项

  1. 在提交代码时,需要严格检查两遍冲突,防止修改到功能不相关的代码 

    以后的代码提交前应与开发前的代码多次对比,保证不修改到功能不相关的代码

  2. 对于判断逻辑,能提前判断则尽量提前做,可减少后面程序执行的代码,提交效率

  3. 不要为了方便复制(任何)代码

  4. 当在一个条件语句中增加逻辑时,需要考虑到这部分逻辑是否会被触发,如果不触发会不会影响功能

    同样的,在增加新的逻辑时,也要判断这部分逻辑是否需要执行(可能仅在某些条件下才需要触发)

  5. 代码中处理异常 / 记录日志的部分,需要能从异常获取 / 日志打印中的信息迅速定位到问题,从这个角度来选择日志的级别以及异常处理的 throw / catch 的位置     

    一般外部调用的接口都需要记录调用耗费的时间,可以通过日志排查接口长时间没有响应 / 返回慢导致的问题

     

    凡是影响到 (执行到这个分支) 输出日志的内容,尽量都在日志中输出,确认是哪类原因导致这个结果的产生

  6. 每次增加配置后,需要增加从内存中 dump 出当前程序配置内容的代码,用于远程排查问题时可以获取相关模块的配置

  7. 对于 static 类型的变量/函数,都需要考虑到线程安全

    特别是 Env 中的变量

  8. 生成 / 使用指针时,必须判断其是否有效,否则易引发段错误造成程序崩溃

  9. 永远不要相信用户的输入对于不是自己产生的数据(用户输入)做处理/解析,必须考虑到异常的情况,做全面的判断

  10. 消耗内存/cpu的操作应该尽量放在循环/函数外实现

    例如解析邮件头、格式/字符集转换等操作,尽量减少内存/cpu 消耗以及函数调用

  11. 代码需要注意兼容性

    新的功能不能影响到旧的代码,另外在自测过程中需要过旧功能的单元测试,保证兼容性

  12. 在处理计算的表达式时,需要注意溢出以及除数为 0 的问题

    比如这一行代码,当 nCosLimt 接近 int 上限时,在右边的表达式中乘上 rate 后将溢出上限变成负数,再除 100 后得到的值仍是负数,与预期的结果相反

// 检查邮件数量是否超过 cos 上限
static_cast<int>(MBoxHdr.getTotalMsgCount()) >= nCosLimit *
static_cast<int>(nMailCntQuotaWarningRate) / 100)

另外当被除数是一个变量时,需要注意该变量是否可能为 0

代码&功能优化

代码优化

当完成一个需求时,需要做以下检查,判断是否还有优化的空间

  1. 当一个函数中存在多块不相关的逻辑时,将较为简单的逻辑放在函数前面,复杂的放在后面,能提前的判断提前

    如果该函数有多个出口,那么先执行复杂的逻辑可能会影响性能,且如果中间抛出异常造成跳转,则原应该执行的简单逻辑无法执行了

  2. 重复的代码需要判断是否能合并 / 抽象

    对于基本相同的逻辑(80%-90% 相同)则需要思考是否能封装成一个函数,通过参数等判断执行状态

    对于涉及到相对独立的变量&数据结构的逻辑,可以抽象成类,根据不同的构造参数来判断行为

功能&模块优化

某个模块/功能的优化流程

  1. 梳理当前模块/功能的相关逻辑
  2. 分析现有模型的优缺点,哪些实现是不合理的,哪里有优化空间,主要是哪部分处理影响性能
  3. 针对分析的结果来做优化,设计新的实现

其他

  1. 在文档的编写方面,需要遵从最小化原则

    即只增加与该 需求/问题 相关的 描述/日志/配置,便于他人理解和维护;

    且增加的日志需要能支撑(解释)所描述的步骤,输出的内容需要清晰,要根据不同的情况选择合适的日志级别

     
  2. 遇到不熟悉的系统日志,需要对其中字段逐个排查

    通过对比正常的日志来确定是哪个点出现问题

     
  3. 一个系统安全运行应该有专门的用户来执行

    比如 tomcat 有专门的 user:tomcat,coremail 用户有专门的 coremail 用户

    需要将执行程序的用户与 root 用户分离,当 coremail 用户被攻破时,将不会拥有 root 用户的权限;更进一步的话,再增加 cmadm 用户将系统的程序写权限限定为 cmadm,正常使用给 coremail 用户可读可执行权限,以及修改配置/日志的写权限

小技巧

  1. 在 catch 中再次 throw,可以将截获的异常重新抛出try
{
    try
    {
        ...
    }
    catch(TException & te)
    {
        if(condition)
            throw;      // 会跳至外层的 catch 处理
    }
}
catch(TException & te)
{
    ...
}

调试

  1. 当不清楚问题出在哪部分代码时,可以注释掉部分修改的代码以缩小问题范围

代码质量控制 & 编程注意项的更多相关文章

  1. C# 求精简用一行代码完成的多项判断 重复赋值

    C# 求精简用一行代码完成的多项判断 重复赋值 哈哈,说实话,个人看着这么长的三元操作也麻烦,但是我也只想到了这样三元判断句中执行方法体能够写到一行,追求的终极目的是,用一行实现这个过程,而且简单,由 ...

  2. 代码与编程(java基础)

    代码与编程(面试与笔试java) 1.写一个Singleton出来 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一般Singleton模式通常有几种种 ...

  3. C#代码规范-编程秘笈

    原文地址:https://www.cnblogs.com/zzp0320/p/6949973.html 1.引言 本文是一套面向C# programmer和C# developer进行开发所应遵循的开 ...

  4. TFS代码变更和工作项关联,为系统变更提供完美的跟踪轨迹

    TFS是微软的应用软件生命周期管理(ALM)的解决方案产品,相比我们常见的一些ALM产品,例如HP ALM, IBM Rational, Atlanssian Jira等,其最大的区别在于TFS将软件 ...

  5. 批处理与python代码混合编程的实现方法

    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值, 比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写, bathome出品的命令工具包管理器bc ...

  6. SharePoint 2013 中代码创建列表查阅项字段

    1.首先,打开VS创建两个List Definition,分别是Address和City,如下图: 2.City列表里修改Title为City Name,其实内部名称还是Title,注意一下: 3.给 ...

  7. js代码之编程习惯

    编程习惯: 异常处理 如果你没有使用异常处理的习惯,这可能是因为你并未真正的理解它的作用.当你正确使用异常处理之后,你会发现你的代码最显著的变化就是:少了很多的 if-else 语句 . 虽然在 JS ...

  8. VS2017 无法修改代码编辑区的项背景颜色问题

    以前都是好好的,安装  ClaudiaIDE: https://github.com/buchizo/ClaudiaIDE 之后也没啥问题,用着用着代码编辑区自定义的颜色就没有了,好几台电脑都是这样, ...

  9. 【代码笔记】iOS-单项选择框

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

随机推荐

  1. linux内核在挂载ramdisk的过程中报错"RAMDISK: incomplete write (10739 != 32768)"如何处理?

    1. 原因 ramdisk大小不够 2. 解决方法 在启动变量bootargs中添加参数"ramdisk_size=10000000"即可

  2. Kotlin 之操作符重载

    Kotlin 之操作符重载   参考: kotlin in action kotlin 官方参考文档 运算符重载 Kotlin允许我们为自己的类型提供预定义的一组操作符实现(这些操作符都对应的成员函数 ...

  3. Python脚本实现Linux/MAC中Xmind Zen去水印等其他功能的过程(V0.1)

    说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明.功能简介 去除软件右上角激活按钮 去除导出时激活弹窗 去除导出PDF文 ...

  4. DataSource接口 Connection pooling(连接池

    一.DataSource接口是一个更好的连接数据源的方法:  JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实 ...

  5. Flutter AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换

    Flutter AppBar 自定义顶部按钮图 标.颜色 属性 描述 leading 在标题前面显示的一个控件,在首页通常显示应用 的 logo;在其他界面通常显示为返回按钮 title 标题,通常显 ...

  6. linux本地检测tomcat是否启动成功

    @参考文章 原文如下: linux本地检测如何tomcat是否启动成功? 解决方法: 1.curl 127.0.0.1:8080 第一可以知道本地是否可以访问tomcat,返回页面代码 2.tail ...

  7. MockMvc 进行 controller层单元测试 事务自动回滚 完整实例

    package com.ieou.ms_backend.controller; import com.google.gson.Gson; import com.ieou.ms_backend.dto. ...

  8. 2019年Java中高级面试题总结(8)

    116.什么时候使用访问者模式? 访问者模式用于解决在类的继承层次上增加操作,但是不直接与之关联.这种模式采用双派发的形式来增加中间层. 117.什么时候使用组合模式? 组合模式使用树结构来展示部分与 ...

  9. 与TypeScript的一场美丽邂逅

    TypeScript(一)前言:当你点开这篇文章时,我相信你已经在很多地方都已经听说过或者见过TypeScript了.但是可能对TypeScript依然有很多问号:TypeScript到底是什么?为什 ...

  10. Ehcache配置文件ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http:// ...