本书兼顾Julia编程语言的优势和不足,全面介绍了Julia编程语言,介绍了模式所依赖的编程语言特性,同时涵盖了一些高级的内容。
全书分为四部分:
第1部分介绍设计模式;
第2部分就少Julia基础;
第3部分介绍设计模式实现;
第4部分介绍一些进阶主题。
设计模式是开发可重用和可维护代码的基本技术。它提供了一套经过验证的解决方案,使开发人员可以快速解决软件开发中的问题。本书将演示如何在实际应用中利用设计模式。
本书首先概述应用程序设计中的设计模式和*佳实践。你将了解Julia的一些基本的功能,例如模块、数据类型、函数、接口和元编程。然后,你将掌握用于构建大型应用程序的现代Julia设计模式,重点在于性能、可重用性、鲁棒性和可维护性。本书还介绍了反模式以及如何避免开发中的常见错误和陷阱。你将学习如何在Julia中以不同方式更有效地实现传统的面向对象的设计模式。本书包含各种用例和示例,例如Julia开发专家如何在其开源包中使用设计模式。
从本书中你将学到改善软件设计、可扩展性和可重用性的方法,并能够有效地使用设计模式来应对软件开发中的常见挑战。
通过阅读本书,你将:
掌握Julia语言功能,这些功能对于开发大型软件应用程序至关重要。
发现设计模式以改善整体应用程序架构和设计。
学会开发模块化、可扩展、高性能且易于维护的可重用程序。
学会权衡对用例使用不同设计模式的利弊。
探索从面向对象编程过渡到使用等效或更高级的Julia技术的方法。
Julia是一个为开发出高性能应用程序而设计的高级编程语言,旨在提高开发人员的生产力。其动态特性可以让你快速做一个小规模的测试,然后移植到大的应用程序中。它的内省工具可以通过分析高级代码如何翻译成低级代码及机器码来实现性能优化。它的元编程更能帮助高级开发人员为特定领域的使用建立自定义的语法。它的多重分派和泛型方法功能使得开发人员可以轻松地在已有的方法上扩展新功能。鉴于以上优点,Julia是可以在许多行业广泛使用的优秀程序开发语言。
这本书满足了那些期望编写高效代码、提升系统性能以及设计出易维护软件的Julia开发人员的需求。从Julia语言诞生到2018年8月的里程碑版本10,许多源于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://julialangorg/)下载版本。
本书每章所提及的代码都在Github中如技术要求所述。编写本书时,这些代码都在Julia 130上通过了测试。
【下载示例代码】
本书的代码在Github的https://github.com/PacktPublishing/Hands-on-Design-Patterns-and-Best-Practices-with-Julia中。任何修改都会更新到Github的代码仓库中。
作者:汤姆~邝(Tom Kwong)
注册金融分析师。他是一位经验丰富的软件工程师,拥有超过25年行业编程经验。他的大部分职业生涯都投身在金融服务行业。他的专长包括软件架构、软件设计、交易系统和风控系统开发。
从2017年开始,他发现了Julia编程语言并贡献了许多开源包,包括SASLib.jl。
译者:方明
Thoughtworks高级软件咨询师,2010年毕业于延边大学计算机系数字媒体技术专业。先后经历过多个手机游戏项目和聚合支付项目,拥有丰富的游戏服务端开发经验和支付领域知识,擅长Java、Scala、 Javascript等多种编程语言。目前专注于海外项目交付,重点关注敏捷实践、团队管理和交付效能等领域。
序言
前言
作者简介
审校者简介
【部分 从设计模式开始】
第1章 设计模式和相关原则 2
11 设计模式的历史 2
111 设计模式的兴起 3
112 关于GoF模式的更多思考 3
113 在本书中我们如何描述设计模式 4
12 软件设计原则 4
121 SOLID原则 5
122 DRY原则 6
123 KISS原则 6
124 POLA原则 7
125 YAGNI原则 7
126 POLP原则 8
13 软件质量目标 8
131 可重用性 8
132 性能 9
133 可维护性 10
134 安全性 11
14 小结 11
15 问题 12
【第二部分 Julia基础】
第2章 模块、包和数据类型 14
21 技术要求 14
22 程序开发中不断增长的痛点 15
221 数据科学项目 15
222 企业应用程序 15
223 适应增长 16
23 使用命名空间、模块和包 16
231 理解命名空间 17
232 创建模块和包 17
233 创建子模块 23
234 在模块中管理文件 24
24 管理包的依赖关系 24
241 理解语义版本控制方案 24
242 指定Julia包的依赖关系 25
243 避免循环依赖 28
25 设计抽象类型和具体类型 29
251 设计抽象类型 29
252 设计具体类型 33
253 使用类型运算符 37
254 抽象类型和具体类型的差异 39
26 使用参数化类型 39
261 使用参数化复合类型 40
262 使用参数化抽象类型 42
27 数据类型转换 43
271 执行简单的数据类型转换 44
272 注意有损转换 44
273 理解数字类型转换 45
274 重温自动转换规则 45
275 理解函数分派规则 47
28 小结 48
29 问题 49
第3章 设计函数和接口 50
31 技术要求 50
32 设计函数 51
321 用例太空战争游戏 51
322 定义函数 51
323 注释函数参数 52
324 使用可选参数 55
325 使用关键字参数 57
326 接受可变数量的参数 58
327 splatting参数 59
328 类实体函数 60
329 开发匿名函数 61
3210 使用do语法 62
33 理解多重分派 63
331 什么是分派 63
332 匹配窄类型 64
333 分派多个参数 65
334 分派过程中可能存在的歧义 67
335 歧义检测 68
336 理解动态分派 70
34 利用参数化方法 71
341 使用类型参数 71
342 使用类型参数替换抽象类型 72
343 在使用参数时强制类型一致性 73
344 从方法签名中提取类型信息 74
35 使用接口 75
351 设计和开发接口 75
352 处理软契约 79
353 使用特质 80
36 小结 81
37 问题 81
第4章 宏和元编程 82
41 技术要求 83
42 理解元编程的需求 83
421 使用@time宏测量性能 83
422 循环展开 84
43 使用表达式 86
431 试用解析器 86
432 手动构造表达式对象 88
433 尝试更复杂的表达式 90
434 计算表达式 93
435 在表达式中插入变量 94
436 对符号使用QuoteNode 95
437 在嵌套表达式中插值 96
44 开发宏 97
441 什么是宏 97
442 编写个宏 98
443 传递字面量参数 98
444 传递表达式参数 99
445 理解宏扩展过程 100
446 操作表达式 101
447 理解卫生宏 104
448 开发非标准字符串字面量 105
45 使用生成函数 107
451 定义生成函数 108
452 检查生成函数参数 109
46 小结 110
47 问题 110
【第三部分 实现设计模式】
第5章 可重用模式 114
51 技术要求 114
52 委托模式 114
521 在银行用例中应用委托模式 115
522 现实生活中的例子 119
523 注意事项 120
53 Holy Traits模式 120
531 重温个人资产管理用例 121
532 实现Holy Traits模式 122
533 重温一些常见用法 126
534 使用SimpleTraitsjl包 129
54 参数化类型模式 130
541 在股票交易应用程序中使用删除文本参数化类型 132
542 现实生活中的例子 135
55 小结 138
56 问题 139
第6章 性能模式 140
61 技术要求 141
62 全局常量模式 141
621 使用全局变量对性能进行基准测试 141
622 享受全局常量的速度 143
623 使用类型信息注释变量 143
624 理解常量为何有助于性能 144
625 将全局变量作为函数参数传递 145
626 将变量隐藏在全局常量中 145
627 现实生活中的例子 146
628 注意事项 147