首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【抽象那些事】命令式抽象

【抽象那些事】命令式抽象

作者头像
撸码那些事
发布2018-06-21 17:38:42
3900
发布2018-06-21 17:38:42
举报
文章被收录于专栏:撸码那些事撸码那些事

命令式抽象

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

为什么不能命令式抽象?

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

命令式抽象潜在的原因

过程式思维

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

示例分析

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

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类就变成了一个恰当的抽象,同时消除了“命令式抽象”坏味。

重构后的实现:

public class Report
{
    public string ReportName { get; set; }

    public void Create()
    {
        //Create
    }
    public void Display()
    {
        //Display
    }
    public void Copy()
    {
        //Copy
    }
}

现实考虑

具体化

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

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

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

参考:《软件设计重构》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 撸码那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 命令式抽象
    • 为什么不能命令式抽象?
      • 命令式抽象潜在的原因
        • 过程式思维
      • 示例分析
        • 现实考虑
          • 具体化
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档