日历

September 2020
M T W T F S S
 123456
78910111213
14151617181920
21222324252627
282930  

抽象是什么?

Home Forums 《冒号课堂》讨论区 抽象是什么?

  • This topic is empty.
Viewing 13 reply threads
  • Author
    Posts
    • #1032
      Todd
      Member

      看了本书以后,我对“抽象”的感觉提高了。但对于程序设计来讲,到底抽象是什么呢?我现在的答案是“抽象就是变化中的不变”。封装,继承,多态,还有设计原则和设计模式是帮助把不变显式化的机制。

    • #1146
      hui
      Keymaster

      这个问题极好,表明你抓住了《冒号课堂》最重要的一个主线。但你提出此问题也表明:《冒号课堂》对抽象的阐述还不够全面、不够深入、不够透彻、不够实在。事实上,我正在酝酿一个想法:以抽象为主题,把编程中的重要概念、编程语言、编程范式、设计思想、设计模式等等一线贯穿。故而在此对该问题无法一言道尽。简单地说,在编程设计过程中所谓的抽象,是指在一定的视角和一定的层次上,对问题域的一种筛选——筛下表面,留住本质;筛下差异,留住共性;筛下实现,留住规范;筛下how to do,留住what to do。你的理解从某种意义上说也是正确的——本质、共性、规范、what to do正是变中的不变

    • #1147
      Todd
      Member

      刚把全书看完,一句话“营养太丰富了,需要慢慢消化”。

      看完全书,尤其是最后一节之后,发现书中关于“抽象是什么”其实很多地方都有讲到,包括前面“减法和除法”。我提那个问题的原因是看了书的大部分以后,觉得抽象很重要,但对“抽象是什么”还没有形成一个核心的印象,也就是说还没有内化成自己的东西。然后,经过思考和总结,提炼成“变中的不变”,并且意识到抽象需要显化。最后,当我再回过头来看书中关于抽象的描述时,理解就更深了,而且书中也明确提到抽象需要“显化,固化,标准化”。

      我感觉对于这样一本书,光尝试直接去理解书中的字句是什么意思不是好的学习方法。有时候要先跳出来,先悟一悟,再看书就恍然大悟了。比如,上面提到的“显化,固化,标准化”,书中只有简单的一句,如果不是读者自己有体会,很可能会忽略掉它。再比如,书中关于“单质,混合物,化合物”的比喻,光尝试从字面去理解还是有困难的,但是当自己真正体会到了以后,再来看书,一下子就看懂了。

    • #1148
      hui
      Keymaster

      边读边悟式的读书方式是最理想的,可惜大多数人嫌其过于费时费神而宁愿采取囫囵吞枣式:-(

      编程不仅仅是程序员与计算机之间的交流,同时也是程序员与程序员之间的交流(即便是一人开发的程序,那也是过去的他、现在的他和未来的他之间的交流)。前者更关心一个程序正确性,后者更关心一个程序的合理性。合理性很大程度上体现在:合理的抽象角度、合理的抽象层次、合理的抽象工具、合理的抽象表达等等,这些对提高代码的可理解性、可维护性、可扩展性、可重用性、可测试性等等起着决定性的作用。

    • #1149
      waterinfire
      Member

      从变化的角度看,我们可以这样理解,抽象的过程就是把握好事物变化中的不变性,做好变与不变的平衡关系。

    • #1150
      semoon
      Member

      学习学习!~

    • #1151
      rstevens
      Member

      郑老师:最近一直在做《冒号课堂》的读书笔记,在整个书中,最重要的观点就是“抽象”

      如你所总结的, “在编程设计过程中所谓的抽象,是指在一定的视角和一定的层次上,对问题域的一种筛选——筛下表面,留住本质;筛下差异,留住共性;筛下实现,留住规范;筛下how to do,留住what to do。”

      我理解,抽象是一种思维的“过程”,包括思考发生的场合(层次)、思考的方式(如何筛选)

      如果这个理解是对的话,那么我对 7.2 节“数据抽象”的理解如下:

      1、 数据抽象发生在实现阶段,通常是在如何实现一个类的过程中发生的。

      2、 在进行数据抽象之前,已进行了“规范抽象”,提炼出了“接口规范”

      3、 数据抽象是将“接口规范”映射到具体实现(通常指一个类)的过程

      4、 抽象的方式是,按照“接口规范”定义出类的对外接口(API);到此为止,“数据抽象”已经结束

      5、 数据抽象完成后,再考虑类的具体实现;围绕的是数据的组织方式、算法实现进行的;这些具体实现通过封装机制隐藏起来。

      我感觉这种理解方式比较教条和生硬,并不符合实际情况,但是表达起来,更让人容易理解。

      想听听你的看法。

    • #1152
      rstevens
      Member

      一些困惑的地方:

      1、 如果说先有了“接口规范”,并且“数据抽象”是在定义出类的对外接口(API)就完成了,那么实际上在定义完“接口规范”的时候,就已经完成了“数据抽象”

      2、 更接近实际的情况时,并没有“接口规范”,但是需要实现一个类,或者已经实现了一个类;在优化代码的过程中,通过“数据抽象”,提炼出类的对外行为规范,设计出接口(API),并将内部实现封装起来; 整个过程,称为“数据抽象”。

    • #1153
      rstevens
      Member

      如果说先有“接口规范”, 那么数据抽象就是提炼“接口规范”的过程,因此处于设计阶段;

      如果说先有了一个类的实现,那么数据抽象就是优化类的实现的过程,处于实现阶段;

      晕了晕了,呵

    • #1154
      hui
      Keymaster

      >>我理解,抽象是一种思维的“过程”,包括思考发生的场合(层次)、思考的方式(如何筛选)

      1。根据上下文,抽象可以指思维的“过程”,也可以指思维的“结果”。

      2。思考发生的场合与层次有关,但不完全等同。抽象的层次越高,忽略的(实现)细节越多。

      >>1、数据抽象发生在实现阶段,通常是在如何实现一个类的过程中发生的。

      数据抽象不是在类的实现过程中发生的,而是在类的设计阶段发生的。事实上,数据抽象的意义正是在于:给定一个API,可以有不同的实现方式。在现实中,不少程序员在API没有规范好之前就开始动手写实现代码,但这不是一种值得推荐的做法。当然,这里也有个抽象层次问题——如果一个类比较底层,仅仅是为另一个高层类提供内部服务,这个要求可以稍微放宽。

      >>2、 在进行数据抽象之前,已进行了“规范抽象”,提炼出了“接口规范”

      这么说可能更好:数据抽象是借助(或依赖)了“规范抽象”,不必把它们硬性分开。

      >>3、 数据抽象是将“接口规范”映射到具体实现(通常指一个类)的过程

      从设计者的角度看,数据抽象是形成“接口规范”的过程;从客户的角度看,数据抽象是忽略具体实现的保证。

      >>4、抽象的方式是,按照“接口规范”定义出类的对外接口(API);到此为止,“数据抽象”已经结束

      这种说法是对的,但不是与你前面提出的1和3矛盾吗?事实上,你在后来的两个帖子中也意识到这个矛盾了:)

      >>5、 数据抽象完成后,再考虑类的具体实现;围绕的是数据的组织方式、算法实现进行的;这些具体实现通过封装机制隐藏起来。

      正确。

    • #1155
      hui
      Keymaster

      >>1、 如果说先有了“接口规范”,并且“数据抽象”是在定义出类的对外接口(API)就完成了,那么实际上在定义完“接口规范”的时候,就已经完成了“数据抽象”

      2、 更接近实际的情况时,并没有“接口规范”,但是需要实现一个类,或者已经实现了一个类;在优化代码的过程中,通过“数据抽象”,提炼出类的对外行为规范,设计出接口(API),并将内部实现封装起来; 整个过程,称为“数据抽象”。

      没错,你提到的第一点是比较理想的过程,第二点是比较实际的过程。但值得指出的是,后者是一个从已有的实现中重新设计的过程,即refactoring。需要refactoring意味着原来设计不尽合理,其原因主要有两种:一是程序员对数据抽象的认识不够或重视不够,在没有设计好API之前就匆匆写实现代码;二是该类的上层类/客户类因自身设计原因或外部需求变化原因发生改变,从而导致类的接口改变。

      在类的hierarchy设计中,类似的情况也时有发生。有时是先有超类,后有子类;有时是从一些类中提炼出超类。这不奇怪,没有人能从一开始就设计出一个完美的系统,因此会交替在高层抽象(接口、超类)和低层抽象(实现、子类)之间往返(top-down/bottom-up)。

    • #1156
      rstevens
      Member

      谢谢及时回复,我之所以理解混论,主要是纠结于书中所说的“数据抽象发生在实现阶段”。

      这样理解或许更为准确:

      1、从分析、设计、实现的层次看,数据抽象发生在实现阶段,(书中所说,数据冲向是实现阶段的五种抽象之一)。具体来说,就是在实现一个类的过程中。

      2、在实现一个类的过程中,又自然的分为“设计”与“实现”两个步骤,或者两个过程; 因为在实现之前,必然有一个设计的思考过程。数据抽象就发生在这个阶段的“设计”过程中。

    • #1157
      hui
      Keymaster

      你的理解非常正确。请注意以上我提到的那句话:“数据抽象不是在类的实现过程中发生的,而是在类的设计阶段发生的”,特意分别在实现和设计前面加了修饰词“类的”。

      这也再次印证书中的一句话:“与其区分设计与实现,不如把握抽象的级别”

    • #1158
      Todd
      Member

      最近在看系统论方面的书,系统论中有一个关于变化和不变的论述:只有通过变化才能理解不变。这让我突然对“测试”有所感悟,测试就是通过变化寻找不变的过程。这里的“测试”还包括生活中的例子,比如要了解一个人的品质,我们需要通过很多事例,这些事例是变化的,但通过这些变化的事例我们能体会到这个人品质中的某些不变特征。

      上面的感悟不一定对,随感而发。

Viewing 13 reply threads
  • You must be logged in to reply to this topic.
 请您评分1星(很差)2星(不行)3星(一般)4星(不错)5星(很棒)