跳转到内容

面向对象编程/抽象屏障

来自维基教科书,开放世界开放书籍

抽象屏障

[编辑 | 编辑源代码]

数据抽象

[编辑 | 编辑源代码]

数据抽象背后的理念是识别数据表达和操作的特定方式或操作。完成此操作后,目标是仅在操作数据时使用这些操作。限制操作的使用,可以更容易地更改抽象数据的表示,而不会更改程序的行为。 [1]

在这个来自composingprograms.com的表格中可以找到一些抽象屏障的示例,它演示了不同类型的抽象屏障如何处理有理数。

程序的组成部分... 将有理数视为... 仅使用
使用有理数执行计算 完整的数据值 add_rational, mul_rational, rationals_are_equal, print_rational
创建有理数或实现有理数操作 分子和分母 rational, numer, denom
实现有理数的选择器和构造函数 双元素列表 列表文字和元素选择

最后一列“仅使用”演示了强制执行的提取屏障。然后,从更高层调用这些函数,并通过更低层的抽象实现。

抽象屏障违规

[编辑 | 编辑源代码]

当一个能够使用更高层函数的程序反而使用更低层函数时,就会发生违规。例如,在代码中直接引用分子和分母,而不是仅仅使用 mul_rational 函数,该函数不假设有理数的实现方式。

composingprograms.com 示例 -

>>> def square_rational(x):
       return mul_rational(x, x)

正确:代码很简单,不依赖于有理数的实现。

>>> def square_rational_violating_once(x):
       return rational(numer(x) * numer(x), denom(x) * denom(x))

错误:违反了一个抽象屏障,通过直接引用分子和分母,使代码比需要更复杂。

>>> def square_rational_violating_twice(x):
       return [x[0] * x[0], x[1] * x[1]]

同样错误,因为它做了额外的假设,即有理数表示为双元素列表。这将被视为两次抽象屏障违规。

简而言之,抽象屏障使程序更容易维护和修改,因为使用尽可能少的函数来表示操作,因此需要对代码进行的更改更少,以更改其表示。记住,简单比复杂更好,尤其是在抽象屏障方面。

数据的属性

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
  1. [1], 数据抽象
华夏公益教科书