C#代码整洁之道:代码重构与性能提升
上QQ阅读APP看书,第一时间看更新

前言

欢迎阅读本书。在本书中,你将学习如何识别那些可以编译,但可读性、可维护性与可扩展性均不尽如人意的代码。当然,你也将学到如何使用各种工具、模式和方法将上述问题代码重构为整洁的代码。

本书的读者

本书适合具备良好的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 Profiler和ReSharper的JetBrains工具,以及Telerik JustDecompile工具。

第13章和第14章会介绍不同类型的问题代码,以及将这些代码修改为易读、易维护和易扩展的整洁代码的方法。各类代码问题将列在每一小节中,其中会涉及例如类的依赖,无法修改的代码、集合,以及组合爆炸等问题。

第14章还会介绍创建型和结构型的各类设计模式的实现方式,并简要介绍行为型设计模式。在本章最后我们将对整洁代码及重构进行总结。

充分利用本书

本书大部分章节可以按任意顺序独立阅读。但是为了发挥本书的效果,我建议按章节的先后顺序阅读本书。在阅读过程中请遵照书中的说明,并完成书中提到的任务。在每一章结束时,请回答问题并阅读相关推荐材料来巩固所学的知识。此外,为了在阅读过程中最大限度地发挥本书的效果,请务必满足如下环境要求:

你应当掌握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(发布)选项。”

 代表警告或者重要信息。

 代表提示和技巧。