C++核心准则T.1:使用模板提高代码的抽象水平

共 3963字,需浏览 8分钟

 ·

2020-08-19 15:43

月季

T.1: Use templates to raise the level of abstraction of code

T.1:使用模板提高代码的抽象水平


Reason(原因)

Generality. Reuse. Efficiency. Encourages consistent definition of user types.

普遍性。重用。效率。鼓励用户类型的一致性。


Example, bad(反面示例)

Conceptually, the following requirements are wrong because what we want of T is more than just the very low-level concepts of "can be incremented" or "can be added":

概念上,我们希望T不仅限于可以进行增量操作或者可以作为被加数这样非常低水平的概念,因此下面的需求是错误的。

template
// requires Incrementable
T sum1(vector& v, T s)
{
for (auto x : v) s += x;
return s;
}

template
// requires Simple_number
T sum2(vector& v, T s)
{
for (auto x : v) s = s + x;
return s;
}

Assuming that Incrementable does not  support+ and Simple_number does not support +=, we have overconstrained implementers of sum1 and sum2. And, in this case, missed an opportunity for a generalization.

假设Incrementable不支持+而且Simple_number不支持+=,我们过分约束了sum1和sum2的实现者。而且,在这种情况下,失去了泛化的机会。

Example(示例)

template
// requires Arithmetic
T sum(vector& v, T s)
{
for (auto x : v) s += x;
return s;
}

Assuming that Arithmetic requires both + and +=, we have constrained the user of sum to provide a complete arithmetic type. That is not a minimal requirement, but it gives the implementer of algorithms much needed freedom and ensures that any Arithmetic type can be used for a wide variety of algorithms.

假设算术运算既需要+也需要+=,我们已经要求sum的用户提供完全的算术类型。这不是最小化的需求,但是它为算法的实现者提供了所需的更多自由,而且保证算术类型可以用于多种多样的算法。

For additional generality and reusability, we could also use a more general Container or Range concept instead of committing to only one container, vector.

为了额外的泛用性和重用性,我们也可以使用更通用的容器或范围概念代替特定的容器vector。


Note(注意)

If we define a template to require exactly the operations required for a single implementation of a single algorithm (e.g., requiring just += rather than also = and +) and only those, we have overconstrained maintainers. We aim to minimize requirements on template arguments, but the absolutely minimal requirements of an implementation is rarely a meaningful concept.

如果我们定义了一个要求用于特定算法的特定实现的操作的模板(例如只要求+=而不同时要求=和+)而且只要求这些,我们就过分约束维护者了。我们的目的在于最小化模板参数的需求,但是某一实现的绝对最小需求几乎不会成为有意义的概念。


Note(注意)

Templates can be used to express essentially everything (they are Turing complete), but the aim of generic programming (as expressed using templates) is to efficiently generalize operations/algorithms over a set of types with similar semantic properties.

模板可以用于从本质上表达任何东西(它们具备图灵完备性),但是泛型编程的目的(像使用模板表达的那样)是高效概括可以适用于具有相似语义属性一套类型的操作/算法。


Note(注意)

The requires in the comments are uses of concepts. "Concepts" are defined in an ISO Technical Specification: concepts. Concepts are supported in GCC 6.1 and later. Consequently, we comment out uses of concepts in examples; that is, we use them as formalized comments only. If you use GCC 6.1 or later, you can uncomment them.

注释中的需求是concept的用法。“Concepts”被定义在ISO技术规格中。GCC6.1之后的版本都支持Concepts。因此,在例子中我们注释掉相关代码;也就是说,我们只将它们用作标准注释。如果你使用GCC6.1之后的版本,你可以去掉注释符号。

译者注:concepts文档链接:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4553.pdf


Enforcement(实施建议)

  • Flag algorithms with "overly simple" requirements, such as direct use of specific operators without a concept.

  • 标记需求过于简单的算法,例如不用concept而直接使用特定操作符。

  • Do not flag the definition of the "overly simple" concepts themselves; they may simply be building blocks for more useful concepts.

  • 不要标记定义过于简单的concept本身;它们没准只是作为某个更有用的concept的一部分存在的。


原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#t1-use-templates-to-raise-the-level-of-abstraction-of-code


新书介绍

《实战Python设计模式》一书是作者最近出版的新书,拜托多多关注!

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。




觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!



浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报