感悟系列-面向对象

一、前言

  面向对象是对业务抽象成类、对象及其之间的关系来建模的软件开发方法,一种编程范式。具体通过面向对象的三大特征来体现面向对象的思想。
  1、继承性:类与类之间的关系和复用性,映射具体业务中对象间的关系。
  2、封装性:类的独立性,易于模块的维护和隔离,降低类之间耦合关系。
  3、多态性:类方法的灵活性、抽象、行为和代码的共享,提供变化。

二、感悟

  在实际的开发中,我们都会想起六大设计原则和23种设计模式,通过这些总结的通用的设计模式解决具体业务场景的问题,其体现的也是面向对象的思想和面向对象的三大特征。如果为了使用设计模式而硬套设计模式就与面向对象思想背道而驰,这样编码既没有反映业务(面向对象是对现实世界理解和抽象),也没有带来代码的易理解,所以就是在业务设计中不应该拘泥于使用什么设计模式,需要的是围绕使用面向对象对现实世界的“还原”。

  关于面向对象,UML创始人Grady Booch在一次大会上提到一个观点,个人很赞同里面提及的面向对象编程的目标:我对面向对象编程的目标从来就不是复用。相反,对我来说,对象提供了一种处理复杂问题的方式。这个问题可以追溯到亚里士多德:您把这个世界视为过程还是对象?在面向对象运动兴起之前,编程以过程为中心,例如结构化设计方法,然而,系统已经达到了超越其处理能力的复杂性极点。有了对象,我们能够通过提升抽象级别来构建更大的,更复杂的系统-我认为,这才是面向对象编程运动的真正胜利。

三、案例

  业务描述:在某一个业务系统中有一个功能模块,主要功能是填报三种大同小异的数据,由创建填报单据、编辑填报单据、提交单据审批,并且下一层级的单据关联上一层级的单据,依次进行填报。

  初始设计:分析业务,对三种填报数据类型分别建立类与对象,封装对应的方法,实现方法中的业务规则,通过类对象互相调用实现三种数据关系。该设计方式体现面向对象的抽象成类,对象及其之间的关系,但是仔细体会这个设计结果,可以发现只是单单创建类与对象,实现方法而没有在设计中反应业务。

  重构设计:在没有使用系统填报之前,填报的方式是使用Excel进行填报,都是静态的填报文档,填报过程是由填报人进行操作,报表本身不会有行为。所以对静态的文档抽象成类,类中包含的仅仅是报表内容信息,不包含行为信息(是静态不具备行为内容),该类体现的就是创建对象,创建了一张报表。对于行为定义一个接口行为(契约),通过接口中的方法实现报表的创建、填报、提交报表的过程。对于报表之间流程可以定义一个流程接口来实现。

// 抽象的数据表
using
System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TQF.SelfBussines { /// <summary> /// (报表抽象) /// </summary> public abstract class SelfBusinessReport { /// <summary> /// 版本号 /// </summary> public string VersionNo { get; set; } /// <summary> /// 分期Id /// </summary> public string StageId { get; set; } /// <summary> /// 创建人 /// </summary> public string CreateBy { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 更新人 /// </summary> public string UpdateBy { get; set; } /// <summary> /// 更新时间 /// </summary> public DateTime UpdateDate { get; set; } /// <summary> /// 报表状态 /// </summary> public int Status { get; set; } /// <summary> /// 报表维护状态(0初始化,1编辑保存、2删除报表、3历史记录)使用策略模式,依据不同的状态做不同的维护操作 /// </summary> public int ImproveStatus { get; set; } } }
// 操作类Handler
using
System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TQF.SelfBussines { /// <summary> /// 报表填报接口(行为契约) /// </summary> public interface ISelfBusinessHandler<T1,T2>where T1:ICreateReportData where T2:SelfBusinessReport { /// <summary> /// handler维护填报项 /// </summary> T2 Report { get; set; } /// <summary> /// 创建报表 /// </summary> /// <param name="createReportData"></param> /// <returns></returns> ResultBase CreateReport(T1 createReportData); /// <summary> /// 维护报表 /// </summary> /// <returns></returns> ResultBase ImproveReport(); /// <summary> /// 提交报表 /// </summary> /// <returns></returns> ResultBase SubmitReport(); } }

四、总结

  每天我们开发者们都会接收业务需求和任务,然后面向对象过程中创建类、对象、关系实现需求,在这个过程分析业务中创建那些类,那些接口,那些抽象类及其方法等信息,也会使用已经学习的设计原则与设计模式设计类,组合类。这个业务的设计有很多种答案,没有绝对的完美设计,只有更能体现业务的设计,所以面向对象带来的思考就是如何更好的体现业务,这个才是我们应该去追求的。

posted @ 2021-02-02 00:46  tuqunfu  阅读(110)  评论(0编辑  收藏  举报