日历

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

抽象机制

Home Forums 《冒号课堂》讨论区 抽象机制

Tagged: 

  • This topic is empty.
Viewing 8 reply threads
  • Author
    Posts
    • #1045
      Todd
      Member

      第7课P186讲到:借助这两种抽象机制(参数抽象和规范抽象),我们可以实现五类基本抽象:过程抽象、数据抽象、迭代抽象、类型层级、多态抽象。

      还不是很明白这两种抽象机制与五类基本抽象的关系。比如:迭代抽象如何体现了参数抽象和规范抽象。

    • #1183
      hui
      Keymaster

      过程抽象赋予程序员自定义函数或运算的能力。参数抽象和规范抽象在其中的体现应该是明显的,以开方函数sqrt(double number)为例:

      number可以是任何一个非负double型变量,这是参数抽象;调用者不必关心sqrt的实现,只根据它的规范便确信sqrt(a)将保证返回a的一个平方根,这是规范抽象。

      数据抽象赋予程序员自定义数据类型的能力。参数抽象和规范抽象在其中的体现与过程抽象是类似的。类型层级多态抽象则是在数据抽象的基础上融入了类族和多态的因素。

      迭代抽象赋予程序员自定义循环的能力。在没有迭代抽象时,程序员如果需要遍历一个容器,需要关注不少的细节:如何获取容器的元素?何处是起点?何处是终点?遍历的方式(顺序、倒序、随机、跳跃)?这不仅增加了客户的负担,也限制了容器今后的变化(担心影响到客户)。

      以Java的Iterator为例:

      public interface Iterator<E>{

      boolean hasNext(); // Returns true if the iteration has more elements.

      E next(); // Returns the next element in the iteration.

      void remove(); // Removes from the underlying collection the last element

      }

      要遍历一个容器,只需要获取它的一个Iterator对象即可。在这里,Iterator便是一个规范抽象,其规范体现在hasNext、next和remove的文档描述上。

      更简单地,只要容器实现了Iterable接口,便可采用for-each循环:

      for (ElementType element : elements) process(element);

      在这里,连hasNext和next的调用都被隐去了,可以认为抽象得到了进一步的提升,此时迭代已经上升到了语言层面(借鉴了C#语法)。

    • #1184
      Todd
      Member

      更明白了,谢谢!

      关于迭代抽象,我最早习惯C的for(int i; i < n; i++),但有时不小心就会出现死循环,而foreach不存在死循环问题,所以逐渐开始用后者了。这也印证了抽象层次越高越普适越可靠。

    • #1185
      hui
      Keymaster

      Java在开始引入foreach时遭到一些非议,认为是无多大用处的语法糖。不过只要能让代码更简洁、可读性更高、更不容易出bug,便是语法糖又何妨?何况这样的用法的确提高了抽象的层次,让同样的表达适用于更多的underlying容器(甚至包括最基本的数组),对底层变化的适应力更强。

    • #1186
      Lumj
      Member

      冒号老师,其实我读到这里的时候,感觉’迭代抽象’出现在其它那4者中间不太合适,因为那4个抽象是..怎么说呢..’编程模型’层面的,而’迭代’却是程序功能层面的,我感觉不应该放在一起讨论

    • #1187
      hui
      Keymaster

      Lumj: 建议你看看图灵奖获得者Barbara Liskov(就是那位提出Liskov原则的女士)的书《Program Development in Java: Abstraction, Specification, and Object-Oriented Design》 ,该书第六章专门谈到迭代抽象。无论java是否为你的熟悉或喜欢的语言,这本书都值得看。

      另外,《冒号课堂》每节后面都有参考资料,可进行延伸阅读。

    • #1188
      Lumj
      Member

      好的,最近一次21世纪计算大会,她是演讲人之一,我当时不识泰山,只觉得她的话题很有感(她谈的就是abstraction),后来才知道就是她的Liskov principle

    • #1189
      folger
      Member

      同感,迭代更像是其他抽象的一个应用,先看看上面的资料…

    • #1190
      Lumj
      Member

      我看了您推荐的读物,不得不说我仍然认为将迭代抽象与其它4者相提并论欠妥..

      就好比..我们不会给书增加一个新的章节,叫’IO抽象’,然后给出文件流抽象之类的例子,并配以”IO抽象使得程序员不必关心诸如缓冲之类的事,只需与逻辑上的Stream打交道”之类的陈述

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