在参考伯克利的文本版本时,我们提到:
将程序表示为序列操作有助于我们设计模块化的程序。也就是说,我们的设计是通过组合相对独立的部分来构建的,每个部分都转换了一个序列。通常,我们可以通过提供一个标准组件库和一个以灵活方式连接组件的常规接口来鼓励模块化设计。
例如,在python中,<class 'list'>
和<class 'tuple'>
是主要用于存储的顺序数据模型的一些类型。
例如,在python中,<class 'dict'>
是一种流行的非顺序数据模型。
Text reference给出了下面用python编写的两个不同问题的解决方案,并提到了类似的解决方案,这是不令人信服的,因为这两个问题不能作为做出这一决定的典型示例。
>>> def sum_even_fibs(n):
"""Sum the even members of the first n Fibonacci numbers."""
return sum(filter(iseven, map(fib, range(1, n+1))))
>>> sum_even_fibs(20)
3382
>>> def acronym(name):
"""Return a tuple of the letters that form the acronym for name."""
return tuple(map(first, filter(iscap, name.split())))
>>> acronym('University of California Berkeley Undergraduate Graphics Group')
('U', 'C', 'B', 'U', 'G', 'G')
尽管给出了这些例子,但我仍然不清楚做出“序列作为常规接口”的决定。
因此,在设计库或组件时,为什么推荐选择顺序类型数据模型作为常规接口?这是否与这些顺序数据模型(由python/python/lisp提供)的闭包属性有关?
注:麻省理工学院出版社的SICP文本中也有同样的建议。
发布于 2015-05-25 07:10:38
字典的目的是返回给定一个指定键的值,而不是作为顺序容器。仅仅因为其他数据结构是顺序的,但字典并不意味着序列的好处是无效的。
序列是计算中的三种基本逻辑结构之一。每一个(可解的)计算问题都可以通过三个工具来解决:序列、循环和决策。
序列保留元素之间的关系;也就是说,第一个元素必须发生在第二个元素之前,而第二个元素必须发生在第三个元素之前,依此类推。这意味着我们可以在一个序列中检索下一个元素,并确保相对于其他元素,我们以正确的顺序检索了元素。这显然是有益的:每次读取单词时,它们总是由相同的字母序列组成,方法由每次调用它们时相同的指令序列组成。
你可以让序列变懒。您可以创建一个实现状态机的类,并在每次调用方法时从状态机返回一个元素。你可以缓存序列。
序列可以从链接列表、树和其他数据结构中创建。每种数据结构都有其特定的特性;单链接列表可以在一个方向上有效地遍历,但不能在另一个方向上遍历。一些数据结构,如二叉树,将为您提供顺序访问和有效的随机访问。一些数据结构,如双链接列表,允许您有效地向后遍历序列。
如果您编写数据结构以符合顺序接口,则可以将序列的实现切换到最适合给定需求的数据结构。然后,您可以根据该接口编写代码,并确保底层实现是模块化的。
我对python中的序列不太了解,但是Scheme中的基本数据结构(在最初的SICP中使用)是一个列表,您可以以何种方式组成这样的列表(本质上是序列),以及提供的灵活性和能力应该是显而易见的。每一种包含序列的语言都允许这样的组合。
https://softwareengineering.stackexchange.com/questions/284912
复制相似问题