【问题标题】:Common C++ Architecture [closed]通用 C++ 架构 [关闭]
【发布时间】:2012-03-25 02:38:04
【问题描述】:

我从事 C++ 和 Java 编程已经有一段时间了,对常见的 C++ 架构有一些疑问。

当我使用 Java 编程时,我尝试模仿标准库,即使用诸如 Iterable 和 Serializable 之类的接口,并具有类似的命名约定和功能。然而,对于 C++,我在尝试模仿 STL 约定(迭代器除外)时犹豫不决。

我将其归结为以下问题(以下是要实施的常见约定):

  • 分配器
  • 接口(只有纯虚方法的类)
  • 模板而不是抽象基类
  • 限制异常抛出...
  • ...或者让一个类选择性地抛出异常(例如在标准流中)
  • 将 typedef 用于或多或少的明显类型(reference_type、pointer_type、value_type、...)

还是说C++的标准根本不值得模仿?

感谢您的意见/回答!

【问题讨论】:

  • 嗯。这很难以有意义的方式回答。你真的在问六个不同的大问题; “为什么 STL 使用 ”,对于 中的 x。这太多了。我投票结束这个问题,因为它的范围过于广泛。尝试询问其中之一。例如“为什么 STL 使用分配器?我从来没有使用过它们,我想知道它们为什么在那里。我应该编写自己的类来由分配器参数化吗?”。
  • 好吧,如果我把它们分成更多的问题,它们都会是这样的:为自定义容器使用分配器是常见的约定吗?使用接口是通用约定吗?依此类推……对于我自己的项目,我更喜欢遵循良好的实践,然后从我的项目到其他人的项目的跳跃较小。所以我真正想知道的是,“遵循 STL 风格的编码是一种好习惯吗?”。

标签: c++ oop architecture stl


【解决方案1】:

这在很大程度上取决于您的项目。一般的建议似乎是:不要为 C++ 制定一个具体的标准。

例如对于 typedef,“支持”和“反对”都有多种意见。

C++ 的具体编码风格在 C++ 中不太重要的原因是该语言没有提供强制和检查这些风格的方法。 IE。语法不容易解析,因此几乎没有工具可以有意义地检查/重构 C++ 代码。 这意味着样式检查的重担落在了程序员的肩上。 IE。执行样式指南没有多大意义,因为它们节省的大部分时间都浪费在手动样式检查上。

所以只要使用您的项目/公司使用或决定使用的任何东西。

以下是我的个人喜好:

分配者:没有意见。如果您需要自定义分配器,您可能会比我更清楚如何使用它。
接口:如果您正在做任何对性能敏感的工作 - 不要这样做。它们使实时应用程序中的事情明显变慢。抽象虚拟类和 pImpl 模式。
模板而不是抽象基类:视情况而定。但普遍的看法似乎是模板应该用于类似容器的功能和其他一些简单的情况。否则,这是一个体面的模式。调试这些仍然是一个严重的痛苦,并将在未来几年内。
限制异常抛出: 是的,就这样做。尽量不要使用异常,信不信由你,在 2012 年它们仍然没有得到普遍支持。
使用 typedefs::尝试使用 c++11 的 std::auto。否则,它们会让你的生活变得更加艰难,因为它们已经完成了#define 宏的一半。我个人会使用 IDE(或 Vim)来缓解长名称的打字压力并编写长名称。

【讨论】:

  • 模板具有难以解释的强大功能。 Alexandrescu 在Modern C++ Design方面做了很好的尝试。
  • Re: 限制异常抛出 - 你有这方面的例子吗?我从来没有见过最近的编译器没有,即使在嵌入式空间中也是如此。
  • 我的意思是限制异常抛出只是在(大多数或全部)方法中使用 throw(...) 关键字。
  • @CollinHockey 是的,XBoX 编译器不支持异常。在谈到 C++ 时,很多都是在 gamedev 代码中,所以这不是小事。
【解决方案2】:

我使用 C++ 的次数越多,就越不喜欢模仿我发现的最好的库。当我们在团队中找到一名初级开发人员时,问题就出现了。他们会理解基础知识,但不会理解语言的微妙之处。他们可能知道如何使用模板语法创建地图或列表,但在将其应用于另一个对象时却无法理解。调试和执行代码通读所增加的复杂性也会占用宝贵的时间来解决问题或推进您的产品。

我已经逐渐倾向于使用该语言的最基本功能,这通常会使代码处于更自然可读的状态。当我在 8 到 12 个月后回过头来寻找代码中的一个晦涩的错误时,我后悔偏离了这条道路。

另一方面,Java 具有更简单的库实现,这对于初级 Java 开发人员非常了解。我确实发现初级 Java 开发人员往往比初级 C++ 开发人员更了解该语言。话虽如此,由于成为中级 C++ 程序员所需的思想水平较低,C++ 开发人员有更多机会成为真正的胜任者。

【讨论】:

  • 我不买“增加的复杂性”。就我而言,标准库在降低复杂性方面非常出色。诚然,编写易于使用的通用库很难,但总是如此。忽略这些功能会大大增加客户端代码的复杂性。
  • 听起来他们在教 Java 方面比 C++ 做得更好。此外,如果您有很多初级开发人员,那么您将不得不用任何语言将事情简化。我在 Python 和 C 中也遇到过这个问题。您可能会感到惊讶,或者您可能不会感到惊讶,有多少初级开发人员不明白您为什么需要指向指针的指针。
  • 那么...搞砸C++标准风格,制作我自己的框架风格?
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 2021-02-07
  • 1970-01-01
  • 2017-02-10
  • 2011-04-01
  • 2020-04-23
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多