日历

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

数据是什么?

Home Forums 《冒号课堂》讨论区 数据是什么?

Tagged: , ,

  • This topic is empty.
Viewing 7 reply threads
  • Author
    Posts
    • #1059
      Todd
      Member

      今天看了SCIP的数据抽象一节,然后结合之前《冒号课堂》的内容,我感觉对数据的认识又深入了一些。

      我现在对数据的认识是:数据在程序中是一个符号和该符号上的操作规则。比如:定义了一个符号pair,若pair = make_pair(x, y)则left(pair) == x, right(pair) == y。pair本身只是一个符号,它的特征是由其相关的一系列操作(包括构造和使用两类)所体现的。OOP的数据抽象正是以数据为中心组织操作。不知道理解对不对?

      参考文章:

      http://mitpress.mit.edu/sicp/full-text/sicp/book/node30.html

    • #1210
      hui
      Keymaster

      >>数据本身只是一个符号,它的特征是由其相关的一系列操作(包括构造和使用两类)所体现的

      这种理解是正确的。之所以说数据是抽象的,是因为我们不关心其内部的具体结构表示(representation),只关心它是如何被创建、如何被使用的。也就是说,数据应当被当作一个黑箱来使用,任何超过其定义的使用方式都是侵犯其隐私、破坏其抽象的行为。

      不过,上述“符号”二字或许改为“对象”(广义的对象,并非OOP中狭义的对象)更贴切些,因为前者容易让人把数据与指代它的变量混为一谈。事实上,在你参考的文章中也是使用“data object”的字眼。

      如果以这种方式来理解数据,那么就很容易理解“函数也是数据”的思想了。在SICP中讲述的Scheme语言正体现了这种函数式风格。

      在此基础上,(抽象)数据类型的概念也非常自然了。ADT关心的是通过接口定义在一类数据上的行为,而不是它们的内部数据结构。

    • #1211
      hui
      Keymaster

      >>OOP的数据抽象正是以数据为中心组织操作

      这个说法稍微有点问题。既然上面提到的“数据”是用“操作”来定义的,那么“以数据来组织操作”便有循环定义之嫌了。《冒号课堂》中的提法是:OOP是“以数据为中心组织逻辑”(P39)。

      这么说可能更清楚些:在OOP中,定义数据抽象是类的设计者的任务,选择数据结构(data structure)并以之为中心实现各接口是类的实现者的任务。(在实际编程中,这二者的角色可能一人承担)

    • #1212
      Todd
      Member

      谢谢!可不可以这样理解《冒号课堂》中的C语言实现队列的例子:虽然还是C语言的一组函数,但它的目的已经不是过程抽象,而是数据抽象。OOP让数据抽象变得更自然。

    • #1213
      hui
      Keymaster

      没错,所谓队列,就是有FIFO机制的类型。这是一个整体概念,应当是一个抽象的type,而不是具体的struct。C虽然在语法上不完备地支持ADT(没有封装机制),但还是能从概念上支持的。

    • #1214
      Todd
      Member

      以前看过的Church计数,当时完全不理解是怎么回事,只觉得很有趣。现在认识到数据和操作是不可分割的,才有了更深的理解。数学真是神奇,把日常生活中的1,2,3都能发现出这么深刻的道理!

      http://en.wikipedia.org/wiki/Church_numeral

    • #1215
      hui
      Keymaster

      不错,λ-calculus的威力(图灵完备)由此可见一斑。

    • #1216
      Todd
      Member

      数据抽象把数据分为:外部接口和内部表示(representation)两部分。我觉得函数式数据的内部表示非常神奇,就好象是人的基因一样。

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