您是否曾经进行过代码审查,记录了非常高的WTF / m? 您是否想知道所有这些错误代码的原因是什么? 在大多数情况下,导致原因1的主要原因是使用设计和编码反模式。
如果您喜欢定义,请参见以下内容:AntiPattern是一种文学形式,它描述了对问题的普遍存在的解决方案,该解决方案产生肯定的负面影响。 AntiPattern可能是由于经理或开发人员不了解更好,没有足够的知识或经验来解决特定类型的问题或在错误的情况下应用了完美的模式而导致的。
重新发明轮子
IMO经常发生的反模式是缺乏对某些有用框架/库的了解。 Apache commons lang和commons集合是每个Java项目中都应该存在的依赖项。
您可以编写自己喜欢的循环过滤或选择集合中的某些对象的方法,也可以使用CollectionUtils.select(…)或CollectionUtils.filter(…)。
您可以执行一些花哨的非null检查,最后以巨大的if-else构造结束,或者可以使用StringUtils.isNotBlank(…)。 由你决定。
一般规则是不要试图重新发明轮子。 有些人喜欢编写自己的Reflection utils,而Apache的commons beanutils ,Spring的BeanUtils和BeanWrapper可以解决问题。
货物崇拜编程
货物崇拜编程是一种编程样式,其中使用模式和方法而不了解原因。 “货运邪教”一词最初是指第二次世界大战后在南太平洋长大的土著宗教。 这些团体的做法集中在建造精美的飞机和军事起落跑道的模型上,以期召唤在战争中带来奇妙货物的神似飞机。
大多数情况下,熟练的或经验不足的程序员都会使用这种编程方式,从其他地方复制粘贴某些代码。
例子:
–在自说明代码中添加不必要的注释 –为没有问题的垃圾将自动收集的对象添加删除代码 –创建工厂以构建简单的对象
通过例外/期望处理进行编码
代替 检查某些特定的转折情况值(例如null值)的方法,有些人喜欢捕获NullPointerException并在catch块中执行一些逻辑。 这种编码方式称为期望处理,因为预期会发生异常。
发明了异常是为了通知您以下事实:确实发生了一些非常糟糕的事情,但并不意味着经常将它们抛出。 这就是为什么它们被称为“例外”。 如果发生这种情况,请仔细处理它们,但不要滥用它们以执行某些本可以通过简单的if-else检查实现的逻辑。
避免/吞咽异常
参考前面的反模式,当引发异常时,意味着发生了意外情况。 您应该做的最后一件事是吞下这些异常,而不是处理其有用的信息。
例如,如果您有一个只希望返回一个对象的方法,因为它希望它是唯一的,则对返回结果列表的数据库查询进行性能检查,检查该列表的大小是否等于1,然后执行只能返回1个唯一对象的查询。结果(如果没有抛出异常)。 如果要实现类似的东西,则意味着预期的对象可能不是唯一的,这意味着实现与分析中所说的有所不同。
继承地狱
继承应谨慎处理。 它非常有用,但是您只能使用它的预期用途。 如果继承树变得肿,那是不对的。 不要为1种特定情况编写抽象类。 请改用合成。 策略模式可以在这里派上用场。
例如,如果您的JSF托管bean'EditUserManagedBean'扩展了AbstractEditingManagedBean,又扩展了AbstractSelectionManagedBean,又扩展了AsbtractParentDetailManagedBean,又扩展了AbstractManagedBean,则您应该知道有些错误,并且应该有其他方法可以实现此行为
镀金 和过早优化
有些人喜欢通过继续努力来改进代码,直到付出额外的努力才增加了价值,而不是坚持要求。 此处犯的错误是,使最终用户看到产品中的其他或增强功能比用户要求或期望的功能更加高兴。 用户可能对结果感到失望,而开发人员的额外努力可能是徒劳的。 该过程称为镀金。
镀金与过早的优化有关。 过早的优化是指考虑将来可能会出现的问题,但目前还不是这种情况。 您应该只考虑所要求的内容和要求的内容,而不要考虑最终可能对将来的目的有用的内容。 频繁发生的过早优化是过早的性能优化。 如果此时不存在性能问题,请不要尝试处理它们,当它们发生时再进行处理。
参考文献
- 由我们的JCG合作伙伴 Glenn Dejaeger在about:software development中 编程反模式 。
- http://en.wikipedia.org/wiki/Anti-pattern#Programming_anti-patterns
- JDK中的设计模式
- 正确记录应用程序的10个技巧
- 每个程序员都应该知道的事情
- Java教程和Android教程列表
翻译自: https://www.javacodegeeks.com/2011/10/programming-antipatterns.html