作者简介
克劳斯·伊格伯特是一位自由职业的C++培训师和顾问。他分享了自己超过15年的C++经验,通过全球广受欢迎的培训课程,并经常在C++会议上发表演讲。自2010年获得博士学位以来,他一直专注于大规模软件设计以及如何提高软件的可维护性。他的主要兴趣在于如何为变化和可扩展性进行设计,以及如何应用设计模式来简化任务。
内容介绍
软件设计
从我的角度来看,良好的软件设计是每一个成功软件项目的精髓。然而,尽管它起着根本性的作用,关于这个主题的文献却非常少,也很少有关于应该如何做以及如何正确做事的建议。为什么会这样呢?因为这很难,非常难。可能是我们在编写软件时所面临的最困难的方面。这是因为没有单一的“正确”解决方案,也没有可以代代相传的“黄金”建议。一切都取决于具体的情况。
尽管存在这一限制,我将给出如何设计优良、高质量软件的建议。我会提供设计原则、设计指南和设计模式,帮助你更好地理解如何管理依赖关系,并将你的软件变成可以在数十年间持续维护的东西。如前所述,没有“黄金”建议,这本书也不会提供任何终极或完美的解决方案。相反,我试图展示良好软件设计中最基本的方面、最重要的细节、多样性和不同设计的优缺点。我还将阐述内在的设计目标,并演示如何使用现代C++来实现这些目标。
现代C++
十多年以来,我们一直在庆祝现代C++的诞生,赞扬语言中的众多新特性和扩展,并因此造成了这样的印象:现代C++能够帮助我们解决所有与软件相关的问题。然而,在这本书中并非如此。这本书并不假装只要在代码中加入一些智能指针就能使代码变得“现代”或自动产生良好的设计。此外,这本书也不会将现代C++仅仅展示为一系列的新特性。相反,这本书会展示语言哲学的演变过程以及我们如今实现C++解决方案的方式。它强调的是如何利用现代C++的思想和理念来改进软件设计,而不是简单地罗列新特性。通过这种方式,读者可以理解到现代C++不仅仅是语法和功能上的更新,更是一种编程思维和方法论的进步,这种进步影响着我们编写高效、可维护和可扩展代码的方式。
当然,我们也会看到大量的代码,并且这本书将充分利用较新的C++标准(包括C++20)的特性。然而,本书也会努力强调设计是独立于实现细节和所使用的特性的。新特性并不会改变关于什么是良好设计或不良设计的原则;它们只是改变了我们实现良好设计的方式,使实现良好设计变得更加容易。因此,这本书会展示和讨论实现细节,但(希望如此)不会迷失在这些细节中,而是始终专注于大局:软件设计和设计模式。通过这种方式,读者不仅可以了解到如何使用现代C++特性来改进代码实现,还可以掌握超越具体语言特性的、更加普遍适用的设计原则和方法,确保即使技术不断进步,这些核心设计理念依然具有指导意义。
设计模式
一旦开始提及设计模式,就不可避免地会唤起人们对面向对象编程和继承层次结构的预期。是的,这本书将展示许多设计模式的面向对象起源。然而,它也将着重强调利用设计模式的方式并非只有一种。我将演示设计模式的实现是如何演变和多样化的,展示了如何利用多种不同的编程范式来实现设计模式,包括面向对象编程、泛型编程和函数式编程。这本书承认现实中并不存在唯一的正确范式,并不假装只存在一种适用于所有问题的单一方法或万能解决方案。相反,它试图展现现代C++的真实面貌:结合所有编程范式的可能性,将它们编织成一张坚固耐用的网,创造出能够经受数十年考验的软件设计。通过这种方式,本书不仅探讨了设计模式的传统面向对象实现,还展示了如何在现代C++中灵活运用各种编程范式的优势,以适应不断变化的需求和技术进步。
我希望这本书能成为C++文献中缺失的一环。我希望它能像对我曾经的帮助一样帮助到你。我希望书中包含了一些你一直在寻找的答案,并为你提供一些你所欠缺的关键见解。我还希望这本书能在一定程度上让你感到有趣并激发你阅读全部内容的动力。然而,最为重要的是,我希望这本书能向你展示软件设计的重要性以及设计模式在其中扮演的角色。因为,正如你将会看到的,设计模式无处不在。通过这本书,我希望能够传达出良好的软件设计不仅仅是为了应对当前的问题,更是为了构建能够适应未来变化、易于维护和扩展的系统。设计模式作为经过验证的解决方案模板,在解决软件开发中的常见问题时提供了指导和启示。它们不仅体现了前人的智慧结晶,也为开发者提供了一种共同的语言,使得团队成员之间可以更高效地交流和协作。希望读者能从这本书中深刻理解到这一点,并将其应用到自己的实践中去。