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

命令式抽象

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

为什么不能命令式抽象?

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

命令式抽象潜在的原因

过程式思维

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

示例分析

来看报表生成功能,它使用了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
    }
}

现实考虑

具体化

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

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

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

参考:《软件设计重构》

原文发布于微信公众号 - 撸码那些事(lumanxs)

原文发表时间:2018-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏tkokof 的技术,小趣及杂念

Coroutine,你究竟干了什么?

  使用Unity已经有一段时间了,对于Component、GameObject之类的概念也算是有所了解,而脚本方面从一开始就选定了C#,目前来看还是挺明智的:...

571
来自专栏

消失的魔术:隐藏在js引用和原型链背后的超级能力

js这门语言有很多诟病,然而很多被无视的点,构成了js最为美妙的语言特性。这篇文章将带你走进魔术般的引用型数据类型和原型链背后,寻找那些被遗忘的超能力。并且,基...

1202
来自专栏Java面试通关手册

一份送给Java初学者的指南

我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailc...

1603
来自专栏C语言及其他语言

[每日一题]C语言程序设计教程(第三版)课后习题5.6

题目描述 给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60...

3215
来自专栏Vamei实验室

编程异闻录

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

1112
来自专栏腾讯移动品质中心TMQ的专栏

小说书架内容质量自动化测试

一.项目背景 小说书架的产品思路是:在手机QQ浏览器这个平台上,给用户提供一个小说书架这样的小说阅读入口。通过这个入口阅读到的小说,是后台将从其它网页中抽取到...

2435
来自专栏spring源码深度学习

java核心技术——Exception和Error的区别

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者...

1741
来自专栏微信小程序开发

小程序支付,再来说说JS浮点数的坑

前言:客服收到报名工具小程序用户反馈:创建报名时,输入19.9元,但是,保存的是19.89元。很明显,这是前端的一个坑,JS浮点数的坑。

4722
来自专栏微信公众号:Java团长

开发中我们需要遵循的几个设计原则!

在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则和具体阐...

1041
来自专栏撸码那些事

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

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

3708

扫码关注云+社区

领取腾讯云代金券