6

刚刚在“你使用什么 JS lib”投票中看到了这条评论

“@Xanti - 是的,是的,编程中的模块化和抽象是一种糟糕的做法。调用其他函数的函数?浪费。”

这让我很好奇,因为我使用的是用于 PHP 的 Kohana 框架和用于 javascript 的 Jquery 库。

为什么有些人认为抽象和模块化是不好的做法?框架和库不是用来简化和加速开发的吗?

这是投票的链接

4

8 回答 8

11

我发现过多的抽象可能会危害您的工作效率:

  • 选择不当的抽象可能比没有抽象更糟糕。

  • 如果你需要阅读四五个不同的模块来理解一个简单的算法是如何工作的,那么抽象障碍可能不在正确的地方。也许有一种重构代码的好方法,或者只是消除障碍会更容易。

  • 如果抽象不对应一个相对熟悉的想法,新的团队成员可能很难学习。

抽象不是“无意识的善”;它的存在是为了服务于特定目的。其中最常见的目的是

  • 保护数据结构的不变量

  • 封装可能改变的设计决策

我最大的抽象障碍经验是使用我们的 C 研究编译器(2008 年的存档快照,网址为https://www.cs.tufts.edu/~nr/c--/)。比学生在编译器课上看到的要多得多的抽象:

  • 目标机器是抽象的
  • 汇编语言是抽象的
  • 调用约定是抽象的
  • 堆栈帧布局使用了不寻常的“块”抽象

这些抽象中的每一个都为我们的研究提供了重要的目的,但总体效果是新生很难学习编译器因此,即使最初的评论是开玩笑的,也抽象可能导致问题的地方。

于 2010-02-26T01:33:28.457 回答
3

在处理有限的资源时,它很容易增加开销。

当然有些东西编译器会优化掉,但是如果你在四个整洁的 .c 文件中创建四个整洁的对象,将它们编译成四个整洁的 .so 文件,然后用哑链接器链接它们,可以轻松内联的跨模块函数调用仍然使用完整状态转储制作,可以完全优化掉的部分仍然执行,等等。

我向您保证,如果您开始使用面向对象语言的最佳实践、使用高级设计模式并创建多个抽象层来编写具有 4K RAM 和 16K 闪存的 8 位 PIC 微控制器,您的程序将永远无法运行。“过早的优化是万恶之源”,一位从未为具有 128 字节 RAM 的平台编程的人说。

于 2010-02-26T15:47:13.940 回答
1

一般来说,抽象和模块化是好的和必不可少的。那里可能有不好的抽象,例如:不再支持或昂贵或只是不可用的框架,或大,或过时,或第二选择,等等。图书馆“市场”总体上是巨大的。您发现自己使用哪种类型的库取决于环境和个人喜好。

为什么有些人认为抽象和模块化是不好的做法?框架和库不是用来简化和加速开发的吗?

改变和学习有时是困难的——所以人们要与之抗争。如果你喜欢研究这种类型,你可以从以下网址开始你的研究:http ://thedailywtf.com/ :-) 我会忽略它们并使用库和框架,因为它们为你服务并让你的程序员生活得更好。

于 2010-02-26T01:01:56.487 回答
1

我们可能可以假设评论者不是认真的。

我无法想象有人声称模块化和抽象是不好的做法并且实际上是有意义的。

于 2010-02-26T00:29:49.407 回答
1

当开发人员能够或被要求与抽象或模块化交互并且无法理解其目的或设计时,他们会声称抽象或模块化是一种不好的做法。

于 2010-02-26T01:44:27.203 回答
0

当每个函数(和辅助函数)都在自己的模块中时?

于 2010-02-26T00:30:55.807 回答
0

前段时间很安静,但是 fortran 编译器的手册建议选择标识符作为相同长度的字符串和随机选择的字母。

解释?好吧,它允许在内部编译器哈希表中均匀分布名称,因此提供了更快的编译速度。

我认为您引用的文字就在此建议旁边

于 2010-02-26T01:20:02.003 回答
0

经常使用好的抽象

好的抽象在您的软件中的 2 个或更多位置被引用。

例子:

  • 具有 2 个以上呼叫站点的功能。
  • 具有 2 个以上具体类的抽象类。
  • 具有 2 个以上实现的接口。
  • 具有 2 个以上实例化的泛型
  • 拥有 2 个以上用户的库。
  • 等等

在 2 个或更多地方引用的抽象通过分解常见的东西有助于减少代码大小,这是一件好事。

但是,如果您有很多只引用一次的抽象,那么很有可能不需要抽象。

出现不必要的抽象时的一些示例:

  • 编写对象满意的代码(接口和抽象类无处不在,只有 1 个实现或具体化)。这些接口和抽象类不是必需的(在开发时)。YAGNI 原则。
  • 有人在旧接口上构建了一个“闪亮的新”接口,经过一些转换后的新功能只调用旧接口。如果你重复几次,你可以想象结果是多么的混乱。在这种情况下,旧函数将有一个调用站点,因此它们不是必需的。您需要将代码从旧函数移到新函数中,或者不要编写新函数并修改旧函数。

一些非常好的抽象示例:

  • 硬件抽象层:为应用程序提供单一接口,因此它们不需要为每种类型的硬件开发代码。
  • 文件系统:不管你使用 FAT、NTFS、EXT3 什么的。它允许您使用文件和目录,其余的由文件系统驱动程序完成。
  • C 语言:你不需要为每个 CPU 架构移植你的程序。只需编译它。

因此,要务实地回答您的问题:抽象是不好的,当它们被少于 2 个地方引用时

关于模块化,它是主观的:你可以随心所欲地组织你的代码。如果你的库的源代码在一个单一的源文件中,它不会比你把它分解成数百个文件更糟。

在评估抽象的好坏时,请始终考虑全局:整个项目、整个产品线等。

于 2014-02-26T16:03:01.720 回答