面向对象编程/抽象屏障
外观
< 面向对象编程
数据抽象背后的理念是识别数据表达和操作的特定方式或操作。完成此操作后,目标是仅在操作数据时使用这些操作。限制操作的使用,可以更容易地更改抽象数据的表示,而不会更改程序的行为。 [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]]
同样错误,因为它做了额外的假设,即有理数表示为双元素列表。这将被视为两次抽象屏障违规。
简而言之,抽象屏障使程序更容易维护和修改,因为使用尽可能少的函数来表示操作,因此需要对代码进行的更改更少,以更改其表示。记住,简单比复杂更好,尤其是在抽象屏障方面。