12

你今天在编程中看到的最糟糕的(由于流行或严重性)抽象反转的例子是什么?

对于那些不熟悉这个概念的人,抽象反转是在高级构造之上实现低级构造。更准确地说,假设您有构造 A 和 B。B 在 A 之上实现,但 A 没有在任何地方公开。因此,如果您真的需要较低级别的构造 A,那么您最终会在 B 之上实现 A,而 B 首先是根据 A 实现的。请参阅http://en.wikipedia.org/wiki/Abstraction_inversion

4

8 回答 8

11

可能我见过的最糟糕的抽象滥用例子就是这个流利的 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 让一切都变得更好!

于 2010-03-29T15:05:24.650 回答
3

这似乎是一个相当死气沉沉的话题。我将回答我自己的问题只是为了开始一些讨论。我会说我见过的最糟糕的抽象反转是使用 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 语言不公开函数指针或任何直接等效的东西。因此,您最终会使用接口和类来实现与函数指针等效的功能,而这些类和接口本身是根据函数指针来实现的。这会导致不必要的复杂性和性能下降。

于 2008-11-19T23:56:03.823 回答
1

我不确定这是否回答了你的问题,但我已经看到了(我对此感到内疚)像 Lisp 这样的高级语言被用作 Fortran 甚至是汇编语言,因为这就是程序员所处的水平。

恕我直言,计算的讽刺之一是,无论一种语言有多高级,如果它是通用的,它就可以在最低级别使用。精致并不能保证精致。

于 2008-11-19T20:49:17.520 回答
1

使用客户端过程集合库来处理 SQL 结果集。

于 2010-03-29T14:14:35.257 回答
1

通过使用标志布尔变量来模拟结构编程中的 goto 怎么样?然而,结构化编程已被普遍接受。这不是表明抽象反转并不总是一件坏事吗?

于 2011-02-13T08:14:27.253 回答
0

另一个答案或问题,如果你不介意的话。“抽象”这个词真的有定义吗?抽象实际上是好的、坏的还是中性的?我的意思是,我理解数字 2 是抽象的,因为它代表 2 只鞋子、2 只眼睛、2 个周期等的共同点。接口 IStack 可以是抽象的,因为它适用于像堆栈一样的东西。但是如果子程序 A 调用子程序 B 是否意味着它更抽象?为什么我们如此迷恋这个词?

EDT:我只是问,因为我看到人们对“具体”问题嗤之以鼻,认为森林比树木更重要。

于 2008-11-22T15:15:10.440 回答
0

我不确定这是否真的符合条件,但它似乎相关。当 SQL Server 2005 推出 CLR 功能时,我听到一群开发人员说“好吧,现在我们可以直接从我们的存储过程中触发 Web 服务调用!” 我还看到了几个关于这样做的教程。这些是一些相互矛盾的抽象层次。

于 2008-11-22T15:33:03.417 回答
0

你今天在编程中看到的最糟糕的(由于流行或严重性)抽象反转的例子是什么?

我不知道这是否重要,但是当我看到以它们的实现而不是它们的用途命名的类时,我通常会感到厌烦。它确实是一种匈牙利符号,请注意:

  • 客户工厂
  • 决策树访问者
  • 抽象窗口装饰器
  • JsonDataAdapter
  • 选项卡式DocumentImpl
  • 具体列表处理程序

“Factory”、“Visitor”、“Decorator”、“Adapter”、“Impl”、“Concrete”——谁在乎它是如何实现的,它的用途是什么?

于 2010-03-29T14:53:01.667 回答