0
点赞
收藏
分享

微信扫一扫

1195_SICP学习笔记_抽象数据的多重表示

兮城 2022-03-30 阅读 35


    全部学习汇总: ​​GitHub - GreyZhang/g_SICP: learn SICP and hack lisp.​​

1195_SICP学习笔记_抽象数据的多重表示_数据

1195_SICP学习笔记_抽象数据的多重表示_数据_02

1195_SICP学习笔记_抽象数据的多重表示_sicp_03

1195_SICP学习笔记_抽象数据的多重表示_数据_04

    为了能够让设计有一定的通用性,这里再次强调了抽象隔离。并且,为通用操作引入了一个“范式处理”的概念。而数据抽象以及分层设计的理念,在之前接触到的有理数的计算设计例子算是一个非常有代表的处理例程。

1195_SICP学习笔记_抽象数据的多重表示_github_05

1195_SICP学习笔记_抽象数据的多重表示_github_06

1195_SICP学习笔记_抽象数据的多重表示_github_07

    这里引入了一个新的典型问题:复数的表达。类似之前看过的有理数的表达,复数可以表示为两部分:实部和虚部。这样,实部和虚部分别通过一个坐标信息来进行表达。(内心OS:看到这里冒了几滴冷汗,复变函数是我大学时候一点都没学懂的课程!)但是,这里提到的几个概念模模糊糊还有点印象。复数的表达一般有两种方式,一种是通过复数的实部与虚部组成的坐标系来表述,另一种则是通过极坐标的方式来表示。前面已经简单描述了通过实部和虚部进行表达的方式。使用极坐标的方式,所需要的信息分别为幅值和角度。二者是对等的,因此,在设计的时候最好是能够设计出比较通用的表达处理方法。

1195_SICP学习笔记_抽象数据的多重表示_github_08

1195_SICP学习笔记_抽象数据的多重表示_选择器_09

1195_SICP学习笔记_抽象数据的多重表示_sicp_10

    针对两种不同的表达方式,复数都有加减乘除等通用的处理或者操作方法。这里的原文中提到了另一个概念性的区分也需要再注意一下,针对数据的处理的函数有构造器和选择器的区分。而加减乘除这样的操作,其实是属于选择器类别的。

    给出来的几个公式是很好理解的,后面的两组函数在理解上也不是特别难。看起来,这一段的内容还没有对我进行复变函数的深度灵魂式拷问。

1195_SICP学习笔记_抽象数据的多重表示_sicp_11

1195_SICP学习笔记_抽象数据的多重表示_github_12

1195_SICP学习笔记_抽象数据的多重表示_github_13

1195_SICP学习笔记_抽象数据的多重表示_数据_14

1195_SICP学习笔记_抽象数据的多重表示_github_15

1195_SICP学习笔记_抽象数据的多重表示_选择器_16

    我觉得这个小标题可以翻译为数据标记,那么什么事数据标记呢?其实也简单,结合软件设计来说,其实就是给一个类型增加一个属性,而这个属性用以表征身份的类别。这样,在不同的设计中可以用不同身份类别来进行标注,也就容易在后续的处理过程中选择相应的处理方式。

    针对前面的问题,采用这个方法进一步的处理方式是在选择器设计中包含两套不同的处理逻辑。根据前面的身份类别(类别而不是身份)就可以选择不同的处理逻辑。如此,可以实现一个比较通用的设计。通过这样的设计设计一个抽象的隔离层,可以完成高一级的抽象。

    这样的理论指导下的设计在上面截取的内容中有相关的实现,其实也都比较容易理解。

1195_SICP学习笔记_抽象数据的多重表示_数据_17

1195_SICP学习笔记_抽象数据的多重表示_sicp_18

1195_SICP学习笔记_抽象数据的多重表示_github_19

    前面的设计基本解决了遇到的问题,但是也有其他的挑战。针对这个简单的问题,采用这个方法问题不大。但是针对比较复杂的数据,这种设计方式的挑战就比较大了。

    这样的设计模式有两个非常大的短板:1,必须知道有几种不同的设计以及其所有的设计可能; 2,几种不同的设计必须采用完全相同的函数名称,也就是采用统一的接口规范。

    由此,出现了一个改进方式,也就是数据导向的编程模式。根据数据属性定义不同处理模式下的操作对应关系表,覆盖所有的设计所需。这样,构成编程的较为原始的信息。

    上面的信息可以让所需要做的工作一目了然。而数据导向编程则是一种处理这种表格的技术,实现这样的设计操作设计区分为put和get两种不同的模式。看到了这里突然间感觉熟悉了起来,之前看过的很多C语言的设计其实也采用了这样的思想。

1195_SICP学习笔记_抽象数据的多重表示_sicp_20

1195_SICP学习笔记_抽象数据的多重表示_github_21

1195_SICP学习笔记_抽象数据的多重表示_github_22

1195_SICP学习笔记_抽象数据的多重表示_sicp_23

1195_SICP学习笔记_抽象数据的多重表示_选择器_24

    如此,上面的设计其实就很容易理解了。不过,我没有找到这里面put和get的实现,感觉这里还仅仅是一个思想上的表述,或许距离实用还有一点点剩余的距离。这一次的学习先到此为止,先吸收下这里面的方法论性的信息,细节以后再打磨。


举报

相关推荐

0 条评论