第三章 编码风格

发布时间 2023-11-29 10:51:26作者: Mesonoxian

第三章 编码风格


注释

总结起来一句话: 优秀的代码本身就容易阅读,注释只需要提供有用的附加信息

分解

分解(decomposition) 指将代码分为小段.理想情况下,每个函数或方法都应该只完成一个任务.任何非常复的子任务都应该分解为独立的函数或方法.

重构(refactoring) 指重新构建代码的结构.下面是一些可用来重构代码的技术:

  • 增强抽象的技术
    • 封装字段:将字段设置为私有
    • 使类型通用:创建更通用的类型
  • 分割代码以使其更合理的技术
    • 提取方法:将较大方法的一部分转换为新方法
    • 提取类
  • 改善代码名称和位置的技巧
    • 移动方法或字段
    • 重命名方法或字段
    • 上移(pull up):移到基类中
    • 下移(push down):移到派生类中

命名

C++编译器有几个命名规则:

  • 名称不能以数字开头(如:2015class)
  • 包含两个下划线的名称作为保留名称,不该使用(如:my__name)
  • 以下划线开头跟着大写字母的名称是保留名称,不该使用(如:_Name)
  • 全局名称空间中以下划线开头的名称是保留的,不该使用(如:_name)
适当的名称 不当的名称
区分度高的名称:
sourceName,destinationName
笼统的名称
thing1,thing2
表明全局身份:
g_Settings
太长:
globalUserSpecificSettingsAndPreferences
表明成员身份:
m_nameCounter
太简单模糊:
mNC
简单明确:
calculateMarigoldOffset()
太宽泛:
doAction()
赏心悦目:
mTypeString
只有计算机喜欢:
typeSTR256
描述性名称:
errorMessage
非描述性名称:
String
无缩写:
sourceFile
有缩写
srcFile,dstFile

计数器

通常来说,C风格的计数器喜欢将i与j作为计数器.这是非常危险的行为,特别是考虑嵌套循环时.i与j有时难以区分.

因而,与使用i和j相比,将 rowcolumn 作为索引会更容易.

有些程序员也喜欢使用 outerLoopIndexinnerLoopIndex 等计数器.

前缀

前缀 示例 前缀含义
m
m_
mData
m_data
成员
s
ms_
sLookupTable
ms_lookupTable
静态
c
c_
cMaximumLength
c_maximumLength
常量
b_
is
b_completed
isCompleted
布尔值
g_ g_Settings 全局

匈牙利命名法 :使用更加详细的前缀而不是一个字母表示附加信息
好的名称会传递与用途有关的信息,而不会使代码阅读困难

常量

在一般情况下,应当将常量放到名称空间中去.

在所有情况下都不应该使用常量字面量表示某个常数,这种不经过解释的常量又称"魔数".特别是从C++20开始,标准库包含了一组预定义的数学常量,定义在 中的 std::numbers 名称空间中,包括e,pi,sqrt2,phi等.

在大部分情况下,使用引用代替指针,特别是需要常量的地方.

命名风格

  • 匈牙利命名法 :匈牙利命名法是早期的规范,主要在IDE还不智能的时期,将对象的数据类型与相关信息缩写作为前缀方便阅读.

    • 例如
      i:int c:char f:float str:string b:bool by:byte a:array w:word dw:double word
      fn:function l:long n:short p:pointer lp:long pointer sz:string with zero
    • 匈牙利命名法:cMyName,iMyAge
  • 驼峰命名法:小驼峰命名法要求第一个单词首字母小写,后面其他单词首字母大写.大驼峰法则在小驼峰法的基础上首字母大写. 一般驼峰命名法指小驼峰命名法.

    • 小驼峰法: myAge,myName,idChecker
      大驼峰法: MyAge,MyName,IDChecker
  • 帕斯卡命名法:一般指大驼峰命名法.

  • 下划线命名法:要求单词与单词之间通过下划线连接即可.

    • 下划线命名法: my_age,man_height

代码风格

  • K&R风格: Kernighan&Ritchie风格,左花括号与使用它的语句同一行
void function()
{
    if(bTrue){
    //do someting......
    } 
    else{
    //do someting......
    }
}
  • Allman风格: 每个花括号单独占一行
void function()
{
    if(bTrue)
    {
        //do someting......
    } 
    else
    {
        //do someting......
    }
}
  • Whitesmiths风格: 换行基于Allman风格,但具体缩进有不同
void function()
    {
    if(bTrue)
      {
      //do something
      }
   else
      {
      //do someting......
      }
   }