【问题标题】:Exception to the Law of Leaky Abstractions [closed]泄漏抽象定律的例外[关闭]
【发布时间】:2009-01-26 11:39:35
【问题描述】:

我与一位友好的程序员发生了争执,他被 Joel 的 Law of Leaky Abstractions 轻微损坏了。很难说服他使用任何新的框架/工具箱。我试图提出一个观点,即“抽象是可以的,只要它们允许对抽象级别的低级访问”。

例子:

  • GWT - Google 出色的 Java 到 Javascript 编译器,具有 JSNI - 如果您真的愿意,可以编写“本机”Javascript。
  • 休眠 - AFAIK 有 SQLQuery - 编写本机 SQL 的方法。
  • Java - JNI - 如果你错过了 C。

好听吗? 我错过了什么吗?

谢谢

【问题讨论】:

  • 那么,您的问题到底是什么?如果这个人因为没有完美的摘要而不会使用任何框架或工具箱,那么这个人的思维就有一些根本性的问题。
  • 我试图验证我的论点,而不是仅仅依靠我自己的观点。
  • 这很奇怪。我记得几年前读过那篇文章,我从没想过 Joel 是在谴责抽象,只是说抽象并不总是像“优雅”程序员所认为的那样整洁。在设计抽象时,重要的是要考虑实现如何泄漏;但是抽象仍然是必不可少的……编写一个非平凡的应用程序是一项艰巨的任务,以至于理解一个庞大的系统是不可能的,除非你可以使用抽象来“屏蔽”其他部分,而你只专注于一个部分。跨度>

标签: java abstraction


【解决方案1】:

我从阅读泄漏抽象文章中得到的并不是抽象是不好的,而是你应该重点了解幕后发生的事情,这样你就可以解释“意外”的行为,并避免他们。

你的朋友在做什么?机器语言? :)

【讨论】:

  • 是的,现在他是一名 Java 程序员,但他来自 C/Unix 背景。我正在努力帮助他从 python 到 jython 迈出一大步。
  • 您通常是正确的,但人们并不完全了解 CPU 设计、操作系统和虚拟机的每个小方面......
【解决方案2】:

Joel 的观点(据我理解)是,通过抽象复杂性,您牺牲了对底层复杂性的更精细控制。对于任何不重要的情况,您最终都需要访问更精细的控制粒度,此时抽象会崩溃。

因此,根据定义,所有抽象(几乎)都是泄漏的:

  • 如果系统中存在复杂性,它一定是有原因的(或者您应该找到一种方法来消除它),因此有时会很有用/至关重要。
  • 通过抽象,您限制了您对底层复杂性的控制。
  • 当那些“偶尔”出现时,您将不得不打破抽象。

【讨论】:

  • 没错,这就是为什么定义上没有银弹(几乎):)
【解决方案3】:

在某种程度上,他说得有道理。传统的 c/unix 开发适用于一个足够简单的平台,可以或多或少地理解它的整体。现代平台要复杂几个数量级,要了解所有层的交互方式要困难得多,而且通常是不可行的。

泄漏抽象法则主要适用于框架在管理底层复杂性方面做得不好的情况。可以判断框架的一些方法是它的透明度(易于理解幕后发生的事情)以及它是否能够退出自定义解决方法以限制其功能。

当框架在幕后执行大量复杂的魔术时,诊断和故障排除变得更加困难,通常需要框架底层架构方面的大量专业知识。这意味着从框架中获得的生产力会被额外的训练和调试代码所吸引。这也使框架难以学习和自信地使用,这正是您的 C 编程朋友所习惯的。

当框架阻碍您解决其局限性时,它就会成为开发的障碍。当这种情况经常发生时,代码库要么被装箱,要么被更大更混乱的黑客污染以解决这些问题。这也会导致稳定性和调试问题,

存在这些缺陷的框架示例比比皆是。 MFC 以未能隐藏 Win32 的底层复杂性而闻名。它还广泛使用了生成杂乱代码的向导,这些代码需要手动修改,这首先破坏了拥有代码生成器的目的。早期的 Java GUI 工具包(AWT 和 Swing 的早期版本)很少被桌面应用程序采用,因为它们阻碍了开发人员为应用程序实现原生外观。 SWT 的构建很大程度上是因为 Swing 的这些限制。

然而,现在 Java 已经成熟了一点,可以说它的大部分早期问题已经在现代框架中得到解决。 J2EE 仍然是一个庞大而复杂的系统,在浏览器中开发一个重要的用户界面也是一项相当艰巨的任务。精通这个平台是相当多的工作。然而,这并没有超出人类的智慧。

【讨论】:

    【解决方案4】:

    虽然我认为每个抽象都是有漏洞的,但这并不一定是坏事。

    例如,在传统的纯 C(C#、Java 等)代码中,您通常使用循环、ifs 等从数组中检索数据。但这样您就过度指定了问题的解决方案。

    SQL、Linq 处理相同问题的方式更加智能:你只需说出你想要的,机器就会计算出如何去做。这样,它就没有传统方式的任何特定命令排序,并且可以将工作拆分到不同的 cpu 上,或者重新排序以更好地利用缓存等。

    所以是的,您可以对机器进行一些控制,但是机器比您有一个很大的优势:它位于用户/客户的位置,这样可以做出按需决策(例如使用多核,利用MMX,随便)。

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2013-03-29
      相关资源
      最近更新 更多