您今天在编程中看到的最糟糕的(由于普遍性或严重性)抽象反转的示例是什么?

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

有帮助吗?

解决方案

我见过的抽象滥用最糟糕的例子可能是这个流利的C#,它在流畅的界面中包装了基本流控制元素(if,whiles,有序表达式)。

所以你的完美惯用,干净的代码:

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());

因为lambdas的一切都更好!

其他提示

这似乎是一个非常死的话题。我会回答我自己的问题,开始讨论。我会说我见过的最糟糕的抽象反转是使用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?然而,结构编程已经被普遍接受。这不是抽象反转并不总是坏事的迹象吗?

另一个答案或问题,如果你不介意的话。单词<!> quot; abstraction <!> quot;实际上有一个定义?抽象实际上是好还是坏,还是中立?我的意思是,我理解数字2是抽象的,因为它代表了2个鞋子,2个眼睛,2个周期等常见的东西。接口IStack可以是抽象的,因为它适用于像堆栈一样的东西。但是,如果子程序A调用子程序B,那是否意味着它更抽象?为什么我们如此迷恋这个词?

美国东部时间:我只是在问,因为我看到有人在<!>混淆<!>混淆<!>问题,认为森林比树木更重要。

我不确定这是否真的合格,但似乎有关系。当SQL Server 2005推出CLR功能时,我听到一群开发人员说“<!>”之类的东西,好吧,现在我们可以直接从我们的存储过程启动Web服务调用了!<!> quot;我还看到了几个关于这样做的教程。这些是一些相互矛盾的抽象层次。

您今天在编程中看到的抽象反演示例最糟糕的是什么?

我不知道这是否重要,但当我看到以他们的名字命名的类时,我通常会感到厌烦 执行 代替 他们的用途是什么. 。它实际上是一种匈牙利表示法,请观察:

  • 客户工厂
  • 决策树访问者
  • 抽象窗口装饰器
  • Json数据适配器
  • 选项卡式文档实现
  • 具体列表处理器

“Factory”、“Visitor”、“Decorator”、“Adapter”、“Impl”、“Concrete”——谁关心它是如何实现的,它是用来做什么的?

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