本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第3章,第3.11节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。

3.11 类名、成员函数名、参数类型和文档

C++面向对象高效编程(第2版)
类通常被另一个程序员用来创建对象(或者通过继承创建其他类),而方法则被这些对象(可能提供参数)调用。我们不仅要为类和其中所包含的方法提供有意义的名称,还应该为成员函数的参数使用合适的名称,这样,客户可以清楚地知道某个特别参数的用途。许多程序员只指明函数接受的参数类型,而不给出名称,必须改掉这个坏习惯。当然,编译器不会在意你选择什么名称,它只负责匹配类型。但是,参数名可以向客户传达许多信息。除此之外,我们还要注意使用正确的参数传递模式(值、引用或指针)。

在大多数情况下,仅通过查看名称,无法清楚地了解类及其成员函数的用途。我们必须提供详尽的文档(documentation),其内容包括:

类的用途
预定用户(打算给谁使用)
它所依赖的类(如果有)
类的限制是什么
它期望从客户方面获得什么1
在多线程系统中,还要进一步说明在多线程执行的环境中,类是否可用,这非常重要。大多数公司、项目和架构都要求类的设计者和实现者提供更多详细的文档。在设计和为类编写文档时,遵循所有的指导原则非常重要。

还有一点也至关重要,类的设计者(和实现者)必须非常清楚地说明创建对象的限制条件。例如,某些类要求只能在运行时栈中创建类的对象(以确保自动销毁);而另一个类可能限制只能在动态堆上创建对象(即对象必须只能用new操作符创建)。这些对创建对象的限制不是很常见,但是,如果遇到也不必惊讶。用文档说明创建对象的限制是个不错的主意,但并不是最佳方案,最好是能通过语言强制执行这些限制。在C++中,控制对象在何处创建非常容易。实现它们的技巧将在第11章中介绍。

类中包含的每种方法,都需要一个类似的说明文档。类文档(class documentation)将客户的注意力集中在一个方向,而且每种方法的文档(或说明)进一步阐明了该方法在类中完成的工作。这样的文档不应该是一本厚厚的书,它可以是头文件中的简单注释(对于简单方法),或是和类一起提供的辅助文档。大文档会让客户感到害怕,他们担心类太复杂,难以理解(客户认为正是这些原因导致需要大的文档),因此不愿意使用它。一个设计优秀并带有适宜说明的类将吸引客户的注意力,并鼓励她们使用。这类似于一个维护良好的公园,它引诱你入园漫步。在头文件中作简明扼要的注释非常有用,因为大多数程序员会首先在头文件中查找信息。此外,每种方法也应指明它所接受的每个参数的用途。在使用引用和指针(大多数是指针)的情况下,必须清楚地定义存储区所有权的职责(ownership responsibility),否则,会导致内存泄漏或运行时崩溃,扰乱系统程序的正常运行。事实上,大部分与资源相关的问题都是由于类的实现者和用户未明确各自的职责引起的。当方法返回值(引用,指针或值)给调用者时,也需要明确地定义存储区所有权职责。要养成尽可能使用const参数和const成员函数的习惯,因为编译器能识别const元素,而且const可防止意外的修改。语言不能阻止恶意用户的所作所为,它只能防止用户在使用时出现的意外错误。

你可能会问,为什么要对文档和参数传递如此小题大做?为什么不能让编译器来处理这一切?问题是,很多程序员可以完成的事情,编译器根本检测不到。编译器无法读取你的想法,也不知道函数声明中某个参数的用途。编译器所能见的只是类型名,它根本不关心函数的参数名。但是,对我们而言,这些参数名有实际意义。作为程序的设计者,我们在设计中将特定议题作为目标,并尝试解决一些问题。编译器完全不明白这些议题,对它而言,任何程序都是一系列的指令而已,它无法知晓“设计蓝图”。这就是文档、约定(convention)和指导原则发挥作用的地方。

1这可能出人意料,但是许多类确实依赖客户所提供的某些服务。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...相关推荐

  1. 《C++面向对象高效编程(第2版)》——导读

    前言 C++面向对象高效编程(第2版) 面向对象软件开发已逐渐成为开发软件的首选.优秀的面向对象软件开发人员.设计人员.系统架构师对其需求与日俱增.要想成为一名成功的面向对象编程(OOP)人员必须忘却 ...

  2. 《C++面向对象高效编程(第2版)》——2.29 泛化关系(is-a)

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.29节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  3. 《C++面向对象高效编程(第2版)》——2.20 什么是多线程安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第章,第2.20节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

  4. 《C++面向对象高效编程(第2版)》——2.30 has-a关系的重要性

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.30节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  5. 《C++面向对象高效编程(第2版)》——3.13 采用语义

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.13节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  6. 《C++面向对象高效编程(第2版)》——3.17 编写内存安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.17节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  7. 《C++面向对象高效编程(第2版)》——2.16 识别成员函数的目标对象

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.26节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  8. 《C++面向对象高效编程(第2版)》——3.4 赋值操作符

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.4节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

  9. 《C++面向对象高效编程(第2版)》——3.16 从函数中返回引用

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.16节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

最新文章

  1. [转] SQL Server中变量的声明和使用方法
  2. 在JavaScript中生成随机字符串/字符
  3. C#根据当前时间确定日期范围(本周、本月、本季度、本年度)
  4. Android: RecyclerView.ViewHolder、Adapter
  5. 针对标签属性data-**的使用
  6. wxPython4.0中ListCtrl入门
  7. 网络协议:TCP可靠传输
  8. PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句
  9. C# WinForm登录窗口代码
  10. 本机mysql无法进行碎片整理有什么用,试试mysql数据碎片整理吧解决astgo经常死机变慢的问题...
  11. 计算机操作系统笔记(四)
  12. 三角网导线平差实例_导线平差实例(一):简易平差
  13. b级计算机机房标准,B级电子信息系统机房技术要求国标GB50174–2008
  14. vue2百度地图修改比例尺位置
  15. 解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)
  16. 从专家系统到知识图谱(好文)
  17. 买不起NAS,用硬盘也可以玩起来
  18. 绍耕反失败学课程(06)——在正确时间做正确的事情,轻装上阵抛弃负担
  19. 计算机图形学 实验6 直线的裁剪—Cohen Sutherland裁剪算法(MFC中)
  20. ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器

热门文章

  1. POJ1276Cash Machine
  2. emacs按键绑定详解
  3. 满足极高读写性能需求的Key-Value数据库
  4. 图片服务器的url hash架构
  5. ZendFramework的介绍、安装和实例运行
  6. Request.ServerVariables获取环境变量
  7. C#中获取程序当前路径的集中方法
  8. FAIL - Deployed application at context path / but context failed to start
  9. redis源码分析--zslRandomLevel位运算解析
  10. 从0开始搭建编程框架——主框架和源码