你今天在编程中看到的最糟糕的(由于流行或严重性)抽象反转的例子是什么?
对于那些不熟悉这个概念的人,抽象反转是在高级构造之上实现低级构造。更准确地说,假设您有构造 A 和 B。B 在 A 之上实现,但 A 没有在任何地方公开。因此,如果您真的需要较低级别的构造 A,那么您最终会在 B 之上实现 A,而 B 首先是根据 A 实现的。请参阅http://en.wikipedia.org/wiki/Abstraction_inversion。
你今天在编程中看到的最糟糕的(由于流行或严重性)抽象反转的例子是什么?
对于那些不熟悉这个概念的人,抽象反转是在高级构造之上实现低级构造。更准确地说,假设您有构造 A 和 B。B 在 A 之上实现,但 A 没有在任何地方公开。因此,如果您真的需要较低级别的构造 A,那么您最终会在 B 之上实现 A,而 B 首先是根据 A 实现的。请参阅http://en.wikipedia.org/wiki/Abstraction_inversion。
可能我见过的最糟糕的抽象滥用例子就是这个流利的 C#,它将基本的流控制元素(if、while、序列表达式)包装在一个流利的接口中。
所以你的完美地道,干净的代码:
var selectedTextBox = (TextBox)sender,
if (IsAdmin)
{
selectedTextBox.Enabled = true;
selectedTextBox.Text = superSecretPassword;
}
else
{
selectedTextBox.Clear();
}
变成这个烂摊子:
Cast<TextBox>(sender).
WithIf(IsAdmin,
With(selectedTextBox => selectedTextBox.Enabled = true).
With(selectedTextBox => selectedTextBox.Text = superSecretPassword),
With(selectedTextBox => selectedTextBox.Clear());
因为 lambda 让一切都变得更好!
这似乎是一个相当死气沉沉的话题。我将回答我自己的问题只是为了开始一些讨论。我会说我见过的最糟糕的抽象反转是使用 OOP 风格的抽象类/接口来复制函数指针。例如:
interface foo {
int bar();
}
class myClass1 implements foo {
// No member variables.
int bar() {
// Implementation
}
// No other methods.
}
class myClass2 implements foo {
// No member variables.
int bar() {
// Implementation
}
// No other methods.
}
当您需要封装状态和行为时,类应该是一个强大的抽象。函数指针是相对简单的东西,仅用于包含行为。虚函数是使用函数指针数组实现的,但许多 OO 语言不公开函数指针或任何直接等效的东西。因此,您最终会使用接口和类来实现与函数指针等效的功能,而这些类和接口本身是根据函数指针来实现的。这会导致不必要的复杂性和性能下降。
我不确定这是否回答了你的问题,但我已经看到了(我对此感到内疚)像 Lisp 这样的高级语言被用作 Fortran 甚至是汇编语言,因为这就是程序员所处的水平。
恕我直言,计算的讽刺之一是,无论一种语言有多高级,如果它是通用的,它就可以在最低级别使用。精致并不能保证精致。
使用客户端过程集合库来处理 SQL 结果集。
通过使用标志布尔变量来模拟结构编程中的 goto 怎么样?然而,结构化编程已被普遍接受。这不是表明抽象反转并不总是一件坏事吗?
另一个答案或问题,如果你不介意的话。“抽象”这个词真的有定义吗?抽象实际上是好的、坏的还是中性的?我的意思是,我理解数字 2 是抽象的,因为它代表 2 只鞋子、2 只眼睛、2 个周期等的共同点。接口 IStack 可以是抽象的,因为它适用于像堆栈一样的东西。但是如果子程序 A 调用子程序 B 是否意味着它更抽象?为什么我们如此迷恋这个词?
EDT:我只是问,因为我看到人们对“具体”问题嗤之以鼻,认为森林比树木更重要。
我不确定这是否真的符合条件,但它似乎相关。当 SQL Server 2005 推出 CLR 功能时,我听到一群开发人员说“好吧,现在我们可以直接从我们的存储过程中触发 Web 服务调用!” 我还看到了几个关于这样做的教程。这些是一些相互矛盾的抽象层次。
你今天在编程中看到的最糟糕的(由于流行或严重性)抽象反转的例子是什么?
我不知道这是否重要,但是当我看到以它们的实现而不是它们的用途命名的类时,我通常会感到厌烦。它确实是一种匈牙利符号,请注意:
“Factory”、“Visitor”、“Decorator”、“Adapter”、“Impl”、“Concrete”——谁在乎它是如何实现的,它的用途是什么?