.NET Best Practices: Architecture & Design Patterns (5 Days Training)
.NET最佳实践:架构及设计模式
5天培训课程
课程大纲
熟悉的原则
SOLID原则
当软件开发第一次出现时。 想要开始发展的人显然没有知识储备。 因此,每个人都开始运用自己的方式来编写软件。 SOLID原则由Robert C. Martin(又名Bob叔叔)于2000年引入。这些原则的目的是使软件设计更易懂,更易于维护和扩展。 这些原则对于每个开发人员来说都是必不可少的,因为它将帮助他们编写更好的代码,更好地理解考虑了这些原则编写的其他代码。
- S (The Single Responsibility Principle) - 单一责任原则
- O (The Open Closed Principle) - 开放封闭原则
- L (Liskov Substitution Principle) - 里氏替换原则
- I (The Interface Segregation Principle) - 接口分离原则
- D (The Dependency Inversion Principle) - 依赖倒置原则
使用依赖注入实现更松散的耦合
在编写代码时,必须确保没有引入对其他对象的不必要的依赖关系。 依赖关系从长远来看只会使您付出代价,因为它们更难以维护,不易于测试,可交换等。 如果需要依赖什么,则依赖于接口。 接口描述了相关性,但不强制执行。 现在,您不希望这些依赖项被硬编码填充,这就是依赖关系注入(DI)可以为您提供帮助的地方。 依赖注入可以在运行时动态地帮助您确定要插入依赖的实现。
- 什么是紧密耦合,如何防止呢?
- 使用控制反转(IoC)容器。
- 构造函数和属性注入。
- 以
Microsoft.Extensions.DependencyInjection
为例。
设计模式
模式介绍
你可能不相信,但是设计模式在软件体系结构中是找不到起源的。 模式是由真正的"砖头和石头"建筑师于1970年代首次描述的。模式被定义为对常见类型问题的可重用解决方案,而无需重复解决方案的实际实现方式。 这意味着模式是理想的学习工具,也是传达设计思想的理想工具。 当然也有反模式,这是经常使用的东西,但实际上最好避免。
- 什么是模式?
- 四人帮:Erich Gamma,Ralph Johnson,Richard Helm和John Vlissides。
- 不同种类的设计模式:创造模式、结构模式和行为模式。
- 模式无处不在:实现、设计和架构模式之间的区别...
- 什么时候应用模式,什么时候不应用。
- 一些反模式。
创造模式
在创建软件时,您会感到自己不断在创建新对象。 尽管创建新对象的基本形式还不错,但是它可能导致设计问题或增加设计的复杂性。 创建模式将帮助您处理适合这种情况的对象创建。
- 单例模式(Singleton)- 又名Pluto模式以及.NET运行时如何帮助实现它
- 建造者模式(Builder) - 将构造与表示分离
- 工厂方法模式(Factory Method) - 将对象的创建委托/隐藏到工厂
- 抽象工厂模式(Abstract Factory) - 抽象工厂以创建对象族
行为模式
创建对象后,它们开始交互。当您不小心时,这些交互会很快开始导致紧密耦合的代码。行为设计模式有助于识别对象之间的常见通信模式并实现这些模式。通过正确应用这些模式,可以提高执行对象之间交互的灵活性。
- 模板方法模式(Template Method)- 将算法的确切部分推迟到继承类,委托,...
- 策略模式(Strategy)- 没有烦人的继承的模板方法
- 责任链模式(Chain of Responsibility)- 贯穿战略链的战略
- 状态模式(State)- 使用无状态库将状态依赖逻辑延迟到状态类,状态机
- 迭代器模式(Iterator)- 提供浏览集合的通用方法,yield是您的朋友,异步迭代集合
- 观察者模式(Observer)- 通知谁对您要说的内容感兴趣,事件与委托
- 中介者模式(Mediator)- 在彼此不知道的对象之间提供双向通信,正确实现
INotifyPropertyChanged
- 游客模式(Visitor)
结构模式
创建的对象往往不会独立存在。 不,它们开始封装试图在其中创建结构的其他对象,否则将是混乱的软件环境。 结构模式有助于识别和建立对象之间的关系。
- 适配器模式(Adapter)- 将不适合的其他对象插入代码中
- 装饰器模式(Decorator)- 在调用者未意识到的情况下更改对象的行为
- 复合模式(Composite)- 树形结构在这里可以帮助您使用Linq Expressions
- 门户模式(Facade)- 向调用者隐藏子系统的复杂性
- 享元模式(Flyweight)- 通过防止不必要的对象创建来减少内存消耗
- 代理模式(Proxy)- 在不更改行为的情况下代理对主题的请求
用某些模式构建自己的小编程语言-好玩!
编程语言在其实现中还使用了一堆模式。 在本章中,您将构建自己的小编程语言,该语言可以进行扩展。 在这样做的同时,您会发现并应用一些非常重要的模式,这些模式在构建编程语言的范围之外是完全可以使用的!
- 解释器模式(Interpreter):建立自己的表达语言语法并执行。
- LINQ如何使用解释器 - 以及您如何自己使用它。
- 构建自己的解释器以进行简单的数学运算。
- 建造者模式(Builder):隐藏如何构建复杂的对象层次结构-并允许变化。
- XAML是最终的构建器。
- 反射模式:实现自己的构建器的理想.NET方法。
- 如何不使用反射。
- 访客模式:当您需要对同一对象结构进行许多不同的操作时。
- 使用Visitor构建pretty-printer。
- 动态地实现访客。
Model-View-**
大多数开发人员都是糟糕的图形设计师。这就是为什么我们看到模式的出现,这些模式允许开发人员专注于编写代码来实现应用程序的行为,同时允许图形设计人员构建辅助用户界面。主要模式称为Model-View-* 根据您使用的技术替换了*。了解MVW模式非常重要,因为它可用于开发Windows和Web应用程序。
- Model-View-Controller:一种古老的时尚模式。
- ASP.NET MVC-简介。
- WPF中的MVVM-MVC利用强大的数据绑定功能。
- 命令:将行为封装在对象中。
- 使用闭包实现命令。
反应式(Reactive)编程
您听说过反应式编程吗?这是一项重要的新开发,您可以在其中学习如何使用Observables进行编程。您将学习如何使用这种技术来解决经典的面向对象编程中一些常见的难以解决的问题,并且我们还将探索Redux模式。
- 什么是可观测值(Observables)?
- 使用反应性(Reactive)扩展。
- 应用Redux模式可以简化复杂的应用程序。
单元测试
.NET中的单元测试
每个开发人员的梦想:有效的可维护代码。您如何保持代码的可维护性?以及如何确保一些小的更改不会破坏您的代码?单元测试可以营救!
- 每个开发人员想要的是:有效的质量代码;并继续工作。
- 查找错误:不仅是代码。 - 或者说,美国宇航局如何损失了125.000.000美元的火星探测器。
- 什么是单元测试?什么是好的单元测试?
- 了解单元测试和集成测试之间的区别。
- 测试驱动开发-您应该这样做吗?
- 角色扮演:Marge,Homer和Bart
- 单元测试的Triple-A-与此有什么关系?
使用Visual Studio进行单元测试
在本章中,我们将研究使用Visual Studio的内置功能构建单元测试。
- MSUnit-内置到Visual Studio中
- 使用MSUnit构建和运行单元测试。
- 使用测试浏览器窗口
框架建设
应用的设计模式:开发自己的可重用库。
什么时候最需要图案?当您自己构建框架时。建立框架意味着在保持向后兼容性的同时处理新功能。正确使用模式可以使这项非常艰巨的任务变得容易。因此,在培训的最后一部分中,我们将构建一个可重用的库,同时遇到一些问题,然后通过应用正确的模式解决这些问题。
- 将GoF命令模式添加到MVVM。
- 使用接口以提高灵活性。
- 构建命令对象-扩展WPF的ICommand接口。
- 将撤消和重做功能添加到命令模式。
- 使用CommandManager类。
- 挑战:无需大量更改即可将我们的命令改装为MVVM。
- 使用Memento模式实现撤消重做。
- 选择是否添加原型模式。
- 有关如何继续执行命令模式的想法。