简而言之:取决于
您是否真的需要或使用重构/增强版本?
- 是否有具体的收益,无论是短期的还是长期的?
- 这仅仅是为了可维护性,还是真正的体系结构?
真的需要优化吗?
详细介绍
您需要清理干净的东西吗?
这里有些事情要小心,您需要确定真实的,可衡量的收益与您个人的喜好以及不应该接触的潜在不良习惯之间的界限。
更具体地讲,知道这一点:
这是一种反模式,它带有内置的问题:
- 它可能更具扩展性,但扩展起来却并不容易,
- 它可能不容易理解,
- 最后但并非最不重要的一点:您可能会降低整个代码的速度。
有人可能还会提到KISS原则作为参考,但是这里有悖常理:优化方式是简单方式还是整洁的架构方式?答案不一定是绝对的,如以下其余部分所述。
该YAGNI原则是不与其他问题完全正交的,但它有助于问自己一个问题:你会需要它?
除了看上去更易于维护之外,更复杂的体系结构真的为您带来好处吗?
将其写在一张大海报上,并将其悬挂在屏幕旁边,工作中的厨房区域或开发人员会议室中。当然,还有许多其他的原则值得您重复一遍,但是,当您尝试进行“维护工作”并感到有“改进”的欲望时,这一特殊的要求就很重要。
当我们通读代码以试图理解它时,我们很自然地想要“改进”代码,甚至只是不自觉地触摸它。这是一件好事,因为这意味着我们会固执己见,并试图对内部构造有更深入的了解,但这也与我们的技能水平,我们的知识息息相关(您如何决定优缺点?好吧,请参阅下文) ...),以及我们对我们认为软件所知的所有假设...:
- 确实有
- 实际上需要做的
- 最终将需要做,
- 以及效果如何。
真的需要优化吗?
综上所述,为什么首先要“优化”?他们说过早的优化是万恶之源,如果您看到未记录的,看似经过优化的代码,通常可以假定它可能不遵循优化规则,并不需要太多的优化工作,而这仅仅是通常情况下,开发人员的狂妄自大。然而,也许现在只是您的讲话。
如果可以,在什么范围内可以接受?如果有需要,则此限制存在,并为您提供了改进的空间,也为您决定放弃它的强硬路线。
另外,提防看不见的特征。很有可能,此代码的“可扩展”版本也将在运行时增加内存,并为可执行文件提供更大的静态内存。此类OO闪闪发亮的功能会带来不直观的成本,它们可能会影响您的程序以及应在其上运行的环境。
测量,测量,测量
就像Google员工一样,这全都与数据有关!如果可以用数据备份它,那么这是必要的。
有一个不那么古老的传说,在开发上每花费1 美元,测试之后将至少花费1 美元,在支持上至少花费1美元(但实际上,它还要多得多)。
变更影响很多方面:
- 您可能需要生成一个新的版本;
- 您应该编写新的单元测试(如果没有,肯定是这样,并且您可扩展性更高的体系结构可能会留出更多的空间,因为您有更多的漏洞可以解决这些问题);
- 您应该编写新的性能测试(以确保将来可以保持稳定,并查看瓶颈在哪里),而这样做很棘手;
- 您需要对其进行记录(并且扩展性越强,就意味着更多的细节空间);
- 您(或其他人)将需要在质量检查中进行广泛的重新测试;
- 代码几乎(几乎)没有错误,因此您需要对其进行支持。
因此,您不仅需要在这里衡量硬件资源消耗(执行速度或内存占用),还需要团队资源消耗。都需要预测两者以定义目标目标,并根据开发情况对其进行度量,说明和调整。
对于您的经理来说,这意味着将其适应当前的开发计划,因此请就此进行交流,不要陷入愤怒的牛仔/潜艇/黑手党编码中。
一般来说...
对,但是...
别误会我的意思,总的来说,我会支持您提出的建议,并且我经常提倡这样做。但是,您需要了解长期成本。
在理想环境中,这是正确的解决方案:
- 随着时间的流逝,计算机硬件会越来越好,
- 随着时间的推移,编译器和运行时平台会变得越来越好,
- 您将获得接近完美,干净,可维护和易读的代码。
在实践中:
你可能会变得更糟
您需要更多的眼球才能看到它,并且使其复杂化的程度也就越高。
你无法预测未来
您无法绝对确定是否需要它,即使您需要的“扩展”在旧形式中实施起来会更容易,更快捷,以及是否需要对其进行超级优化,也无法绝对确定。 。
从管理层的角度来看,它代表着无直接收益的巨大成本。
使其成为流程的一部分
您在这里提到这是一个很小的变化,并且您会想到一些特定的问题。在这种情况下,我通常说这还可以,但是我们大多数人还都有一些个人故事,包括微小的变化,几乎是外科手术的修改,最终变成了维护噩梦,并且由于乔·程序员没有看到一个截止日期而几乎错过或爆炸了最后期限代码背后的原因并触及了不该有的东西。
如果您有处理此类决定的流程,则可以从他们的个人优势中脱颖而出:
- 如果您正确地进行测试,则可以更快地了解到发生故障的情况,
- 如果对它们进行衡量,就会知道它们是否有所改善,
- 如果您对其进行审查,就会知道它是否会让人们失望。
测试覆盖率,分析和数据收集都是棘手的
但是,当然,您的测试代码和指标可能会遇到与实际代码一样要避免的问题:您是否测试了正确的东西,它们在将来是否正确,并且您测量了正确的东西东西?
不过,通常来说,您测试(直到一定的限制)和度量的次数越多,您收集的数据就越多,您就越安全。不好的类比时间:将其视为驾驶(或一般生活):如果汽车抛锚了您或某人决定今天开车与您自己开车撞死自己,您可以成为世界上最好的驾驶员技能可能还不够。既有环境因素也可能打击您,人为错误也很重要。
代码审查是开发团队的走廊测试
我认为最后一部分是关键:进行代码审查。如果仅使它们改进,您将不会知道其价值。代码审查是我们的“走廊测试”:请遵循雷蒙德(Linus)法则的版本,以检测错误,检测过度设计和其他反模式,并确保代码与您团队的能力保持一致。如果没有其他人,但是您可以理解和维护,那么拥有“最佳”代码毫无意义,这对于密码优化和6层深度体系结构设计都是如此。
作为结束语,请记住:
众所周知,调试的难度是编写程序的两倍。因此,如果您在编写时尽可能聪明,那么将如何调试它?- 布赖恩·克尼根(Brian Kernighan)