您今天在编程中看到的抽象反转的最差(由于流行程度或严重程度)是什么?
对于那些不熟悉这个概念的人来说,抽象反转是在高级构造之上实现低级构造。更确切地说,假设你有构造A和B.B是在A之上实现的,但A不会在任何地方暴露。因此,如果你真的需要较低级别的构造A,那么当B首先用A实现时,你最终会在B之上实现A.请参阅http://en.wikipedia.org/wiki/Abstraction_inversion。
答案 0 :(得分:11)
我见过的最糟糕的抽象滥用示例可能是this fluent C#,它在流畅的界面中包含了基本的流控制元素(if,whiles,Sequenced expressions)。
所以你的完美惯用,干净的代码:
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的一切都更好!
答案 1 :(得分:2)
这似乎是一个非常死的话题。我会回答我自己的问题,开始讨论。我会说我见过的最糟糕的抽象反转是使用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语言不公开函数指针或任何直接等价的函数。因此,您最终使用接口和类来实现与函数指针等效的功能,并且这些类和接口本身是根据函数指针实现的。这会导致不必要的复杂性和性能下降。
答案 2 :(得分:1)
我不确定这是否正在回答您的问题,但我已经看到了这一点(而且我已经犯了罪),像Lisp这样的高级语言就像使用Fortran甚至汇编一样语言,因为这是程序员所处的水平。
恕我直言,这是计算的讽刺之一,无论语言有多高级,如果它是通用的,它都可以在最低级别使用。复杂性并不能保证复杂性。
答案 3 :(得分:1)
使用客户端程序集合库来处理SQL结果集。
答案 4 :(得分:1)
如何通过使用标志布尔变量来模拟结构编程中的goto?然而,结构编程已经被普遍接受。这不是抽象反转并不总是坏事的迹象吗?
答案 5 :(得分:0)
另一个答案或问题,如果你不介意的话。 “抽象”这个词真的有定义吗?抽象实际上是好还是坏,还是中立?我的意思是,我理解数字2是抽象的,因为它代表了2个鞋子,2个眼睛,2个周期等常见的东西。接口IStack可以是抽象的,因为它适用于像堆栈一样的东西。但是,如果子程序A调用子程序B,那是否意味着它更抽象?为什么我们如此迷恋这个词?
美国东部时间:我只是问,因为我看到人们在“具体”问题上嗤之以鼻,认为森林比树木更重要。答案 6 :(得分:0)
我不确定这是否真的合格,但似乎有关系。当SQL Server 2005推出CLR功能时,我听到许多开发人员说“好吧,现在我们可以直接从我们的存储过程中启动Web服务调用!”我还看到了几个关于这样做的教程。这些是一些相互矛盾的抽象层次。
答案 7 :(得分:0)
最糟糕的是什么(由于两者之一) 流行或严重程度)的例子 你看到的抽象反转 今天编程?
我不知道这是否重要,但是当我看到以实现命名的类而不是它们用于时,我通常会感到厌烦。它真的是一种匈牙利符号,观察:
“Factory”,“Visitor”,“Decorator”,“Adapter”,“Impl”,“Concrete” - 谁在乎它的实现方式,它用于什么?