当前位置: 首页 > news >正文

ASP.NET MVC 学习笔记-3.面向对象设计原则

  在设计程序、系统框架或者类时,最主要考虑的事情就是代码的可扩展性,而不是完成功能即可。因此,提倡使用面向对象设计的最佳实践和基本原则。

1.       单一职责原则(SRP:The Single Responsibility Principle

  对象应承担单一的责任,它们的行为应该关注在它的责任上。比如,视图应该只关注UI的渲染,而不需要任何数据访问逻辑。

通常,代码中要提防的是名称为XXXManager的类,这种类可能包含了更多的职责。

2.       开放封闭原则(OCP:Open Closed Principle

  鼓励对外扩展开发,对修改关闭。尽量通过继承类来扩展其功能,而不是像类中添加更多的行为和责任,这一原则算对SRP原则的补充。

3.       里氏替换原则(LSPLiskov Substitution Principle

  对象应易于被其子类型的实例替换,而不会影响对象的行为和规则。

4.       接口隔离原则(ISP:Interface Segregation Principle

  鼓励在整个应用程序中使用接口的同时,也需要限制接口的大小。即,接口应该是更小、更多的特定接口,而不是一个包含所有对象行为的超类接口。接口的设计应该遵循SRP原则。

5.       依赖倒置原则(DIP:Dependency Inversion Principle

  互相依赖的组件应该通过抽象来实现交互,而不是直接通过具体来实现。最直接的例子,就是将一切依赖都设置为抽象类或接口,而不是该类的具体实例。

DIP的优点:使用抽象可允许不同的组件进行独立开发、修改和测试。

6.       控制反转(IOC:Inversion of Control

  严格来说,IOC与上面5个设计原则不是对等关系,它应该是将5大原则整合使用的一个原则。

  IOC是一种提倡实现松耦合层、组件和类的设计原则,它颠倒了应用程序的控制流程。传统的程序代码显示控制调用的过程,而IOC则使用分离执行特定问题处理代码,它允许独立开发程序的各个组件。

  目前,IOC的两个流行实现就是依赖注入(Dependency Injection)和服务定位(Service Location)。这两种方式都是相同的中心容器的概念来管理依赖项的生命周期。而不同的是,服务定位依赖调用者调用依赖,而依赖注入通过类的构造函数、属性或执行方法来实现。

理解依赖关系

  减少程序复杂性的关键是了解程序中的依赖关系,并合理地管理其依赖关系。依赖关系有多种形式:程序集引用一个或多个其他程序集,子类必须继承父类。

以一个控制访问数据服务获取数据的例子说明IOC的一步步改进:

直接调用阶段

控制器直接创建数据服务的一个实例,因此,控制器与数据服务之间紧密耦合,对数据库层的修改可能会影响到控制器。

 

使用工厂模式

为了降低控制器和数据服务的耦合度,使用接口IDataService并把创建服务的代码移动到工厂模式中,控制器和DataService依赖于IDataService接口,接口不变的情况,DataService的修改不会影响到控制器,从而消除了控制器和DataService的紧耦合,但是控制器和工厂类之间存在依赖关系。

 

IOC模式

控制器仍使用IDataService接口作为抽象,但是控制器不知道IDataService实例如何创建的,它是由IOC容器负责创建并传递(注入)到控制器的IDataService实例上,程序其他位置需要提供IOC容器的配置来实现类实例的声明周期管理。

 

转载于:https://www.cnblogs.com/DreamOfLife/p/8975216.html

相关文章:

  • 干货分享:MySQL之化险为夷的【钻石】抢购风暴
  • Canon背后的故事
  • Linux 搭建私有软件仓库
  • Blockchain钱包全方位支持比特币现金(BCH)
  • 量子通信能否跨越“死亡之谷”?2017年市场化的量子通信产品可能产生
  • 奇异量子物理系统:它既在“绝对零度”之下,又在“绝对高温”之上
  • leetcode-594-Longest Harmonious Subsequence
  • 在龙芯小本上安装Debain8.10
  • 数据智能创建能源领域“智能助手”
  • 数据库基础常用知识
  • “阿里架构师”的JVM之GC详解
  • 干货云集 WOT2016峰会揭密大数据背后的技术难点
  • 收藏好这篇,别再只说“数据劫持”了
  • input框限制只能输入正整数、字母、小数、汉字
  • MySQL 技术总结
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • CentOS7简单部署NFS
  • HTML中设置input等文本框为不可操作
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Just for fun——迅速写完快速排序
  • Python_网络编程
  • Python学习笔记 字符串拼接
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring Cloud Feign的两种使用姿势
  • Vue 重置组件到初始状态
  • Vue.js源码(2):初探List Rendering
  • 大快搜索数据爬虫技术实例安装教学篇
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据可视化之 Sankey 桑基图的实现
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一天一个设计模式之JS实现——适配器模式
  • 仓管云——企业云erp功能有哪些?
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (a /b)*c的值
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (c语言)strcpy函数用法
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)模仿学习-Action数据的模仿
  • (转) ns2/nam与nam实现相关的文件
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .apk 成为历史!
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 常见的偏门问题
  • .NET和.COM和.CN域名区别
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET应用架构设计:原则、模式与实践 目录预览