博客 阅读时间 4 分钟

C++ 标准与最佳实践:完美组合

分享本文
C++ Standards and Best Practices: The Perfect Combo

C++ 停滞了许多年,许多开发者都深信这门语言会落得与 COBOL、Fortran 和 VB6 同样的命运。然而,出乎意料地,C++ 浴火重生,新标准正在显著改变这门语言的使用方式。

C++ 的演进以及众多实用特性的加入,并不意味着 C++98 标准是个糟糕的标准。事实上,它为开发各种应用程序提供了许多有用的特性。有许多设计良好的老牌 C++ 项目,其代码易于维护和演进。

例如,由 John Carmack 开发的 Doom 就是一个设计良好的 C++ 游戏,它只使用了 C++98 标准的基本机制。

下面是您在搜索关于 Doom 3 的文章时能找到的那种评价:

I spent a bit of time going through the Doom3 source code. It’s probably the cleanest and nicest looking code I’ve ever seen.

成功的关键不在于语言的丰富性,而在于遵循让代码易读、易维护、易演进的最佳实践。

诚然,并非所有开发者都有 John Carmack 那样的功力,也许他们需要一门更强大的语言,帮助他们专注于应用程序的业务层。然而,即使您使用最强大的编程语言,如果采用糟糕的做法,代码也会非常难以理解或维护。

即使使用汇编这样复杂的编程语言,我们仍然可以拥有整洁的代码:《波斯王子》游戏就证明了,即使使用底层编程语言,保持简单依然行之有效。

《波斯王子》最初由 Jordan Mechner 开发,于 1989 年在 Apple II 上发布;它代表了当时电子游戏动画质量的一次巨大飞跃。2012 年 4 月 17 日,Jordan Mechner公布了《波斯王子》的源代码。研究它的代码库时,我们可以看到:

  • 命名清晰、易于理解。
pp2
  • 代码被拆分成许多小的子例程。

6502 汇编语言非常底层,代码应用了“分而治之”的原则,使其更易于理解和维护。确实,代码被拆分成许多小的子例程,更易读、更易维护。下面是其源代码中的一个小型子例程示例:

pp3

回到新的 C++ 标准:我们可以利用所有有用的新特性写出整洁的代码。另一方面,如果我们遵循糟糕的做法,最终得到的代码可能难以理解和维护。例如,这篇有趣的文章就谈到了 auto 关键字的过度使用。

Bjarne Stroustrup 和 Herb Sutter 认识到,需要一套编写高效现代 C++ 代码的基本准则。几年前,他们推出了“C++ 核心指南”。下面是他们在 GitHub 仓库中说明的推出这套指南的动机:

This document is a set of guidelines for using C++ well. The aim of this document is to help people to use modern C++ effectively. By "modern C++" we mean C++17, C++14, and C++11. In other words, what would you like your code to look like in 5 years' time, given that you can start now? In 10 years' time?

The guidelines are focused on relatively high-level issues, such as interfaces, resource management, memory management, and concurrency. Such rules affect application architecture and library design. Following the rules will lead to code that is statically type safe, has no resource leaks, and catches many more programming logic errors than is common in code today. And it will run fast -- you can afford to do things right.

有了指南固然有用,但开发者通常不可能花上几个小时人工审查代码来检查是否符合指南。因此,最好使用工具来执行这些检查。

clang-tidy 就是要用的工具;它提供了许多有趣的检查项,其中包括对一些 CppCoreGuidelines 规则的检查。

总而言之,这些新的 C++ 标准是一个可喜的进展——感谢 C++ 社区中每一位为之做出贡献的人,因为这绝非易事。然而,如果没有基本的最佳实践和准则,代码很快就会变得不可读、不可维护、难以演进。

分享本文