对于那些不熟悉这个概念的人来说,抽象反转是在高级构造之上实现低级构造,并且通常被认为是一件坏事,因为它增加了不必要的复杂性和不必要的开销。当然,这是一个有点不精确的主观定义。

在您看来,是否使用单范式OOP语言进行编程,其中所有内容都必须是类的一部分,而指针之类的东西不会暴露,例如Java或C#,这不可避免地会导致抽象反转?如果是这样,在什么情况下?

有帮助吗?

解决方案

单范式任何违反了第一条抽象诫命,很少有人知道,甚至不太关心。

如果有必要的话,你不能给任何不能被覆盖的抽象,使你的代码没有丑陋的抽象反转。

无论你的范例是什么,一旦你开始编写非平凡的代码来解决实际问题,你最终会得到一些不太适合范式的东西。如果你声明一个范例就是一个范例,那就是事情变得丑陋。

混合几个比喻,当你拥有的只是一个木槌时,一切都开始看起来像一个钉子,如果你所有的洞都是圆形的,你突然最后得到一些方形钉子而你没有任何锯子, (只是槌子,)你有自己的问题。

没有免费的午餐。一切都是权衡。编写代码越简单,其他人阅读和维护的难度就越大,或者当您遇到的抽象级别低于问题时,您或其他任何人都需要进行调试。 (他们最终会因为没有抽象是完美的

这是<!>“有用的<!>”的根本缺陷。技术和范例,如托管代码,垃圾收集,JIT编译和<!>引用;一切都是对象<!>“;菲亚特。它们强加了一个基线的抽象级别,你不允许它进入下面,当某个问题出现在这个级别以下时,你无能为力。你无法解决糟糕的抽象问题,因为你无法修复它。

其他提示

真正的程序员可以用任何语言编写FORTRAN

换句话说,它不是语言,而是程序员

Java和C#具有与函数等效的静态方法,因此该语言不会强制您使用任何内容。

那就是说,一旦我真的得到OO,我就没有任何想要去另一种编程风格的愿望。

如果你的简单OO层覆盖了复杂的东西,我建议你的代码可能是个问题。如果OO做得恰到好处,它应该很简单,一直到金属。

我认为像Java或C#这样的语言不会以任何有形的方式受到影响,仅仅因为框架附带的库非常丰富,以至于需要打破另一个范例一般编程确实需要。

也就是说,富库本身可能会受到抽象反转的影响,但是由于内部实现经常被隐藏,或者密钥类被密封,因此尝试扩展这些库的开发人员往往被迫实现/复制功能以成功利用基类库提供的扩展点 - 这不是语言问题,而是由基类库的开发人员做出的有意识的选择,以避免暴露可能脆弱的功能或经常使用.Net Framework / JDK的新版本进行更改。

另外,因为.Net Framework / Java Runtime都允许与位于公共运行时顶上的其他语言互操作,所以定位其他范例(如函数式编程,动态语言等)的能力也可以提供另一种途径来摆脱来自单一范式约束。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top