首页 > 代码库 > 何为抽象?你有本末倒置吗?

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

一、何为抽象?

提到抽象,你会想到什么?是这些吗?
  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抽象类和具体的实现类可不能合并了,他们本质不一样。

?看合并的结果:

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

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


 总结:
     抽象来源于个体,多了才抽象。
      现有的子类,抽象后,才有的基类。

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

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