四人帮 - 设计模式 - 这些模式示例是用过时的方式编码的吗?

20

为了澄清我的问题... 《设计模式:可复用面向对象软件的基础》这本著名的GoF书中,每个模式都有相应的C++代码示例。

那些示例是否是最新的?还是现在的C++代码看起来已经非常不同了?

我问这个问题是因为当我在上一个问题中发布了我的代码时,许多C++开发人员告诉我,我应该摆脱指针,而那些示例中广泛使用指针...


2
这是一个常见的问题。另一个例子,Sedgewick的《C++算法》是一本关于算法的优秀教材,但其中的C++代码相当糟糕。 - James McNellis
本书使用现代C++作为示例:https://leanpub.com/design-patterns-modern-cpp 【免责声明:我是作者】 - Dmitri Nesteruk
2个回答

16

它们有点过时,没错。但是这些书的一部分意义在于这些模式在多种不同语言和风格中都很有用。因此,虽然代码有点老旧,但其中背后的思想并没有过时,这些思想才是这些书的重要内容。

我希望能看到一些利用元编程技术的模式实现。我强烈怀疑某些模式,例如桥接、适配器和可能的外观模式,使用元编程实现会更少繁琐。从其他答案和描述中可以看出,《现代C++设计:泛型编程与设计模式应用》可能是这种情况下的一本好书。不过我个人不能担保。

除了可能使用通用编程和模板技术之外,主要区别在于裸指针在C++中已经很少见了。现在有一些有效的智能指针类型,通常应该使用它们,因为它们处理了大量的资源管理问题。坦率地说,除非你非常了解你正在做什么,否则我不建议尝试基于通用编程的设计。

以下是各种情境下使用哪些智能指针类型的示例。这些示例假定您有一个包括TR1(技术报告1)扩展的C++:

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

当你拥有指向具有共享所有权的东西的指针时,请使用::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
@Cubbi:糟糕。:-( scoped_ptr 是来自 boost 的。叹气 我还没有做过很多 C++1x 特定的编程,所以正确的名称不在我的指尖上。感谢你的提醒。现在已经修复了。 - Omnifarious

10

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

该书的目的是介绍想法、概念,以及如何设计程序解决常见的软件问题,而不是语法或代码的使用。此外,无论作者在哪里使用原始指针,您都可以使用智能指针等替换它们(如果可能),使其更加健壮。

然而,动态多态性只能通过指针或引用实现,所以它们仍然是有效的,甚至在生产代码中也会使用。

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

现代C++设计:通用编程和设计模式应用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接