在软件工程领域中,与这种叙述有很强的相似之处。 面向对象的语言引入了继承的概念,这是促进代码重用的聪明的主意。 但是,继承(如果被滥用)很容易导致复杂的层次结构,并且很难更改对象。 滥用继承会造成严重破坏,并且由于使用继承(在Java中)只需要能够拼写“扩展”一词,因此如果您不知道自己在做什么,就很容易就可以破坏这种破坏。 类似的故事可以通过多态和设计模式来讲述。 我们都知道有人陷入地狱而致力于使用一种模式,而不是他们试图解决的问题,而更多地思考该模式。 即使他们了解网桥和适配器之间的区别,架构的某些部分还是很有可能被过度设计。 也许值得记住的是,GOF设计模式中的每一个都已经在JDK中了 ,因此,如果您确实希望在您的体系结构中使用它,则不必看起来太远-否则仅在有意义时使用它。
这种“强大的使用,破坏性的滥用”反模式在Java系统中无处不在。 Servlet过滤器是用于处理请求和响应的非常方便的功能,但这仅是它们要做的。 语言中没有什么可以阻止开发人员将过滤器视为经典对象,而是向过滤器添加公共API和业务逻辑。 当然,决不要以这种方式使用过滤器,并且在出现故障时不可避免地会发生这种情况。 但是关键是,开发人员可以轻松地利用如此强大的功能,滥用它并破坏体系结构。 在Aspects中,甚至在异常(我们都已经看到抛出异常的情况下,仅返回布尔值会更有意义)以及其他许多功能中,“强大的使用,破坏性的滥用”的发生非常容易。
当容易犯错误时,不可避免地会发生错误。 Java编译器不会说-“等等,您真的了解这个概念吗?” 和代码样式工具还不够复杂,无法发现对高级概念的滥用。 此外,没有公司有时间让最高级的人来检查每一行代码。 即使是最高级的工程师也会犯错。
现在,这里写的很多东西都是显而易见的,并且已经被很好地记录在案。 强大的功能通常必须很好地理解才能正确使用。 我认为值得一问的问题是,在以Java为中心的体系结构中是否有任何功能不那么容易滥用的强大功能或工程概念? 我建议至少有一个,即:封装。 首先,让我们考虑一下封装是否不存在。 一切都将是公共的或全局的(如Javascript)。 一旦访问范围缩小,就会发生封装,这通常是一件好事。 通过封装行为是否会使架构更糟? 好吧,很难想到一个可能的情况。 如果将方法设为私有,则可能难以进行单元测试。 但这是真的吗? 对调用它的方法进行单元测试总是很容易的,它将在同一类和逻辑单元中。
这里有个教训要学习。 一旦设计了其他用途的东西,无论它是体系结构中的核心组件,实用程序库类还是REST API,您都将要向世人介绍一下,请问自己:
- 人们滥用它有多容易? 它处于继承的风险级别还是封装的安全级别?
- 滥用的后果是什么?
- 您如何做才能最大程度地减少滥用及其后果?
旨在增加“强大的使用”并最大程度地减少“破坏性滥用”!
参考: 滥用的思考: 都柏林技术博客博客上的JCG合作伙伴 Alex Staveley的“强大使用,破坏滥用” 。
相关文章 :
- Java 7功能概述
- Java SE 7、8、9 –推进Java
- 回收对象以提高性能
- Java Secret:加载和卸载静态字段
- Java最佳实践系列
- 软件设计法则
翻译自: https://www.javacodegeeks.com/2011/12/musing-on-mis-usings-powerful-use.html