# 面向对象/设计模式

事实上，深入理解面向对象更推荐阅读《Java 编程思想》，本书已经包含在 9.11 节之中（目前来说，更推荐阅读同一作者新出的《On Java》）。

虽然面向对象本身是利大于弊的，但其带来的设计模式却是不折不扣的糟粕。设计模式的出现是为了补救面向对象带来的各种问题，以达到一种“最佳实践（Best Practice）”的目的。因此，这些年一直有用函数式编程取代面向对象设计模式的呼声，尽管我个人认为希望不大。如果你有意向深耕 Java，那设计模式确实有必要学一学，但也最多推荐你随便读两本有关的书，至于再多就不建议了，设计模式尽量要在实践中尝试运用而不是啃书。

如果你打算从事前端工作、数据科学、人工智能等与狭义上的软件工程等关系不那么大的工作，我不建议你去学习设计模式，因为意义不是很大。相反，如果你打算从事前端，做数据科学工作，反而建议你尝试了解更多函数式编程的思想，这里没有相关书单推荐，并且也不建议看书，函数式思想本身高度融合进了各种编程语言之中，在实际使用有函数式特性的语言的过程中，自然就能融会贯通。

另外，使用 Python/JavaScript 等脚本语言时也不建议直接套用 Java 设计模式，这只会使你的代码变得不伦不类。当然，我这里讨论的只是狭义上的以 GoF 设计模式为基础的设计模式，至于广义上的设计模式，其意义更偏向于“最佳实践”，不在这里的讨论范围内。个人认为，主流语言中只有 Java 是有必要在多数代码上套用设计模式的，而其他多数语言只有在少数情况下有必要套用设计模式。至于 Python 这种异常灵活的语言，就更没有必要套用设计模式了，有时间套设计模式不如去学学怎么写出 Pythonic 的代码。

* **设计模式**：中文版正文 268 页，出版于 1995 年，双色印刷。提出了著名的 GoF 23 种设计模式，是设计模式以及面向对象领域最经典的读物。尽管本书并不厚，但理解难度仍然是比较高的，不推荐作为入门读物，然而作为世界上第一本也是最知名的有关设计模式的书，仍然建议每个 Java 程序员（甚至非 Java 程序员）都读一读。书中使用 Smalltalk 和 Java 作为示例。翻译一般。
* **图解设计模式**：中文版正文 291 页，日文原版出版于 2004 年，黑白印刷。使用友好的方式分别介绍了 GoF 23 种设计模式，比较适合入门。书中使用 Java 作为示例。翻译不错。
* **面向对象是怎样工作的**：中文版正文 278 页，日文原版出版于 2011 年，双色印刷。A5 大小的小书，很快就能读完。内容比较容易理解，大致梳理了与面向对象有关的不少要点（例如设计模式、函数式编程与 UML），适合对面向对象这一概念比较困惑的初学者，不适合入门一年以上的读者（因为太基础）。翻译不错。
* **UML 基础、案例与应用（第 3 版）**：中文版正文 284 页，英文原版出版于 2004 年，黑白印刷。虽然是老书，但由于 UML 标准近十几年几乎没有任何推进（即使有推进大家也仍在广泛使用 1997 年的版本），所以现在看起来甚至感觉内容新的离谱（指一大堆十几年前更新的 UML 标准至今没多少人用上）。个人认为，至少在讲清楚 UML 一块，这本书是少有的好选择，本身内容质量也很过关。虽然我对 UML 整体持着批判与厌恶的态度，但这不妨碍这是一本不错的书。不过通常来说没有必要读一本专门介绍 UML 的书，网上的 UML 快速入门读一遍就足够了，我推荐这本书仅仅是因为软件工程专业需要学习 UML，所以放在这作为参考书而已。翻译一般。
