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

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容器的配置来实现类实例的声明周期管理。

ASP.NET MVC 学习笔记-3.面向对象设计原则的更多相关文章

  1. 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 ...

  2. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  3. ASP.NET MVC学习笔记-----Filter2

    ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...

  4. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

  5. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  6. ASP.NET MVC 学习笔记(1)

    从头开始系统地学习ASP.NET MVC 为什么要学习ASP.NET MVC?原因很多,可以先来看一下最早的ASP.NET WebForm的一些缺点: 传说中面试经常要问到的ASP.NET WebFo ...

  7. ASP.NET MVC 学习笔记 1

    1. 什么是ASP.Net MVC ASP.Net MVC是一种开发Web应用程序的工具(is a web application development framework),采用Model-Vie ...

  8. ASP.NET MVC学习笔记(一) 从路由开始创建mvc

    之前一篇写一半发现版本太老了,是基于mvc2的. 两本参考书编写的顺序各方面都不太一样.决定重新写一篇. 我这篇文章基于mvc5,vs2015 参考书:Will保哥的ASP.NET MVC4开发指南 ...

  9. 【转】ASP.NET MVC学习笔记-Controller的ActionResult

    1. 返回ViewResult public ActionResult Index()   {       ViewData["Message"] = "Welcome ...

随机推荐

  1. Day 34 黏包

    一.什么是粘包 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了 应用程序所看到的数据是一个整体,或说是一 ...

  2. BZOJ 1008--[HNOI2008]越狱(容斥&快速幂)

    1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 12593  Solved: 5439[Submit][Status ...

  3. elasticsearch 导入基础数据并索引之 geo_point

    elasticsearch 中的地理信息存储, 有geo_point形式和geo_shape两种形式 此篇只叙述geo_point, 地理位置需要声明为特殊的类型, 不显示在mapping中定义的话, ...

  4. nodejs改变代码不需要重启的方法

    1.node 搭建本地服务器 在F:/node文件夹下新建app.js const http = require('http'); http.createServer((req, res) => ...

  5. 第八天,scrapy的几个小技巧

    一. 微博模拟登陆 1. 百度搜微博开放平台可满足爬取量不大的情况 2. 微博模拟登陆和下拉鼠标应对ajax加载 from selenium import webdriver import time ...

  6. 转的很好的前端html 内容

    HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...

  7. 中国云运营商横向对比——IaaS服务对标

    前言: 随着互联网行业的快速发展,云服务器的使用越来越普遍.中国的云服务器提供商数量也在增加,市场上有大大小小多家云服务器提供商.然而,为了在众多服务提供商中脱颖而出,国内云服务器运营商商也在不断的利 ...

  8. 企业IM (或业务系统)web api的json格式设计思考(原创)

    在企业IM开发中,经常用到和业务系统的数据交换,在中国企业最常见的比如组织架构变更,一般在客户端加密保存了组织架构树(便于快速的查询和树展示),当HR或OA或AD域这些管控企业组织架构的数据发生改变, ...

  9. 一文详解python的类方法,普通方法和静态方法

    首先形式上的区别,实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls. 静态方法无隐含参数,主要为了类实例也可以直接调用静态方法. 所以逻辑上,类方法被类调用,实例方法被实例调用,静 ...

  10. vba调用c#dll

    本文阐述如何用C#创建COM组件,并能用VB6.0等调用.附有完整测试通过的代码.该功能总体看来很简单,实际值得注意的地方还是挺多.因为很少有人写这类文章,有些代码也是转来转去的不全,有些甚至让人误入 ...