
前言
Julia是一个为开发出高性能应用程序而设计的高级编程语言,旨在提高开发人员的生产力。其动态特性可以让你快速做一个小规模的测试,然后移植到大的应用程序中。它的内省工具可以通过分析高级代码如何翻译成低级代码及机器码来实现性能优化。它的元编程更能帮助高级开发人员为特定领域的使用建立自定义的语法。它的多重分派和泛型方法功能使得开发人员可以轻松地在已有的方法上扩展新功能。鉴于以上优点,Julia是可以在许多行业广泛使用的优秀程序开发语言。
这本书满足了那些期望编写高效代码、提升系统性能以及设计出易维护软件的Julia开发人员的需求。从Julia语言诞生到2018年8月的里程碑版本1.0,许多源于Julia核心开发人员和Julia资深用户的优秀设计模式都已尽收囊中。这些设计模式有时在博客或峰会中被提及,有时出现在Julia的Discourse论坛的某一次讨论中,还有时出现在Julia Slack社区成员间的非正式谈话中。本书收录了这些设计模式,阐述了设计高质量的Julia应用程序的最佳实践。
本书的首要目标是规范这些被充分证明过的设计模式,以便于Julia开发者社区吸收和利用。
总结和命名这些模式有如下好处:
·能让开发者之间的交流变得更加容易。
·能让开发者更好地理解和使用这些设计模式的代码。
·能让开发者明确何时正确地使用设计模式。
本书的目标简单但十分强大,读完本书,你会在使用Julia语言设计和开发软件时变得轻松。除此之外,本书提供的材料对未来关于Julia设计模式的讨论十分有用。根据以往经验,新的设计模式将会随着Julia语言的持续演化不断地加入进来。
希望你能尽享阅读本书的乐趣!
本书的读者对象
本书的目标读者是那些想为大型应用程序编写符合Julia语言特性的代码的初中级Julia开发人员。本书不是一本基础书籍,所以希望你有一定的编程基础。如果你对面向对象编程范式很熟悉,会发现本书非常有用,它会告诉你如何采用不同的方法解决同一个问题,而Julia的方式常常是更好的。
本书提及的许多设计模式广泛适用于所有领域和使用场景。不管你是数据科学家、研究员、系统开发人员还是企业软件开发者,都会因在你的项目中使用这些设计模式而获益。
本书结构
第1章介绍设计模式的历史和如何利用设计模式开发应用程序。它包含了一些适用于任何编程语言和编程范式的工业级软件设计原则。
第2章探讨如何规划大型程序及如何管理其依赖关系,其中解释了如何开发新的数据类型和表示层级关系。
第3章解释函数是如何定义的以及多重分派是如何运行的,还讨论了参数化方法和接口。针对这些方法和接口,不同的函数可以基于预定契约彼此正确地工作。
第4章介绍宏和元编程以及如何将源代码转换成另外一种形式,还描述了一些高效开发和调试宏的技巧。
第5章介绍与代码重用相关的设计模式,包含通过组合实现代码重用的委托模式、更正式的Holy Traits模式,以及从参数化的数据结构创建新类型的参数化类型模式。
第6章介绍与提高系统性能相关的设计模式,包含更好的类型稳定的全局常量模式、通过数据重排达到最佳布局的数组结构模式、通过并行计算优化内存的共享数组模式、缓存前面计算结果的记忆模式,以及通过函数特化提升性能的闸函数模式。
第7章介绍与代码可维护性相关的设计模式,包含便于管理大型代码库的子模块模式、便于创建数据类型的关键字定义模式、用较少代码定义许多相似函数的代码生成模式,以及为特殊领域创建新的语法规则的领域特定语言模式。
第8章介绍帮助你编写更加安全的代码的设计模式,包含为字段提供标准访问权限的访问器模式、控制字段的访问的属性模式、限制变量范围的let块模式,以及处理错误的异常处理模式。
第9章介绍前面提到的几类模式之外的设计模式,包含动态分派的单例类型分派模式、构建独立测试的打桩/模拟模式,以及建立线性数据处理流水线的函数管道模式。
第10章介绍需要避免的设计模式。最主要的反模式就是海盗反模式,例如为数据类型定义和扩展那些不属于你的函数,还包含降低系统性能的窄参数类型反模式和分散的非具体字段类型反模式。
第11章介绍GoF的Design Patterns: Elements of Reusable Object-Oriented Software中描述的设计模式,还探讨在Julia中如何简化或以不同方式实现这些设计模式。
第12章探讨Julia如何支持继承,以及为什么在Julia中继承会被设计为和主流面向对象编程语言中的完全不同。然后讨论类型变体(关于多重分派使用的数据类型之间的子类型关系的重要概念)。
如何充分利用本书
你可以在Julia的官方网站(https://julialang.org/)下载最新版本。
本书每章所提及的代码都在Github中如“技术要求”所述。编写本书时,这些代码都在Julia 1.3.0上通过了测试。克隆这些项目的操作如下所示。

你最好在阅读的过程中运行和体验这些示例代码。这些代码都是以如下格式存储的:
·Julia源代码中的代码片段,这些片段可以复制并粘贴到REPL。
·代码属于某个包目录,这个包可以像下面一样被实例化,例如第5章中的内容。

要使用这些DelegationPattern的代码,直接在该目录中使用--project=.命令行参数启动一个Julia REPL。

然后进入包模式,输入instantiate命令来实例化包。

之后就可以正常使用包了。

如果这是测试目录,你可以读取并运行这些测试脚本。
下载示例代码
本书的代码在Github的https://github.com/PacktPublishing/Hands-on-Design-Patterns-and-Best-Practices-with-Julia中。任何修改都会更新到Github的代码仓库中。
排版约定
本书中使用了以下排版约定。
代码体:指示文本中的代码,例如变量名、函数名、数据类型等。例如“format函数采用格式化程序和数值x,并返回格式化的字符串”。
代码块设置如下:
abstract type Formatter end struct IntegerFormatter <: Formatter end struct FloatFormatter <: Formatter end
REPL的任何实验或输出均显示为屏幕截图。

表示重要说明。
表示提示和技巧。