先,让我们定义一个你可能已经见过很多次的抽象概念。
抽象是指通过隐藏复杂的实现细节,并仅展示理解和交互所需的关键特性和行为,来简化概念的过程。简单来说,抽象就是某个概念的简化表达。
抽象概念可以有很多不同的形式,比如:
- 接口:隐藏一个或多个实现的复杂性,提供一种与不同底层系统交互的一致方式。
- 模块:封装一组相关的功能或类,提供一个清晰简化的交互界面,同时隐藏内部细节。
- 函数:简化代码块中的复杂性,让我们专注于函数的作用,而不是实现细节。
你也许已经听说过术语‘过早优化’。这是 Donald Knuth 提出的一个概念:
程序员浪费了大量的时间去琢磨或担忧程序中非关键部分的效率,而这些追求实际上在调试和维护时产生了强烈的负面影响。我们应该忽略那些细微的效率提升,大约97%的时间里,我们不需要考虑:过早优化是万恶之首。然而,在那至关重要的3%里,我们不应错过。
虽然这个陈述是正确的,但在许多代码库中存在一个更加严重的问题:过早的抽象化。
一个过早的抽象是在不完全的猜测基础上进行的假设。猜测是基于不完全事实的看法或结论。例如:“在未来,我们可能需要做X,所以我们要让函数Y足够灵活”或“我们可以设计一个灵活的数据结构以适应未来可能出现的需求”。
过早构建抽象或在设计时过于关注未来的可能性通常是在浪费时间。
为什么过早地进行抽象会这么糟糕?它可能导致各种问题,比如浪费精力,增加复杂度,如果抽象设计不恰当,灵活性也会降低,并且开发速度会变慢,从而影响整体进度。
我记得在以前的一家公司里,我们花了一个冲刺周期使我们的代码库尽可能通用以适应我们预见到的未来需求……但这些需求却从未出现,导致了大量的开发时间和精力被浪费。
在这里,我并不是说所有的通用解决方案或所有的抽象都不好。我只是指出,作为软件工程师,我们倾向于过早行动,这种情况非常常见。通常,应该在实际需要这些功能时才去实现,而不是在预见到它们可能需要时就去实现。
记得:过早地抽象化是所有问题的根源。
这篇帖子摘自《Coder Cafe》 电子报 (第1期的 ).
被无尽的技术内容淹没了?在Coder咖啡馆,我们每天为程序员奉上一个核心概念。由谷歌的一位资深软件工程师撰写,就像为你早晨咖啡精心调制的一样,帮助你深入提升编程技能。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章