Answers:
理由:
注释中的警告:原始答案假定您已经彻底验证了代码毫无疑问已经死了。IDE容易出错,实际上有几种方法可以调用看似无效的代码。除非绝对确定,否则请专家来。
所有其他答案均基于这样的假设:所讨论的方法确实未使用。但是,问题并未指定该项目是自包含的还是某种类型的库。
如果所讨论的项目是一个库,则看似未使用的方法可以在项目外部使用,而删除它们会破坏其他项目。如果图书馆本身是出售给客户或公开提供的,则甚至不可能追踪这些方法的使用。
在这种情况下,有四种可能性:
filter_name_exists
,ReloadSettings
或addToSchema
(3个任意开源项目随机挑选)应该会提供一些线索,以什么样的方法是应该做的事。javadoc注释可能更有用。我知道这不是一个适当的规范,但足以创建一些至少可以防止回归的测试。
首先检查您的代码覆盖率工具是否正确。
我遇到过这样的情况,即它们没有采用通过对接口的引用来调用的方法,或者是否在某个地方动态加载了类。
由于Java是静态编译的,因此删除方法应该很安全。删除无效代码总是好的。很有可能存在一些疯狂的反射系统在运行时运行它们,因此请首先与其他开发人员联系,否则将其删除。
invokedynamic
说明,因此,您知道……
最好的方法是什么?为他们编写单元测试,或者质疑为什么要在那里?
删除代码是一件好事。
当您无法删除代码时,可以将其标记为@Deprecated,记录要删除该方法的目标主要版本。然后您可以“稍后”将其删除。同时,很明显,不应添加任何依赖它的新代码。
我不建议投资不推荐使用的方法-因此,没有新的单元测试只是为了达到覆盖率目标。
两者之间的区别主要在于方法是否是已发布接口的一部分。任意删除已发布界面的某些部分,对于依赖该界面的用户来说都是一个不愉快的惊喜。
我无法与EclEmma交谈,但是根据我的经验,您需要注意的一件事是反思。例如,如果您使用文本配置文件来选择要访问的类/方法,则使用/未使用的区别可能并不明显(我被那段时间累死了)。
如果您的项目是依赖关系图中的叶子,则不赞成使用的情况会减弱。如果您的项目是一个库,则弃用的理由更强。
如果您的公司使用mono-repo,则删除的风险要比multi-repo情况低。
如l0b0所指出的,如果这些方法已在源代码控制中可用,则在删除后恢复它们是一种直接的练习。如果您真的担心需要这样做,请考虑一下如何组织提交,以便在需要时可以恢复已删除的更改。
如果不确定性足够高,您可以考虑注释掉代码,而不是删除它。在快乐的路径上(这是从不还原已删除的代码的),这是额外的工作,但确实使还原变得更容易。我的猜测是,您应该更喜欢直接删除,直到被这两次烧掉为止,这将使您对如何在这种情况下评估“不确定性”有一些见解。
问他们为什么在那里?
花在捕获知识上的时间并不一定浪费。众所周知,我需要执行两个步骤来执行删除操作:首先,通过添加并提交注释来解释我们对代码的了解,然后删除代码(和注释)。
您也可以使用类似于体系结构决策记录的方式来捕获源代码的知识。
代码覆盖率工具并非一无所知。仅仅因为你的工具,声称该方法不叫,这并不意味着它不叫。存在反射,根据语言的不同,可能还有其他方法可以调用该方法。在C或C ++中,可能存在构造函数或方法名称的宏,并且该工具可能看不到调用。因此,第一步将是:对方法名称和相关名称进行文本搜索。问有经验的同事。您可能会发现它实际上已被使用。
如果不确定,请在每个“未使用”方法的开头放置一个assert()。也许它被调用了。或日志记录语句。
也许代码实际上是有价值的。同事已经工作了两个星期,可能明天要上班,这可能是新的密码。今天不调用它,因为它将在明天添加它的调用。
也许代码实际上是有价值的第2部分:代码可能正在执行一些非常昂贵的运行时测试,从而能够发现出错的地方。仅当实际出错时才打开代码。您可能正在删除有价值的调试工具。
有趣的是,最糟糕的建议是“删除,提交,忘记”。是最高评分。(代码审查?您不进行代码审查?如果您不进行代码审查,您在做什么编程?)
根据软件运行的环境,您可以记录是否曾经调用过该方法。如果在适当的时间内未调用该方法,则可以安全地删除该方法。
这是比仅删除方法更为谨慎的方法,如果在高度故障敏感的环境中运行,则可能很有用。
我们登录到专用的#unreachable-code
备用频道,为每个要删除的候选人提供一个唯一的标识符,事实证明这是非常有效的。