ASP.NET MVC 学习笔记-3.面向对象设计原则
在设计程序、系统框架或者类时,最主要考虑的事情就是代码的可扩展性,而不是完成功能即可。因此,提倡使用面向对象设计的最佳实践和基本原则。
1. 单一职责原则(SRP:The Single Responsibility Principle)
对象应承担单一的责任,它们的行为应该关注在它的责任上。比如,视图应该只关注UI的渲染,而不需要任何数据访问逻辑。
通常,代码中要提防的是名称为XXXManager的类,这种类可能包含了更多的职责。
2. 开放封闭原则(OCP:Open Closed Principle)
鼓励对外扩展开发,对修改关闭。尽量通过继承类来扩展其功能,而不是像类中添加更多的行为和责任,这一原则算对SRP原则的补充。
3. 里氏替换原则(LSP:Liskov 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容器的配置来实现类实例的声明周期管理。
|
ASP.NET MVC 学习笔记-3.面向对象设计原则的更多相关文章
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
- ASP.NET MVC学习笔记-----Filter(2)
接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...
- ASP.NET MVC 学习笔记(1)
从头开始系统地学习ASP.NET MVC 为什么要学习ASP.NET MVC?原因很多,可以先来看一下最早的ASP.NET WebForm的一些缺点: 传说中面试经常要问到的ASP.NET WebFo ...
- ASP.NET MVC 学习笔记 1
1. 什么是ASP.Net MVC ASP.Net MVC是一种开发Web应用程序的工具(is a web application development framework),采用Model-Vie ...
- ASP.NET MVC学习笔记(一) 从路由开始创建mvc
之前一篇写一半发现版本太老了,是基于mvc2的. 两本参考书编写的顺序各方面都不太一样.决定重新写一篇. 我这篇文章基于mvc5,vs2015 参考书:Will保哥的ASP.NET MVC4开发指南 ...
- 【转】ASP.NET MVC学习笔记-Controller的ActionResult
1. 返回ViewResult public ActionResult Index() { ViewData["Message"] = "Welcome ...
随机推荐
- ASP.NET Core使用Elasticsearch记录NLog日志
ASP.NET Core使用Elasticsearch记录NLog日志 1.新建一个 ASP.NET Core项目 2.安装Nuge包 运行:Install-Package NLog.Web.AspN ...
- Backbone学习笔记 - View篇
Backbone是一种Web端的MVC框架,这里纪录学习Model,View和Collection的笔记. 1 View initialize构造函数 Backbone.View 与jQuery库紧密 ...
- Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)
学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...
- HTML、CSS
表格标签: 表格标签有:<table> <tr> <th> <td> 让内容居中的标签:<center> 按钮标签:<button&g ...
- ovs 源mac, 目的src 互换
push:NXM_OF_ETH_SRC[],push:NXM_OF_ETH_DST[],pop:NXM_OF_ETH_SRC[],pop:NXM_OF_ETH_DST[] 1:把src mac推到栈顶 ...
- 世界线(bzoj2894)(广义后缀自动机)
由于春希对于第二世代操作的不熟练,所以刚使用完\(invasion process\)便掉落到了世界线之外,错综复杂的平行世界信息涌入到春希的意识中.春希明白了事件的真相. 在一个冬马与雪菜同时存在的 ...
- [bug]微信小程序使用 <scroll-view> 和 box-shadow 引起页面抖动
背景 为了实现点点点动态loading效果,并且方便使用(只需要给一个空元素加一个.loading),有如下代码: .loader { background-color: #fff; font-siz ...
- python操作oracle数据库-查询
python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...
- Storm系列一: Storm初步
初入Storm 前言 学习Storm已经有两周左右的时间,但是认真来说学习过程确实是零零散散,遇到问题去百度一下,找到新概念再次学习,在这样的一个循环又不成体系的过程中不断学习Storm. 前人栽树, ...
- rabbitmq系列四 之路由
1.路由 在上一个的教程中,我们构建了一个简单的日志记录系统.我们能够向许多接收者广播日志消息. 在本次教程中,我们向该系统添加一些特性,比如,我只需要严重错误(erroe级别)的部分日志打印到磁盘文 ...


