yagni原则
Yagni的意思是“您不需要它”。 这是很多次用来拒绝开发某些功能的短语,这些功能可能在以后但不是现在才需要。 Yagni意味着您应该在代码中开发一项功能,该功能是必需的,何时需要的,而不是很快。
为什么我们要这个词呢? 开发人员倾向于开发不需要的功能吗? 就像这样,否则就不会有任何现象的表达。 对于不知道程序员的想法和工作方式的人来说,这似乎很疯狂。但是事实是,程序员喜欢开发不需要的功能。
为什么程序员倾向于开发不需要的功能?
Yagni的原因和问题
与我刚刚开发的功能相似,对功能进行编码比完全无关的功能更容易。 一个接一个地开发相似的功能比开发一个更简单,然后做完全不同的事情并在第二个星期后进行开发。 开发人员“步入正轨”。 她知道如何开发刚开发出类似功能的功能。
问题在于很多时候将不需要此功能(1)。 即使需要它,也很有可能需要(或很多)与已开发的东西有所不同(2)。 开发但未被企业使用的代码具有附加的成本(3),但没有业务收益。
如果(1)将来不需要该功能,则浪费在开发该功能上的投资。 谁来资助它并不重要。 它可能由业务提供资金,但是很多时候我看到它是由(通常是初级)开发人员在工作时间后创建功能提供的。 他们认为这是学习,练习的好方法。 但是,我坚信这不是学习的好方法。 这是某人对他/她自己说谎的一种方式。 大脑中的认知模式使我们无法承认: “我错了,浪费了我的时间。” 在那段时间,人们可以做更多有价值的事情,而从事免费工作并不专业。 有更好的学习或练习方法。 要专业!
如果需要该功能,但格式不同(2),则必须对其进行修改。 首先,开发和修改的成本不可能比预先正确开发功能便宜。
即使需要它并且完全按照它的开发方式,与过早开发的功能相关的成本(3)包括维护,增加的复杂性调试,维护以及与早期所需的功能延迟交付相关的成本。 如果将功能“一”与功能“二”一起开发,则可能无法更快地交付功能“一”。
当Yagni好时
Yagni 似乎很有价值的唯一情况是在开发功能时,仅A一项就需要额外的编码,而后者在开发后一个功能时会变得无用并被删除。 例如,您需要功能A并使其不具有其他功能B,您需要一些额外的类,当您完成B的开发时,这些类将被丢弃。
推理和形式逻辑一样好。 仅存在这种情况的基本假设可能不正确。 将需要用于一些额外的代码,但是当B发达无用是一个代码味道。 在这种情况下,您必须考虑如何开发这些额外的类,以便以后可以通过功能B使用它们。
但是请稍等! 难道这不是yagni吗? 仅因为某些后续功能会有所不同而以不同的方式开发某些类? 不它不是。 为了得到正确的答案,我们必须区分
特色Yagni和结构Yagni
到目前为止,我在谈论功能yagni。 结构Yagni是不同的,并不是真正的Yagni。 好吧,大多数情况下。
措辞很重要! 我不主张以某种方式为A编写类,以便B可以使用它们,但别无其他。 我建议您检查样式和编码,以找出丢弃多余类的原因。 如果您可以用不同的方式编写它,以便在实现B时可以使用它们,那么它们就可以重用(按定义)。 在这种情况下,您的代码通常是好的(或至少更好的)样式。
这样,实现良好的样式代码,创建简洁的代码,良好的数据和类结构是不可行的。 尚未实现的功能的实现:即yagni。
重构不是Yagni
即使创建干净的代码比Q + D解决方案需要更多的工作,这种额外的编码(包括一些额外的类)也不是Yagni。 我们确实开发了任何业务功能都不需要的代码。 这样,当有一些不太好的代码并且我们重构它时,它也不是yagni。 这不是艺术。 这是企业所需要的,有时,如果老年人和BA做好工作,商人甚至都知道。
练习避免yagni
编写不开发额外功能并且没有特别准备好准备使用那些不需要的额外功能的代码(yagni),但是可以扩展很困难。 这是一门艺术,需要大量练习。 实际上,这是我们严格遵循TDD时所做的。 我们首先开发一个测试,但失败了。 然后,我们开发完成测试所需的最少代码。 然后,我们创建下一个测试,依此类推。 在进行TDD时,您永远不会在测试失败的情况下创建新的测试,并且除非测试失败并且您开发的代码可以通过测试,否则您永远不会开发任何(非测试)代码。
这恰恰是没有Yagni的发展实践。 它在小规模上工作。 当您开始时,您首先会讨厌它。 好像慢跑一样,这似乎很慢而且麻烦。 但是一段时间后,它成为一种习惯,您的代码风格得到了改善,并且没有意识到改变思路的方式,因此可以在更高层次上获得yagni免费设计。
翻译自: https://www.javacodegeeks.com/2015/08/some-thoughts-about-yagni.html
yagni原则