软件工程师需要理解的面向对象程序开发原则(ISP、DIP、LoD等)(面向对象软件工程开发分几个阶段)

导读

本文示例使用C#语言写的,但是原理适用与一切面向对象语言。

其他几个原则在这篇文章里:软件工程师需要理解的面向对象程序开发原则(SRP、OCP、LSP)

1接口隔离原则(ISP)

定义

不应该强迫客户程序依赖并未使用的方法。接口不应包含所有的对象行为,接口应尽可能的小。这个原则用来处理“胖”接口所存在的缺点。

为什么要遵循此原则?

如果程序中的一部分更改会影响到程序中完全和它无关的其他部分,那么更改的代价和影响就变得不可预测。

违反原则的情形

接口污染,即接口被一个它不总是需要的方法污染,也就是说不是此接口的每一个派生类都需要那个方法。但由于接口已经定义了这个方法,那么不需要它的派生类也要实现这个方法。

运用的方式方法

1)使用委托分离接口

对象的客户端不通过该对象的接口去访问它,而是通过委托去访问他。此方案的缺点:委托处理会导致一些很小但仍然存在的运行时间和内存的开销。

2)使用多重继承分离接口:通常这种做法是首选的。

运用与辨析

在web应用开发中使用仓储模式来封装对底层数据库的访问,为此创建IRepository<T>接口:

public interface IRepository<T> { T GetById(int id); bool Delete(T entity); bool Save(T entity); void Update(T entity); IList<T> Get(string condition); …… }

这是一个典型的胖接口,并不是每一个子类都会实现这么多的方法。对于继承了这个接口却不需要实现其中某些方法的接口,只能将方法体设置为空实现或抛出异常。例如下面的类中不需要实现Get方法,所以在方法体中抛出了异常

public class MRepository<T> : IRepository<T> { public T GetById(int id) { //具体实现 } public bool Delete(T entity) { //具体实现 } public bool Save(T entity) { //具体实现 } public void Update(T entity) { //具体实现 } //不需要实现此方法 public IList<T> Get(string condition) { throw new NotImplementedException(); } }

在接口的实现里抛出异常,这样做显然违背了里氏替换原则(LSP),解决的办法是将IRepository<T>拆分成两个以上的更小的接口,按需实现接口,修改如下:

public interface IRepository<T> { T GetById(int id); bool Delete(T entity); bool Save(T entity); void Update(T entity); } public interface IRepositoryAL<T> { IList<T> Get(string condition); }public class MRepository<T> : IRepository<T> { public T GetById(int id) { //具体实现 } public bool Delete(T entity) { //具体实现 } public bool Save(T entity) { //具体实现 } public void Update(T entity) { //具体实现 } }

2依赖倒置原则(DIP)

定义

高层模块不应依赖于低层模块。二者都应依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这样高层组件与低层组件之间通过抽象的接口来交换而不是具体类。该原则是框架设计的核心。

为什么要遵守此原则?

如果高层模块依赖于低层模块,那么对低层模块的改动会直接影响到高层模块,从而迫使他们一次做出改动。

违反原则的情形

高低层组件通过具体类来实现交互。

运用的方式方法

“倒置”不仅仅是依赖关系的倒置,也是接口所有权的倒置。当使用DIP原则时,往往客户拥有抽象接口,而他们的服务者则从这些抽象接口派生。

启发式的方法:

1)找到那些指向具体类的引用的变量。

2)找到任何派生自具体类的类。

3)找到那些重写方法,而基类方法已经实现过了。

运用与辨析

依赖倒置式控制反转的精髓,通过控制反转可以深刻的体会到依赖倒置的作用。

3迪米特法则(LoD,又名最少知道原则)

定义

一个对象应当对其他对象有尽可能少的了解,只和自己关系最密切对象直接作用。

关系最密切的对象含义是:

当前对象本身,通过该对象方法参数传入的对象,此类的其他实例化对象,以及其所在聚集类的其他成员。

为什么要遵守此原则?

降低耦合,减少依赖。

违反原则的情形

和除了上述关系最密切的对象之间通信。

运用的方式方法

1)限制类及其成员的访问权限。

2)引入门面模式和中介者模式。

4组合/聚合复用原则(CARP)

定义

将已有的多个对象组成一个新对象,达到复用的目的。

为什么要遵守此原则?

在建模的过程中,我们会发现,某些实体之间不具有继承关系,但是他们之间却有一些像是的操作,为了实现这种无法用继承表达的关系,我们遵照CARP原则。

5DRY原则(不要重复自己)

避免重复相同或相似的代码。

运用与辨析

定义拦截器或过滤器充分体现了DRY原则。

例如使用ASP.NET MVC创建企业级应用的过程中,定义了如下的控制器:

public class ExcludedDataController : BaseController{[HttpPost] public ActionResult Add(ExcludedDataInfo info) { if (Request.IsAjaxRequest()) { //其他代码 } return new EmptyResult(); }public ActionResult Del(ExcludedDataInfo info) { if (Request.IsAjaxRequest()) { //其他代码 } return new EmptyResult(); }public ActionResult BatchAdd(string itemCodes, int currentNavId, int library_DataBase_ID) { if (Request.IsAjaxRequest()) { //其他代码 } return new EmptyResult(); }}

其中三个方法中都调用了Request.IsAjaxRequest()方法,明显违反了DRY原则,解决的办法是可以在控制器上添加拦截器。但是或许此控制器的操作中还有不被Ajax调用的操作,那么可以将这些操作移除,放入一个新的控制器中。

6控制反转(IoC)

控制反转是基于面向对象的原则,提倡松耦合理念的设计原则,允许独立开发应用程序的各个组件。

实现方式

实现方式有两种:依赖注入,服务定位。

依赖注入引用其他的dll,组件之间的引用,一个类持有另一个类,这些都可以被看做是依赖。最常遇到的是一个类持有另一个类的问题。

依赖注入有三种方式:构造函数注入,属性注入,方法注入。最常使用的是构造函数的注入。

服务定位通过IoC容器获取依赖的具体类型,并将其赋给接口。

运用与辨析

记录Entity Framework执行SQL语句对优化系统有极大的帮助。为记录SQL定扩展命令拦截器IDbCommandInterceptor,在实现的方法中记录SQL。可以将SQL记录到本地文本文件中,也可以将SQL存储到数据库中,实现如下:

public class CommandInterceptor : IDbCommandInterceptor { private Logger logger = new Logger(); public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { this.logger.Log<int>(command, interceptionContext); } //其他方法…… }

上面的实现包含了一个依赖项,即Logger,如果后续改变存储SQL的媒介,那么就要修改Logger.Log这个方法,明显违反了OCP原则,也没有遵循DIP原则。所以将其更改如下:

public class CommandInterceptor : IDbCommandInterceptor { private ICommandLogger logger; public CommandInterceptor(ICommandLogger logger) { this.logger = logger; } public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { this.logger.Log<int>(command, interceptionContext); } //其他代码 }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年5月21日 下午4:01
下一篇 2024年5月21日 下午4:13

相关推荐

  • 学史力行办实事 – 福田区税务局协同共治助力“双区”发展

    来源:读特 深圳市第七次党代会提出:未来5年,是粤港澳大湾区建设深圳先行示范区建设,完成首个阶段目标的关键时间段 如何在新发展阶段、新发展理念新发展格局下抢抓黄金发展期 更好服务“…

    科研百科 2023年8月21日
    185
  • 低代码开发技术架构

    低代码开发技术架构是一种新兴的软件开发方法,它旨在通过简化开发过程,提高开发效率和降低开发成本。该技术架构的核心理念是通过使用可视化的开发工具和预定义的组件,使开发人员能够快速构建…

    科研百科 2024年2月24日
    138
  • 值得推荐的需求管理方法;如何快速了解一个框架;前端的未来方向

    等登凳灯~~各位社区的开发者们,大家周末愉快! 不知不觉,SegmentFault 思否社区全新的版块 #极客观点 已经上线一个多月啦~ #极客观点 聚焦于技术方向、程序员职业发展…

    科研百科 2022年11月3日
    231
  • 缺陷管理中所需要注意的问题(缺陷问题管理的原则)

    关注【本号】更多关于企业管理、员工激励、薪酬制度、绩效激励等内容免费与你分享!私信“绩效”送您关于员工管理、绩效薪酬的干货视频。 作者:洲老师 有趣、有料、有态度的绩效管理者 1、…

    2022年6月21日
    440
  • 四强支部建设汇报

    四强支部建设汇报 尊敬的领导和各位党员: 我谨代表四强支部向各位领导和党员汇报我们支部的建设和发展情况。 首先,让我们来看一下四强支部的组织结构。我们支部共有党员10名,其中男性5…

    科研百科 2024年11月7日
    1
  • 火龙果栽植项目负责人的技术水平怎么写

    火龙果栽植项目负责人的技术水平 火龙果是一种营养丰富,口感鲜美的热带水果。由于其独特的种植环境和气候条件,使其在近年来成为了全球重要的绿化项目之一。作为火龙果栽植项目负责人,我需要…

    科研百科 2024年11月18日
    1
  • 白银市应急管理局召开2023年党建暨党风廉政建设工作安排部署会议

    3月30日,白银市应急管理局召开2023年党建暨党风廉政建设工作安排部署会议,全面贯彻落实党的二十大精神,安排部署2023年党建暨党风廉政建设工作。市纪委监委派驻政府办纪检监察组副…

    科研百科 2023年9月28日
    244
  • 导师项目查询

    导师项目查询 随着时代的变迁,学术研究和教学的方式也在不断地更新和改进。作为新一代的学者,我们需要不断地学习和探索,以便更好地应对挑战和机遇。在这个过程中,导师项目查询是一个非常有…

    科研百科 2024年10月30日
    0
  • 深圳项目管理公司

    深圳项目管理公司 深圳是中国的一个现代化城市,也是中国最具活力和创新性的城市之一。在这里,有许多优秀的项目管理公司。这些公司专注于为客户提供高品质、高效率的项目管理服务,帮助客户实…

    科研百科 2024年8月14日
    41
  • 潍坊市疾控中心领导班子

    潍坊市疾控中心领导班子简介 潍坊疾控中心是山东省级疾控中心,位于潍坊市奎文区东风东街599号。其领导班子由7名成员组成,分别是: 主任:张建波 副主任:赵海洋、李华、刘强、孟凡虎、…

    科研百科 2024年10月1日
    38