Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 多少抽象就是太多?_Language Agnostic_Oop_Abstraction - Fatal编程技术网

Language agnostic 多少抽象就是太多?

Language agnostic 多少抽象就是太多?,language-agnostic,oop,abstraction,Language Agnostic,Oop,Abstraction,在面向对象程序中:多少抽象太多?多少钱刚好合适? 我一直是一个神经质的人。我理解高级封装和抽象背后的概念,但总是本能地认为添加太多只会混淆程序 我总是试图寻找一个没有留下空类或空层的抽象量。在有疑问的地方,我会尝试在现有层中加入一些内容,而不是在层次结构中添加新层 然而,最近我遇到了更多高度抽象的系统。在系统中,所有可能需要在层次结构中稍后进行表示的内容都会在前面进行表示。这导致了很多空层,这在一开始看起来像是糟糕的设计。然而,经过再三思考,我逐渐意识到,保留这些空层可以让您在未来无需进行太多重

在面向对象程序中:多少抽象太多?多少钱刚好合适?

我一直是一个神经质的人。我理解高级封装和抽象背后的概念,但总是本能地认为添加太多只会混淆程序

我总是试图寻找一个没有留下空类或空层的抽象量。在有疑问的地方,我会尝试在现有层中加入一些内容,而不是在层次结构中添加新层

然而,最近我遇到了更多高度抽象的系统。在系统中,所有可能需要在层次结构中稍后进行表示的内容都会在前面进行表示。这导致了很多空层,这在一开始看起来像是糟糕的设计。然而,经过再三思考,我逐渐意识到,保留这些空层可以让您在未来无需进行太多重构的情况下获得更多的空间。它使您能够在旧功能的基础上添加新功能,而无需做同样多的工作来调整旧功能

这样做的两个风险似乎是,您可能会错误地获得所需的层。在这种情况下,仍然需要进行大量的重构来扩展代码,并且仍然会有大量从未使用过的层。但这取决于你花了多少时间来完成最初的抽象,把它搞砸的机会,以及如果你做对了以后可以节省的时间——这可能仍然值得一试

我能想到的另一个风险是过度使用和从不需要所有额外层的风险。但这真的那么糟糕吗?额外的类层是否真的如此昂贵,以至于如果它们从未被使用,会造成很大的损失?这里最大的花费和损失是在制作图层之前损失的时间。但是,当人们可以使用抽象代码而不是更多的低级代码时,大部分时间可能会被节省下来

那么什么时候太多了?在什么情况下,空层和额外的“可能需要”抽象变得过分了?多小就是太小?甜蜜点在哪里?


在你的职业生涯中,有没有可靠的经验法则可以帮助你判断所需的抽象程度?

事实是,这取决于你对未来的展望程度。您希望在不创建太多额外图层的情况下规划可以预见的更改。如果您有一个在系统之间传输数据的设计,请继续创建一个接口,并使用计划的实现作为默认实现。例如,您使用FTP移动文件,但知道该标准明年将基于消息(或其他内容)


对于设计中的层,有时添加的层使编写较小的类变得更容易。如果这意味着具体类变得简单,那么添加概念层是可以的

简单地说,如果代码难以理解,那么就有太多的抽象

这并不是说你应该硬编码所有的东西,因为这是最容易写和读的代码

最简单的测试是要么把它放下几天,再把它捡起来,然后问自己,这有什么意义吗。一个更好的方法是把它交给其他人,看看他们是否能理解它

参见的
(6a)
,并知道这确实是真的。添加抽象层无法解决的唯一问题是由太多抽象层引起的问题。(特别是,每一个抽象部分都使整个事情更难理解。)

那么什么时候太多了?什么时候 做空层和额外的“可能” “抽象”是否需要过度使用? 多小就是太小?火车在哪里 甜蜜点

我不认为这些问题有一个明确的答案。需要经验来培养“太多”和“太少”的感觉。也许使用一些度量或质量控制工具会有所帮助,但很难一概而论。这主要取决于每种情况

以下几个链接可能会启发您寻找答案:

开发就是要在任何软件工程工作中存在的各种紧张关系之间找到正确的平衡。

理论上,这应该是一个简单的数学问题,只使用三个(相当简单的)变量:

  • S=使用节省
  • C=额外抽象的成本
  • P=使用概率
如果S*p>C,那么代码是好的。如果S*P 然而,这纯粹是理论上的原因是,你通常无法猜测使用它的可能性或使用它能节省多少钱。更糟糕的是,你无法猜测或通常甚至无法衡量其存在的成本

至少有人从中得出了结论。在TDD中,标准的咒语是“你不会需要它”(雅格尼)。简单地说,任何不能直接帮助代码满足其当前需求的东西都被认为是一件坏事。本质上,他们已经得出结论,使用的概率很低,包含这样的额外代码是不合理的

其中一些是“自下而上”与“自上而下”的开发。我倾向于将自底向上的开发视为“库开发”——也就是说,不是开发特定的应用程序,而是为应用程序中需要的东西开发库。其思想是,有了一个足够好的库,您可以相对轻松地开发这种通用类型的几乎任何应用程序

很大程度上还取决于项目的规模。大型项目持续使用数十年,比小型项目需要更多的长期投资,而小型项目则需要更快的废弃和更换。这在现实生活中也有明显的相似之处。你几乎不必担心
ab + ac => a(b + c)
ab + ac + ad + ae + af
a(b + c + d + e + f)
10 => 5 * 2