何为抽象?你有本末倒置吗?

一、何为抽象?

提到抽象,你会想到什么?是这些吗?

  1. 抽象是面向对象的基础,有了抽象才会有面向对象的三大特征:继承,封装,多态。
  2. 层与层联系要依赖抽象,上层依赖抽象,下层也要依赖抽象。
  3. 总之一句话,编程就是要依赖抽象。

等等这类的话,我们朗朗上口。那么回头再来看这些,它到底是什么?

它不是抽象,它是抽象的一些体现,也就是说这都是抽象后的结果,抽象的优点好处。作为程序员的我们要的就是抽象带来的这些结果,但是我们更重要的一个任务是,如何做出“抽象”?把抽象敲出来,有代码来体现。对于程序员来说,只有将想法落实到代码上才是编程,是有质量的编程。

二、为什么抽象

 那么何为抽象?

  1. 有相同就抽象
  2. 不同领域要联系需要抽象

为什么要抽象?

抽象的最直接目的:为了变化,方便交流

这两个问题往往是分不开的,没有目的的抽象就是无意义的工作。所以在这里一块说说我的看法。

先说第一点:有相同就抽象。遇到几个类有相同的特性:方法也好,属性也好,就可以去使用抽象了。

1、变动少。凡是这种整体的修改,如果有抽象的父类,只要在父类中修改,子类继承即可。省去该多处的麻烦,最怕的是没有改完。

2、接口统一,多种选择。有抽象,就意味着子类可以有多种实现;多态在这个时候就是最完美的诠释了抽象的神奇。对外是统一的,但是却可以选择不同的“子类”,达到不同的效果。

3、扩展是极方便的。当前存在的类的实现不能满足我的需要,我只需要增加一个继承抽象的子类,定义需要的新实现就可以达到目的,与“开闭原则”吻合。

其次是:不同领域要联系需要抽象——解耦紧密相邻的关系

在普通的不过的是,不管什么牌子的USB数据线,都可以接通任何牌子的电脑的USB接口。

这里的接口就是抽象出来的一套规范,只要不同的“领域”把要接触的“接口”规定好,就可以按照这个接口的约定去进行各种实现了。在编程中更是,为了编码变得简单,为了系统系能好,为了合作开发,一个系统被分成了“N”层,分层的目的,是为了解耦,  要直接联系的两个类通过一组约定,有直接联系编程间接联系。在遵守约定的情况下,进行各自的开发。互不影响。

如果没有接口,直接发生关系就会这样:

1、每走一条线,都需要从头走到尾;如果一处做不好,就无法运行;

2、一处方法发生变动,特别是底层方法,调用这个方法的所有的类都需要变动。

3、需求变动,要求更换以前类的执行过程,好比商场打折,有多种选择的情况下,只能增加类,在需要的时候,临时更改调用那个,对于发布的系统,这可不能算一种解决方案。

(这里的领域,你可以理解成层。层的概念也是可大可小,没有严格限制,有代码经验的人根据经验来划分自己的层)

从抽象的由来就可以看出,抽象出现就是为了“交流”。如果说这个类在系统中永远只是这样,不会扩展,不会被传承,不会发生变化,那么就没有抽象的必要了,因为它是“唯一的”。 不变化,交流不影响,要变化,还要交流就必须抽象。

三、抽象的体现形式

  1、抽象成基类。

大家熟知的形式。将相似的几个类中可以抽象的成员拿出来,形成他们的基类。

基类也可分为抽象类和接口,抽象类和接口的区别在于:基类是对属性和方法的抽象,侧重是对“代码重复”的解决;接口是对方法的抽象,避免“方法重复”。

2、合并同类项,不增加父类。

这种方式,是最近学习设计模式的时候突然的理解。在工厂模式到抽象工厂模式改造的过程就是这样。大家看分析。

工厂模式:只建立一个产品:Button。类图如下:

建立另一个产品:Text。类图如下:

观察两个类图,一模一样的工厂模式,一次却只能实现一个产品,要是实现两个产品,就需要把两个图结合起来,那就成“大物”了。让咱们来合并同类相吧。

?1、两个Factory,合并,方法+1;两个UnixFactroy,合并,但是方法+1;两个WindowFactory,合并,方法+1。之所以可以合并时因为他们本质一样。

?2、但是具体的Button,text抽象类和具体的实现类可不能合并了,他们本质不一样。

?看合并的结果:

   

  不增加父类,增加第三者。

这是最简单的一种抽象,也是常用的一种,估计有些人没把它当成抽象。

把多个类中用到的相同方法拿出,作为公共方法,放到第三个类中。这是我们经常用到的,和其他类不建立继承或实现关系,需要的时候就引用。当然在某种情况下,这个第三个类可能被抽象成接口来对待,具体的不做讨论,情况太多,具体对待。

 总结:

     抽象来源于个体,多了才抽象。

现有的子类,抽象后,才有的基类。

分析设计模式的时候,从简单入手,画着画着,就有了父类,有了继承,明白的抽象的存在;写代码也是,先写,写着写着就有了抽象类,有了接口。

以上就是这些天对抽象的思考。欢迎大家指正。



何为抽象?你有本末倒置吗?,布布扣,bubuko.com

时间: 2024-08-06 14:53:45

何为抽象?你有本末倒置吗?的相关文章

iOS设计模式——抽象工厂

何为抽象工厂? 抽象工厂提供一个固定的接口,用于创建一系列有关联或相依存的对象,而不必指定其具体类或其创建的细节.客户端与从工厂得到的具体对象之间没有耦合. 抽象工厂与工厂方法模式的区别 抽象工厂与工厂方法模式在许多方面有很多相似之处,以至于我们常常搞不清楚应该在什么时候用哪一个.两个模式都用于相同的目的:创建对象而不让客户端知晓返回了什么确切的具体对象. 抽象工厂:@.通过对象组合创建抽象产品.@.创建多系列产品.@.必须修改父类的接口才能支持新的产品. 工厂方法:@.通过类继承创建抽象产品.

C语言的抽象与函数指针--思想(转)

一.何为抽象? 从小到大,我们接触到的抽象,最熟悉的莫过于数学了.为什么这样说呢? 比如说,在小学的时候,老师总是拿了几个苹果来引诱我们:同学们,这里有几个苹果啊?于是我们流着口水一个个地数,一个苹果,两个苹果,三个苹果,然后说三个苹果!第二回,老师又拿了三只葡萄来引诱我们:同学们,这里有几只葡萄啊?于是我们又一只只数过来:一只葡萄二只葡萄三只葡萄,三只葡萄!第三天,老师又拿了三颗糖果来问我们:同学们,这里有几颗糖果啊?我们又数开了:一颗糖果,两颗糖果,三颗糖果!回答:三颗糖果.  每一次老师拿

第十章 类、对象与实现

                                                                                      第十章 类.对象与实现   万物都是容器,容器的符号是U:对象就是单个容器的别名.一切皆对象,具有某些相同属性特征的对象归纳成类.对象(Object)是类(Class)的一个实例(Instance):类是对象的模板.如果将对象比作房子,那么类就是房子的蓝图.我们以自然语言去描述世界,而计算机是用各种数据结构去描述世界:数据可以

何为程序员思维

看到这个题目,我想起了很多很多........... 首先,我说明我为什么要写这篇文章了. 一个原因是逸惋惜峥嵘岁月岁月稠,当初读大学的时候,学习计算机技术的课程,我过多的走向了两种极端的状况.一种情况,我愿意把他归结于本末倒置,例如我学习<C++面向对象程序设计>的时候,更多的是研究C++的语法,却忽略了面向对象的思想,到头来,C++语法学会了,但是最重要的面向对象却没有理解,也不知道他能够真正的做些什么.另一个情况,我把它理解为目标很宏大,理解很困难,例如,我学习软件过程的时候,开始,课程

Maven的核心概念:maven仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的

一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 version:项目的当前版本 packaging:项目的打包方式,最为常见的jar和war两种 样例: 1.3.Maven为什么使用坐标? Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范. 拥有了统一规范,就可以把查找工作交给机器. 二.依赖管理 2.1.依赖配置 依赖配置主要

PoEduo - C++阶段班【Po学校】-继承&amp;虚函数&amp;抽象&amp;接口- 课堂笔记

附录(一) 扩展知识:  1--> 面向对象的三个基本特征   1.0 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public) 1.1 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力).可视继承(子窗体使用父窗体的外观和实现代码).接口继承(仅使用属性和方法,实现滞后到子类实现).前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式. 1.3 多态:是将

何为数据挖掘?

何为数据挖掘? 数据挖掘就是指从数据中获取知识. 好吧,这样的定义方式比较抽象,但这也是业界认可度最高的一种解释了.对于如何开发一个大数据环境下完整的数据挖掘项目,业界至今仍没有统一的规范.说白了,大家都听说过大数据.数据挖掘等概念,然而真正能做而且做好的公司并不是很多. 笔者本人曾任职于A公司云计算事业群的数据引擎团队,有幸参与过几个比较大型的数据挖掘项目,因此对于如何实施大数据场景下的数据挖掘工程有一些小小的心得.但由于本系列博文主要是结合传统数据挖掘理论和笔者自身在A云的一些实践经历,因此

设计模式学习总结:(7)工厂方法模式和抽象工厂模式

工厂方法模式应该算是很容易理解的模式,至少从书上看是这样一回事,但是真正深入去理解它一种存在意义却是不容易的(代码量不够-.-).从语法上看,无非就是把面向对象的多态特性封装到了内部工程类,实现运行时多态. 意图: 定义一个用于创建对象的接口,让子类决定实例化哪个类.Factory Method使一个类的实例化延迟到其子类. 结构图: 简单的代码: class AbProduct { public: virtual void sayName()=0; AbProduct(string name)

大话设计模式—何为设计模式

设计模式,说起设计模式,设计模式,总是给人留下一种高屋建瓴,金碧辉煌的感觉.甚至很多人以在一款软件里使用了多少设计模式来衡量软件代码的质量.所以设计模式对于我们这些软件开发人员来说,实在再熟悉不过了.自从一本由四人组合写的奇书横空出世以后,设计模式在软件开发中就火了起来,很多程序员甚至把那本书奉为圣经.虽然我们怎么熟悉它,那我们是否真的完全理解或者掌握了它的精髓了呢? 无论学习什么知识我们首先从三问,或者五问问起(所有知识学习都逃不出这几问).第一问,是什么?首先我们来看看这个设计模式到底是什么