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

命令式抽象

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

为什么不能命令式抽象?

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

命令式抽象潜在的原因

过程式思维

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

示例分析

来看报表生成功能,它使用了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 条评论
登录 后参与评论

相关文章

来自专栏微信小程序开发

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

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

2032
来自专栏我杨某人的青春满是悔恨

人生充满选择,编程也是

人生在世,我们每天都需要进行三项重大选择:早餐吃什么,午餐吃什么,晚餐吃什么。这一度让我感到非常为难,于是我养成了一个习惯,只要在附近的餐馆发现了几种还不错的食...

621
来自专栏Dawnzhang的开发者手册

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

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

1052
来自专栏养码场

若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼...

1102
来自专栏同步博客

设计模式六大原则

  单一职责原则又称为单一功能原则,即不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

654
来自专栏韩伟的专栏

面向对象的代码风格(上)

大家过年好呀!公众号从今天开始恢复更新,感谢大家不离不弃的关注。 今天的文末有投票,以助于我在新的一年里将公众号做得更好,踊跃参加一下吧! 本篇文章分两章发送,...

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

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

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

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

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

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

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

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

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

851
来自专栏

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

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

902

扫码关注云+社区