首页>参考读物>计算机科学与技术>软件与程序设计

C#代码整洁之道:代码重构与性能提升
作者 : [英]詹森·奥尔斯(Jason Alls) 著
译者 : 刘夏 译
丛书名 : 华章程序员书库
出版日期 : 2022-04-20
ISBN : 978-7-111-70362-4
定价 : 119.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 351
开本 : 16
原书名 : Clean Code in C#
原出版社: Packt Publishing Ltd.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书介绍如何使用各种工具、模式和方法将可读性、可维护性与可扩展性均不尽人意的代码重构为整洁的代码。首先介绍C#的编码标准和原则,然后详细讨论代码评审的过程并说明其重要性。接着介绍类、对象与数据结构以及函数式编程的基础知识。之后介绍异常处理、单元测试、端到端系统测试、线程与并发、API的设计与开发、API密钥与API安全、处理切面关注点等C#相关知识。结尾介绍一系列工具来提升代码质量,并介绍重构C#代码的方法。

图书特色

系统讲解将C#的问题代码重构为整洁代码的各种工具、模式和方法  
帮助你掌握优秀C#代码编写原则,提升发现问题代码的能力,高效编写整洁代码

图书前言

欢迎阅读本书。在本书中,你将学习如何识别那些可以编译,但可读性、可维护性与可扩展性均不尽如人意的代码。当然,你也将学到如何使用各种工具、模式和方法将上述问题代码重构为整洁的代码。
本书的读者
本书适合具备良好的C#语言编程知识,同时希望提升自己发现问题代码的能力并编写整洁代码的开发人员阅读。
本书的内容
第1章通过优秀代码和劣质代码的对比来说明编码的标准、原则、方法和约定的必要性。本章还将介绍模块化的设计思路以及KISS、YAGNI、DRY、SOLID和奥卡姆剃刀法则等设计规范。
第2章将详细讨论代码评审的过程并说明其重要性,具体包括如何准备代码以供审阅、如何引导代码评审、应当评审哪些内容、何时进行代码评审以及如何进行代码评审的反馈。
第3章涵盖类的组织、文档注释、内聚性、耦合、迪米特法则和不可更改的对象与数据结构等一系列主题。在本章学习结束之后,你将可以编写结构良好、符合单一职责原则、具备相应文档并且可扩展性良好的代码。
第4章将介绍函数式编程的相关知识,并探讨如何令函数保持短小精悍的状态,避免出现重复代码与过多的参数。在本章学习结束之后,你将能够描述函数式编程的知识、编写函数式代码、避免编写带有过多(两个以上)参数的函数、创建不可更改的数据对象或结构、保持方法短小并符合单一职责原则。
第5章将介绍检查型异常和非检查型异常,NullPointerException,如何规避和处理这些异常,业务规则异常,如何在异常中提供有意义的信息以及如何创建自定义异常。
第6章将结合SpecFlow介绍行为驱动开发(Behavior-Driven Development,BDD)方法,同时也将结合MSTest和NUnit工具介绍测试驱动开发(Test-Driven Development,TDD)方法。你将学到如何使用Moq编写测试替身、如何用TDD的方式令测试失败,或(实现功能)令测试通过,以及之后重构代码并确保测试通过。
第7章将使用范例工程演示如何进行手动的端到端测试,具体包括执行端到端测试、工厂的编码和测试、依赖注入的编码和测试,以及模块化系统测试。本章还会介绍如何针对模块化系统设计来执行端到端测试。
第8章将着眼于讲解以下内容:线程的生命周期、向线程传递参数、使用Thread-
Pool、互斥量、线程间同步、使用信号量处理并行线程、限制ThreadPool中的线程数目和处理器用量、防止死锁和竞态条件、静态方法和静态构造器、可变性与不可变性以及线程安全。
第9章将向你解释API的定义、API代理、API的设计规范、使用RAML描述API的设计以及Swagger API开发。本章将使用RAML设计和语言无关的API,使用C#进行API的开发,并使用Swagger编写API的文档。
第10章将展示如何获取第三方API密钥,将密钥存储在Azure Key Vault中,并使用在Azure上开发、部署的API获得该密钥,最后实现API的密钥认证与鉴权功能来确保自身 API 的安全。
第11章将使用 PostSharp,使用面向方面开发(aspect-oriented development)中的方面(aspect)和特性(attribute)这两个基本元素来处理切面关注点。本章还将介绍代理对象和装饰器的使用方法。
第12章将介绍一系列工具来提升代码编写质量并提高现有代码的质量,包括如何进行代码度量、代码分析,并进行快速操作。其中涉及被称为dotTrace Prof?iler和ReSharper的JetBrains工具,以及Telerik JustDecompile工具。
第13章和第14章会介绍不同类型的问题代码,以及将这些代码修改为易读、易维护和易扩展的整洁代码的方法。各类代码问题将列在每一小节中,其中会涉及例如类的依赖,无法修改的代码、集合,以及组合爆炸等问题。
第14章还会介绍创建型和结构型的各类设计模式的实现方式,并简要介绍行为型设计模式。在本章最后我们将对整洁代码及重构进行总结。
充分利用本书
本书大部分章节可以按任意顺序独立阅读。但是为了发挥本书的效果,我建议按章节的先后顺序阅读本书。在阅读过程中请遵照书中的说明,并完成书中提到的任务。在每一章结束时,请回答问题并阅读相关推荐材料来巩固所学的知识。此外,为了在阅读过程中最大限度地发挥本书的效果,请务必满足如下环境要求:
书中提到的软/硬件 要求
Visual Studio 2019 Windows 10, macOS
Atom Windows 10, macOS, Linux:https://atom.io/
Azure资源 Azure订阅:https://azure.microsoft.com/en-gb/
Azure Key Vault Azure订阅:https://azure.microsoft.com/en-gb/
Morningstar API 请从https://rapidapi.com/integraatio/api/morningstar1获取属于你的API密钥
Postman Windows 10, macOS, Linux:https://www.postman.com/
你应当掌握Visual Studio 2019 Community Edition或更高版本的基本使用方法并具备 C# 编程的基本技能,例如创建控制台应用程序—书中的大部分范例是 C# 控制台应用程序。主程序将使用 ASP.NET 进行编写。如果你能够使用框架和核心编写ASP.NET网络程序,则对学习也很有帮助,如若不然也不必担心,本书将一步一步引领你完成相关的过程。
下载示例代码及彩色图像
本书的示例代码及所有截图和样图,可以从http://www.packtput.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。
本书的代码也托管在GitHub 上,地址是https://github.com/PacktPublishing/
Clean-Code-in-C-。该仓库中的代码将与本书的范例代码进行同步更新。
如需要本书中所有的截图或图表的彩色图片的 PDF 文档,也可从如下地址下载:https://static.packt-cdn.com/downloads/9781838982973_ColorImages.pdf。
本书约定
本书采用以下的排版约定。
CodeInText:文本中的内嵌代码、数据库表名、文件夹名称、文件名称、文件扩展名、路径名称、伪URL地址、用户输入或Twitter的账号名称。例如:“InMemoryRepository类实现了IRepository接口的GetApiKey()方法。该方法将返回包含API密钥的字典。这些密钥将存储在字典类型的_apiKeys成员变量中。”
代码块将采用以下方式展示:

命令行的输入输出将采用以下形式进行展示:

黑体:新的术语、重要的词汇或屏幕上出现的词汇,如在菜单或者对话框中显示的文字。例如:“如需创建应用服务,请右击新创建的项目,并在菜单中选择 Publish(发布)选项。”
代表警告或者重要信息。
代表提示和技巧。

上架指导

计算机\程序设计

封底文字

C#语言曾主要用于开发Windows桌面应用和游戏程序,而现在已经在多个领域得到了广泛应用,如Web应用程序和云应用程序。C#在移动开发领域的影响力也与日俱增。尽管C#拥有大量的编程特性,但专业人士还是会在工作中遇到由糟糕的代码导致的效率、伸缩性和维护方面的相关问题。本书将帮助你识别这些问题,并使用有效的编码解决它们。
本书首先对比了良好的代码与劣质的代码以帮助大家理解编码标准、原则与方法的重要性,之后讨论了如何进行代码审查、代码审查在代码改进过程中的作用以及业界的编码标准。本书还介绍了单元测试,深入研究了测试驱动开发的方法,并探讨了如何处理切面关注点。你将学到如何在C#中恰当处理对象、结构体、异常等。我们还将研究API的设计并使用工具改善代码质量,通过学习反面案例来避免不当的编码实践。
阅读本书,你将学到开发符合业界编码标准的整洁、易读、可扩展且易于维护的C#代码的方法。
本书涵盖以下主题:
如何编写能够持续修改与完善的代码。
使用C#控制台应用程序实践“失败-通过-重构”的工作流程。
使用设计模式解决切面关注点问题。
编写提供含义明确的信息的自定义C#异常。
如何识别质量不佳、需要重构的C#代码。
如何使用API密钥对API进行保护,以及使用Azure Key Vault对数据进行保护。
如何使用分析和重构工具提升代码性能。

图书目录

前言
关于作者
关于审校者
第1章 C#的编码标准和原则 1
1.1 技术要求 2
1.2 良好的代码与劣质的代码 2
1.2.1 劣质的代码 3
1.2.2 良好的代码 14
1.3 编码标准、原则和方法的必要性 18
1.3.1 编码标准 19
1.3.2 编码原则 19
1.3.3 编码方法 19
1.3.4 编码规则 20
1.3.5 模块化 20
1.3.6 KISS原则 20
1.3.7 YAGNI原则 21
1.3.8 DRY原则 21
1.3.9 SOLID原则 21
1.3.10 奥卡姆剃刀法则 22
1.4 总结 22
1.5 习题 22
1.6 参考资料 23
第2章 代码评审—过程及其重要性 24
2.1 代码评审流程 25
2.2 准备代码评审 25
2.3 引导代码评审 26
2.3.1 创建pull request 27
2.3.2 响应pull request 28
2.3.3 反馈对被评审人的影响 30
2.4 确定评审内容 33
2.4.1 公司编码规范与业务需求 34
2.4.2 命名规则 34
2.4.3 代码格式 34
2.4.4 测试 35
2.4.5 架构规范和设计模式 35
2.4.6 性能和安全性 36
2.5 何时发起代码评审 36
2.6 提供并回应评审反馈 37
2.6.1 评审人提供反馈意见 38
2.6.2 被评审人回应反馈 38
2.7 总结 39
2.8 习题 39
2.9 参考资料 40
第3章 类、对象和数据结构 41
3.1 技术要求 41
3.2 组织类 42
3.3 一个类应当只具备一种职责 43
3.4 从注释生成文档 45
3.5 内聚和耦合 48
3.5.1 紧耦合范例 48
3.5.2 低耦合范例 49
3.5.3 低内聚范例 50
3.5.4 高内聚范例 51
3.6 为变化而设计 52
3.6.1 面向接口编程 52
3.6.2 依赖注入和控制反转 54
3.6.3 DI范例 54
3.6.4 IoC范例 56
3.7 迪米特法则 57
3.8 不可变对象与数据结构 59
3.9 对象应当隐藏数据并暴露方法 60
3.10 数据结构体应当暴露数据而无须包含方法 61
3.11 总结 62
3.12 习题 62
3.13 参考资料 63
第4章 编写整洁的函数 64
4.1 理解函数式编程 65
4.2 保持方法短小 67
4.3 代码缩进 69
4.4 避免重复代码 70
4.5 避免多个参数 71
4.6 实现单一职责原则 72
4.7 总结 76
4.8 习题 76
4.9 参考资料 77
第5章 异常处理 78
5.1 检查型异常和非检查型异常 79
5.2 避免NullReferenceException 82
5.3 业务规则异常 84
5.3.1 范例1—使用业务规则异常进行条件处理 86
5.3.2 范例2—使用正常程序流程进行条件处理 87
5.4 异常应当提供有意义的信息 89
5.5 创建自定义异常 90
5.6 总结 92
5.7 习题 93
5.8 参考资料 93
第6章 单元测试 94
6.1 技术要求 95
6.2 为何要进行良好的测试 95
6.3 了解测试工具 98
6.3.1 MSTest 99
6.3.2 NUnit 105
6.3.3 Moq 110
6.3.4 SpecFlow 114
6.4 TDD方法实践—失败、通过与重构 117
6.5 删除冗余的测试、注释以及无用代码 122
6.6 总结 123
6.7 习题 123
6.8 参考资料 124
第7章 端到端系统测试 125
7.1 端到端测试 125
7.1.1 登录模块(子系统) 127
7.1.2 管理员模块(子系统) 129
7.1.3 测验模块(子系统) 131
7.1.4 对三模块系统执行E2E测试 132
7.2 工厂 134
7.3 依赖注入 140
7.4 模块化 145
7.5 总结 147
7.6 习题 147
7.7 参考资料 147
第8章 线程与并发 148
8.1 理解线程的生命周期 149
8.2 添加线程参数 150
8.3 使用线程池 151
8.3.1 任务并行库 152
8.3.2 ThreadPool.QueueUserWorkItem()方法 153
8.4 使用互斥量同步线程 154
8.5 使用信号量处理并行线程 156
8.6 限制线程池使用的处理器数目及线程数目 158
8.7 避免死锁 159
8.8 避免竞态条件 164
8.9 理解静态构造器和静态方法 166
8.9.1 添加静态构造器 167
8.9.2 在代码中添加静态方法 168
8.10 可变性、不可变性与线程安全 170
8.10.1 编写可变且线程不安全的代码 171
8.10.2 编写不可变且线程安全的代码 172
8.11 理解线程安全 173
8.12 同步方法依赖 177
8.13 使用Interlocked类 177
8.14 通用建议 180
8.15 总结 181
8.16 习题 181
8.17 参考资料 182
第9章 API的设计与开发 183
9.1 技术要求 184
9.2 什么是API 184
9.3 API代理 185
9.4 API设计准则 186
9.4.1 明确定义软件边界 189
9.4.2 理解高质量API文档的重要性 190
9.4.3 传递不可变结构体而非可变对象 192
9.4.4 测试第三方API 195
9.4.5 测试自己的API 196
9.5 使用RAML设计API 197
9.5.1 安装Atom和MuleSoft的Workbench插件 198
9.5.2 创建项目 198
9.5.3 从RAML语言无关设计规范生成C# API代码 200
9.6 总结 203
9.7 习题 204
9.8 参考资料 204
第10章 使用API密钥和Azure Key Vault保护API 206
10.1 技术要求 207
10.2 范例API项目—股息日历 207
10.3 访问Morningstar API 208
10.4 在Azure中创建股息日历ASP.NET Core Web应用程序 210
10.5 使用API密钥保护股息日历API 215
10.5.1 创建repository 216
10.5.2 设置认证和鉴权功能 218
10.6 测试API密钥安全功能 223
10.7 添加股息日历代码 226
10.8 限制API调用 232
10.9 总结 235
10.10 习题 236
10.11 参考资料 236
第11章 处理切面关注点 237
11.1 技术要求 238
11.2 装饰器模式 238
11.3 代理模式 240
11.4 使用PostSharp实现AOP 242
11.4.1 扩展“方面”框架 242
11.4.2 扩展架构框架 244
11.5 创建可重用的解决切面关注点问题的类库 245
11.5.1 添加缓存关注点 245
11.5.2 添加文件日志功能 246
11.5.3 添加日志关注点 247
11.5.4 添加异常处理关注点 249
11.5.5 添加安全关注点 249
11.5.6 添加验证关注点 252
11.5.7 添加事务关注点 256
11.5.8 添加资源池关注点 257
11.5.9 添加配置关注点 257
11.5.10 添加检测关注点 258
11.6 总结 259
11.7 习题 259
11.8 参考资料 259
第12章 使用工具改善代码质量 260
12.1 技术要求 261
12.2 什么是高质量代码 261
12.3 清理代码并进行代码度量 262
12.4 执行代码分析 264
12.5 使用快速操作 267
12.6 使用JetBrains dotTrace探查工具 267
12.7 使用JetBrains ReSharper 271
12.8 使用Telerik JustDecompile工具 279
12.9 总结 280
12.10 习题 280
12.11 参考资料 281
第13章 重构C#代码—识别代码坏味道 282
13.1 技术要求 282
13.2 应用程序级别代码坏味道 283
13.2.1 布尔盲点 283
13.2.2 组合爆炸 284
13.2.3 人为复杂性 285
13.2.4 数据泥团 286
13.2.5 粉饰注释 286
13.2.6 重复代码 286
13.2.7 意图不明 287
13.2.8 可变的变量 287
13.2.9 怪异的解决方案 288
13.2.10 霰弹式修改 290
13.2.11 解决方案蔓延 291
13.2.12 不可控的副作用 292
13.3 类级别代码坏味道 292
13.3.1 过高的圈复杂度 292
13.3.2 发散式变化 295
13.3.3 向下类型转换 296
13.3.4 过度的字面量使用 296
13.3.5 依恋情结 296
13.3.6 狎昵关系 298
13.3.7 不恰当的暴露 298
13.3.8 巨大的类 298
13.3.9 冗赘类 298
13.3.10 中间人类 299
13.3.11 孤立的变量和常量类 299
13.3.12 基本类型偏执 299
13.3.13 被拒绝的遗赠 299
13.3.14 夸夸其谈未来性 299
13.3.15 命令,而非询问 300
13.3.16 临时字段 300
13.4 方法级别的代码坏味道 300
13.4.1 不合群的方法 300
13.4.2 过高的圈复杂度 300
13.4.3 人为复杂性 300
13.4.4 无用的代码 301
13.4.5 过多的返回数据 301
13.4.6 依恋情结 301
13.4.7 过长或过短的标识符 301
13.4.8 狎昵关系 301
13.4.9 过长的代码行 301
13.4.10 冗赘方法 301
13.4.11 过长的方法 302
13.4.12 参数过多 302
13.4.13 过度耦合的消息链 302
13.4.14 中间人方法 302
13.4.15 怪异的解决方案 302
13.4.16 夸夸其谈未来性 302
13.5 总结 302
13.6 习题 303
13.7 参考资料 304
第14章 重构C#代码—实现设计模式 305
14.1 技术要求 306
14.2 实现创建型设计模式 306
14.2.1 实现单例设计模式 306
14.2.2 实现工厂方法设计模式 307
14.2.3 实现抽象工厂设计模式 308
14.2.4 实现原型设计模式 311
14.2.5 实现建造者设计模式 313
14.3 实现结构型设计模式 317
14.3.1 实现桥接设计模式 317
14.3.2 实现组合设计模式 319
14.3.3 实现外观设计模式 321
14.3.4 实现享元设计模式 323
14.4 行为型设计模式概述 325
14.5 关于整洁代码和重构的思考 326
14.6 总结 328
14.7 习题 328
14.8 参考资料 329
参考答案 330

教学资源推荐
作者: [加拿大] 马丁·P.罗毕拉德(Martin P. Robillard) 著
作者: (美)Martin Kalin
作者: (美)John R.Hubbard
作者: [美]保罗·C. 乔根森(Paul C. Jorgensen) 著
参考读物推荐
作者: David Medinets
作者: (美)Peter C.Dibble
作者: (美) Alan W. Brown 著
作者: 章为忠 编著