zoukankan      html  css  js  c++  java
  • 【抽象那些事】 命令式抽象

    mark

    命令式抽象

    这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。

    为什么不能命令式抽象?

    面向对象的基本原则是,识别真实世界中的事物,并使用抽象来表示它们。在解决方案域中,必须将问题域的对象表示出来,为此可采用映射域实体这一实现手法,抽象的每个类都必须封装数据和相关的方法。只包含一个操作的类根本不是抽象,其操作的数据位于其它地方时尤其如此。这样很多操作相同数据的方法位于不同的类中,减低了类的内聚性,违反了封装和模块化原则。

    命令式抽象潜在的原因

    过程式思维

    数据和操作这些数据的方法被封装在不同类中,典型的过程式思维。

    示例分析

    来看报表生成功能,它使用了CreateReport、CopyReport、DisplayReport等类。其中每个类只包含一个方法。与报表相关的数据项,如报表名称等都放在了Report类。很显然程序中存在“命令式抽象”,这种坏味不仅增加了类的数量(至少4个类,理想情况下只需要1个类),而且内聚的方法进行了分离,增加了开发和维护的复杂性。该设计采取的是“功能分解”,而非“面向对象分解”。

    mark

    public class Report
    {
        public string ReportName { get; set; }
    }
    
    public class CreateReport
    {
        public void Create()
        {
            //Create
        }
    }
    
    public class DisplayReport
    {
        public void Display()
        {
            //Display
        }
    }
    
    public class CopyReport
    {
        public void Copy()
        {
            //Copy
        }
    }
    

    重构:我们将所有存在“命令式抽象”坏味的类中的方法都移到Report类中,那么Report类就变成了一个恰当的抽象,同时消除了“命令式抽象”坏味。

    重构后的实现:

    mark

    public class Report
    {
        public string ReportName { get; set; }
    
        public void Create()
        {
            //Create
        }
        public void Display()
        {
            //Display
        }
        public void Copy()
        {
            //Copy
        }
    }
    

    现实考虑

    具体化

    具体化指的是将不是对象的东西提升为对象。将行为具体化后,便可对其进行存储、传递和转换。具体化可提高系统的灵活性,但是代价是增加了系统的复杂度。

    很多设计模式都使用了具体化:状态模式、命令模式、策略模式。

    为了提高可重用性、灵活性和可扩展性而有意识地将原本不是对象的东西提升为对象,这不能算是坏味。

    参考:《软件设计重构》

    来源:http://songwenjie.cnblogs.com/
    声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,不妨点击一下下方的推荐按钮,谢谢支持。转载与引用请注明出处。
    微信公众号:
  • 相关阅读:
    POJ1201 Intervals & TYVJ 1589 西瓜种植 差分约束
    洛谷 P3385 【模板】负环 SPFA
    Test 2018-07-19 二中集训
    《一出好戏》一中高三学子誓师大会后记
    [NOI2012] 迷失游乐园 概率 期望 基环树DP
    codeforces CF983E NN country 树上倍增
    「Luogu P3521 [POI2011]ROT-Tree Rotations」
    「高等数学学习笔记 DAY18」
    「高等数学学习笔记 DAY17」
    「高等数学学习笔记 DAY16」
  • 原文地址:https://www.cnblogs.com/songwenjie/p/8977618.html
Copyright © 2011-2022 走看看