zoukankan      html  css  js  c++  java
  • 面向对象的感悟

    一、前言

    面向对象是对业务抽象成类、对象及其之间的关系来建模的软件开发方法,一种编程范式。具体通过面向对象的三大特征来体现面向对象的思想。
    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(); } }

    四、总结

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

  • 相关阅读:
    变分法浅析
    再生核希尔伯特空间(RKHS)在监督学习(SVM)中的应用
    关于对偶最优化
    两个公式
    Linux系统——账号管理
    Linux系统——源码编译安装
    Linux系统——最小化安装
    Linux系统——本地yum仓库安装
    Linux系统——rpm命令
    Linux系统——vim编辑器
  • 原文地址:https://www.cnblogs.com/tuqunfu/p/14359972.html
Copyright © 2011-2022 走看看