因为软件错误可能使我们在开发人员面前看起来很糟糕,并导致其他人对我们的想法减少,所以最好避免编写错误,快速识别和修复错误或掩盖我们的错误。 有许多博客文章和文章讨论如何避免错误以及如何识别和修复错误,因此,在这篇博客文章中,我将介绍一些在地毯下扫除Java代码库中问题的最有效策略。

吞咽检查异常

当我们不小心将错误引入代码时,异常是让我们放弃的事情之一。 在方法上声明throws子句或catch选中的Exception也很麻烦。 解决这两个问题的方法是,在可能引发该异常RuntimeException执行任何操作的情况下,简单地捕获该异常(即使它是RuntimeException )。 这样可以使API保持简洁,并且几乎没有人可以对已检查的异常进行处理。 通过不对其进行记录或执行任何操作,甚至没有人需要知道它曾经发生过。

注释掉或删除不满意的单元测试

失败的单元测试会分散您的注意力,使您难以确定新功能何时破坏了测试。 当我们通过代码更改破坏了某些内容时,它们也可以显示。 注释掉这些失败的单元测试将使单元测试报告更整洁,并使查看他人的新功能是否破坏单元测试变得更加容易。

在基于JUnit的单元测试中使用

注释掉失败的单元测试似乎很令人厌恶,因此另一种可能更令人愉悦的选择是使用@Ignore批注来注释基于JUnit的失败单元测试方法。

完全删除个别测试

如果用@Ignore注释掉一个损坏的测试或用@Ignore注释一个损坏的测试是不令人满意的,因为有人仍然可以检测到我们已经破坏了一个单元测试,我们可以简单地完全删除有问题的单元测试。

注释违规断言

我们不必注释掉或删除整个测试。 它就像在单元测试方法中注释掉或删除assert语句一样简单。 该方法每次都可以成功执行并运行,因为没有断言意味着没有办法失败。 当单元测试方法非常长且令人费解,从而不容易发现缺少断言时,这特别有效。

分散无用和冗余测试的噪音

注释单元测试,使用@Ignore注释基于JUnit的单元测试,甚至删除单元测试对于在Java底下扫除问题的策略可能也太明显了。 为了使这些变得不那么明显,另一种有效的策略是在同一单元测试类中编写许多不必要的和多余的测试方法,以便看起来正在进行全面的测试,但实际上只有一小部分功能(我们知道的子集是工作)正在测试中。

编写单元测试,即使不正确,也可以“证明”您的代码是正确的

我们可以利用以下事实:单元测试只能测试单元测试的作者认为被测软件的预期行为,从而编写能够证明我们的代码正确的单元测试。 如果提供2和2时,我们将两个整数相加的代码意外返回5的和,我们可以简单地将单元测试中的预期结果也设置为5。会显示漂亮的单元测试报告,而不必是明智的。

避免记录详细信息

日志可能会暴露一个人的软件问题,而应对这种风险的有效方法是完全不进行日志记录,仅记录常规操作和结果,并在记录的消息中保留详细信息(尤其是上下文)。 过多记录平凡的细节也可能使任何更有意义的消息模糊,这些消息可能会揭示我们代码的弱点。

避免使用描述性的

一个描述性的toString()方法可能会过多地揭示任何给定实例的状态,并揭示我们的错误。 不覆盖Object.toString()可能会使识别问题和将问题与任何给定的代码或开发人员相关联变得更加困难。 跟踪问题所需的额外时间使您有更多时间进入下一个项目,然后才发现是您的代码有问题。 如果编写的Java类使用描述性的toString()扩展了类,则可以在扩展类中覆盖该方法以不执行任何操作(有效地删除可能导致问题的toString()输出)。 如果希望它看起来像从未在继承层次结构中实现过,请确保扩展类的toString()方法返回System.identityHashCode(this) 。

不要让

NullPointerException可能是Java开发人员处理的最常见的异常。 这些特别危险,因为它们通常会揭示代码的弱点。 try仅包装每一行代码的一种策略– catch并简单吞下异常(包括NPE)。 另一个不太明显的策略是通过从不返回或传递null来避免NPE。 有时,可以使用明显的默认值代替null (例如,空的String或collection),但有时我们必须更有创造力,以避免null 。 在此处可以使用“默认”非null值代替null 。 关于如何处理此任意非null默认值,有两种思路。 一种方法是使用数据集中最常见的值作为默认值,因为如果仍然很常见,那么当该值中出现更多的值并且您更有可能拥有看起来像这样的代码时,可能不会注意到该值。处理该共同价值而无任何意外。 另一方面,如果您拥有一个几乎从未使用过的值,那么它可以成为一个很好的默认值,因为受它影响的代码(尤其是经过良好测试的代码)可能比通常期望的值少。

结论

当我回顾这些策略以扫除底层Java代码问题时,我注意到了一些重复出现的主题。 就暴露我们软件的弱点而言,异常,日志记录和单元测试特别麻烦,因此,有效地“发现我们的足迹”的大多数方式都与异常,日志记录和单元测试的处理有关就不足为奇了。

翻译自: https://www.javacodegeeks.com/2017/04/effectively-sweep-problems-rug-java.html

如何在Java地毯下有效地清除问题相关推荐

  1. 清除java_如何在Java地毯下有效地清除问题

    清除java 因为软件错误可能使我们在开发人员面前看起来很糟糕,并导致其他人对我们的想法减少,所以最好避免编写错误,快速识别和修复错误或掩盖我们的错误. 有许多博客文章和文章讨论如何避免错误以及如何识 ...

  2. 如何在Java 环境下使用 HTTP 协议收发 MQ 消息

    1. 准备环境 在工程 POM 文件添加 HTTP Java 客户端的依赖. <dependency><groupId>org.eclipse.jetty</groupI ...

  3. JAVA系统下的FLASH,FLV视频应用解决方案(转载)

    JAVA系统下的FLASH,FLV视频应用解决方案 2006年11月20日15:59星期一  [资料] 最近网络上FLV视频应用越来越多了.使用这种方案的好处是:一定程度上可以保护作品版权,易于视频作 ...

  4. FLASH,FLV视频应用在JAVA系统下的解决方案

    FLASH,FLV视频应用在JAVA系统下的解决方案 来源 http://5do.com.cn/roller/page/bhlove?entry=jf 最近网络上FLV视频应用越来越多了.使用这种方案 ...

  5. java lifo 队列_java - 如何在LIFO模式下实现链接的阻塞队列 - SO中文参考 - www.soinside.com...

    如何在LIFO模式下实现链接的阻塞队列 问题描述 投票:0回答:1 标题已经说明了一切,在我的代码中,我有一个实现链接阻止队列并提供在队列中插入和获取元素的方法的对象,我希望从队列中进行插入/提取. ...

  6. 如何在Chrome浏览器下清除DNS缓存

    如何在Chrome浏览器下清除DNS缓存 本文翻译自:How to Clear/Flush DNS Cache in Google Chrome? 很多时候,当我购买新的域名,并更改域名服务器并将其托 ...

  7. IDEA下,如何在java项目中新增jsp模板文件

    IDEA下,如何在java项目中新增jsp模板文件 大家会不会有这样的烦恼,就是当想要创建一个jsp模板文件的时候,右键new的时候找不到JSP选项. 这是因为在创建项目的时候没有选中Web Appl ...

  8. 如何在Java中比较日期? [重复]

    本文翻译自:How to compare dates in Java? [duplicate] This question already has answers here : 这个问题已经在这里有了 ...

  9. 如何在Java中将String转换为int?

    如何在Java中将String转换为int ? 我的字符串仅包含数字,我想返回它代表的数字. 例如,给定字符串"1234" ,结果应为数字1234 . #1楼 好吧,要考虑的一个非 ...

最新文章

  1. VMware HA环境搭建七:WIN2012 ISCSI目标服务器的安装
  2. Android驱动开发读书笔记六
  3. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
  4. 熟知的CRM有哪些功能特点?
  5. python中xrange和range的异同
  6. CALL FUNCTION START NEW TASK
  7. Flutter视频播放、Flutter VideoPlayer 视频播放组件精要
  8. POJ NOI0105-30 含k个3的数【数制】
  9. 基于51单片机控制的BUCK开关电源Proteus仿真
  10. UltraCompare比较文件时出现UTF8_ConvertorForMac无转换符号!
  11. 神经网络模型如何应用到实际 - 神经网络模型数学建模案例
  12. 逆向破解思路和获取app的代码,脱壳操作(三)
  13. Python3之多线程
  14. 搭建即可运营的秒收录导航网源码带广告管理完美运营版
  15. android 分享二维码图片到微信QQ(url地址字符串生成二维码图片、分享二维码图片到微信QQ)
  16. 标准c语言局域网文件传输,winsocket局域网文件传输系统源代码(C语言)+winsocket.doc...
  17. MTK平台camera bsp学习之android平台架构篇
  18. Raft is not great?
  19. 简单几步骤查询所有快递物流信息
  20. 策略梯度REINFORCE

热门文章

  1. mybatis入门(四)之动态SQL
  2. 集合框架 Queue---BlockingQueue详解
  3. vue组件自定义v-model
  4. 菜鸟学Java(六)——简单验证码生成(Java版)
  5. Safari浏览器不支持let声明的解决方式
  6. Nodejs第一讲记录
  7. 小二,先来两桂花豆沙包!
  8. 2015蓝桥杯省赛---java---A---9(垒筛子)
  9. 2017蓝桥杯省赛---java---B---2(纸牌三角形)
  10. 统计单词出现的次数并进行排