【问题标题】:Gang of Four - Design Patterns - are those pattern samples coded in outdated way?四人组 - 设计模式 - 这些模式示例是否以过时的方式编码?
【发布时间】:2011-04-21 19:40:55
【问题描述】:

所以要澄清我的问题...臭名昭著的 GoF 书中的每个模式 - 设计模式 Elements of Reusable Object-Oriented Software - 在 C++ 中有它的代码示例。

这些是最新的吗?还是现在 C++ 中的代码看起来很不一样?

我之所以这么问,是因为当我在最后一个问题中发布我的代码时,许多 C++ 开发人员告诉我应该摆脱指针,那里广泛使用的指针......

【问题讨论】:

  • 这是一个常见问题。再举一个例子,Sedgewick 的 C++ 中的算法 是一本关于算法的优秀文章,但它的 C++ 代码相当糟糕。
  • 本书使用现代 C++ 作为示例:leanpub.com/design-patterns-modern-cpp [免责声明:我是作者]

标签: c++ design-patterns coding-style


【解决方案1】:

它们有点过时了,是的。但这些书的部分观点是,这些模式在几种不同的语言和几种不同的风格中都很有用。因此,尽管代码有点陈旧,但其背后的想法却并非如此,而这些想法在这些书中很重要。

我希望看到一些利用元编程技术的模式实现。我强烈怀疑某些模式,例如桥接、适配器和可能的外观,使用元编程实现起来要简单得多。从另一个答案和阅读描述来看,看起来Modern C++ Design: Generic Programming and Design Patterns Applied 可能是一本适合这类事情的好书。不过我不能亲自担保。

除了可能使用泛型编程和模板技术之外,主要区别在于裸指针在当今的 C++ 中很少见。通常应该使用有效的智能指针类型,因为它们可以为您处理很多资源管理问题。坦率地说,除非您非常清楚自己在做什么,否则我不建议您尝试基于通用编程的设计。

以下是在各种上下文中使用哪种类型的智能指针的一些示例。这些示例假设您有一个包含 TR1(技术报告 1)扩展的 C++:

当你有一个指向它的对象完全拥有的东西的指针时,使用::std::auto_ptr(或C++1x 中的::std::unique_ptr)。请记住,::std::auto_ptr 不能存储在 STL 容器中,但::std::unique_ptr 没有这个问题。示例可能是组件模式(只要没有共享两个子组件)、外观模式和适配器模式。此外,工厂模式可能会产生 ::std::auto_ptrs(或 C++1x 中的 ::std::unique_ptrs),除非有充分的理由产生 ::std::shared_ptrs。

当你有一个指向共享所有权的东西的指针时,使用::std::tr1::shared_ptr。例如享元模式。此外,在某些情况下,组件模式也可能具有此属性。它在桥接模式中也可能有用。

当你有一个指向你在逻辑上不拥有的东西的指针时,::std::tr1::weak_ptr 是要走的路。请记住,如果您使用::std::tr1::weak_ptr,您还应该将::std::tr1::shared_ptr 用于逻辑上拥有(或共享所有权)指向项目的所有对象。观察者模式就是一个例子。

【讨论】:

  • 没有std::scoped_ptr,你把boost::scoped_ptrstd::unique_ptr混在一起了吗?
  • @Cubbi:哎呀。 :-( scoped_ptr 来自 boost。sigh 我还没有做很多 C++1x 特定的编程,所以正确的名称不是在我的指尖。谢谢你的捕获。它是现已修复。
【解决方案2】:

作者使用代码作为示例,而不是他们编写了生产代码。生产代码更健壮,可以检查错误和异常。此类书籍通常不显示这些内容,也不包含 try-catch 块或其他业务逻辑。

本书旨在提供关于如何设计程序以解决常见软件问题的想法和概念,而不是使用什么语法或代码。此外,在作者使用原始指针的任何地方,您都可以将它们替换为智能指针等(如果可能),以使其更加健壮。

但是,动态多态性只能通过指针或引用来实现,因此它们仍然有效,甚至可以在生产代码中使用。

此外,在过去十年中,C++ 代码的编写方式也发生了很大变化,这也是事实。因此,您可以将这些新技术与 GOF 书中介绍的旧想法/模式结合起来。例如,Andrei Alexandrescu 在他的书中使用模板来实现许多模式(模式):

Modern C++ Design: Generic Programming and Design Patterns Applied

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多