600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C#代码整洁之道:代码重构与性能提升

C#代码整洁之道:代码重构与性能提升

时间:2024-07-17 18:59:38

相关推荐

C#代码整洁之道:代码重构与性能提升

C#语言曾主要用于开发Windows桌面应用和游戏程序,而现在已经在多个领域得到了广泛应用,如Web应用程序和云应用程序。C#在移动开发领域的影响力也与日俱增。尽管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章还会介绍创建型和结构型的各类设计模式的实现方式,并简要介绍行为型设计模式。在本章最后我们将对整洁代码及重构进行总结。

使用说明

本书大部分章节可以按任意顺序独立阅读。但是为了发挥本书的效果,我建议按章节的先后顺序阅读本书。

在阅读过程中请遵照书中的说明,并完成书中提到的任务。在每一章结束时,请回答问题并阅读相关推荐材料来巩固所学的知识。本书的示例代码均提供下载。

关于作者

Jason Alls拥有超过的Microsoft技术编程工作经验,曾就职于一家澳大利亚公司。他最初负责呼叫中心管理报告软件的开发,该软件服务于全球客户,包括电信供应商、银行、航空公司和警察机构。后续开发过GIS市场营销应用程序,在银行部门负责Oracle和SQL Server间的数据迁移。从获得C# MCAD认证以来,他一直在参与各种桌面、Web 和移动应用程序的开发。他目前任职于全球知名的英国教育公司GL Education,使用、Angular和C#进行阅读障碍测试,评估软件的开发与支持工作。

目录

第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.6KISS原则 20

1.3.7YAGNI原则 21

1.3.8DRY原则 21

1.3.9SOLID原则 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.3DI范例 54

3.6.4IoC范例 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.1MSTest 99

6.3.2NUnit 105

6.3.3Moq 110

6.3.4SpecFlow 114

6.4TDD方法实践—失败、通过与重构 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.2ThreadPool.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.3API代理 185

9.4API设计准则 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中创建股息日历 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

更多C#推荐

《C# 8.0本质论》

推荐语:世界知名C#技术大师传世经典之作,微软公司C#首席设计师作序推荐;开发指导与编程思想讲解兼顾,适合各层次C#程序开发人员阅读参考。对于初学者而言,其内容已远远超过了一本简单的教程,可为读者未来进行高效率软件开发打下坚实基础;对于已熟悉C#的读者,本书探讨了一些较为复杂的编程思想,并深入讨论了语言较新版本(C# 8.0和.NET Framework 4.8/.NET Core 3.1)的新功能;对于已经精通这门语言的读者,也可以始终将其作为案头参考。

《C# 8.0核心技术指南》

推荐语:本书全方位地介绍了 C# 的语言特性。在内容上,它兼顾了各种类型的读者。对于初学者,本书不论是介绍基本的语法,还是介绍高级的语言特性,都采用了讲解和示例结合的方法。而对于经验丰富的读者,本书的每一章都详尽而系统,是的案头参考书。本书在前一版的基础上进行了大量的修订工作。不但将既有的内容和范例全部迁移到 .NET Core 之上,对 C# 8.0 与 .NET Core 3.x 提供的新特性进行了详细的介绍,还在部分示例中专门对编写跨平台运行的程序的技巧或陷阱进行了说明。可以说,本书从内容上涵盖了目前 C# 与 .NET Core 全新正式发行版的内容。

《C#编程魔法书》

推荐语:以2个综合案例贯穿全书,从语法到多线程/并行编程,从简单开发到分布式系统,随书代码拿来即用。本书将示例代码与实际业务场景结合作为第一考量因素。本书主要通过高频交易程序和交易所撮合引擎两个示例程序来配合介绍C#编程,内容由浅入深,示例程序的功能也是逐渐丰富的,相信会让读者受到启发。

更多精彩回顾

书讯 |5月书讯(上)|元宇宙、因果推断、薛定谔方程...你关注的都在这

书讯 |5月书讯(下)|设计致物系列+少儿编程好书推荐

资讯 |为企业数字人才建粮仓:专访极客邦科技双数研究院院长付晓岩

资讯|美国科学院院士名单公布:图灵奖得主、龙书作者Alfred V. Aho当选!

干货| 为什么每一名程序员都应该学习 C++?

干货 |如果机器翻译始终存在缺陷和错误,那它还有什么用处?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。