Java 包含';它只被称为一次-是否有自己的方法?

Java 包含';它只被称为一次-是否有自己的方法?,java,refactoring,code-reuse,code-readability,Java,Refactoring,Code Reuse,Code Readability,通过观察各种Android应用程序(不是我写的)的源代码,我注意到一种模式,即将某些代码放入它们自己的方法中,尽管实际上没有任何代码重用,因为这些方法在整个应用程序中只调用一次 到目前为止,我有一条经验法则,即如果一段代码在应用程序代码中使用了两次或两次以上,那么它就有了自己的方法,这仅仅是为了消除代码冗余 但是看到这些整齐地分割成自己的方法(以及自己的方法调用开销)的代码块,我开始觉得我可能遗漏了一些东西 除了出于文档的目的,还有什么其他理由可以证明只将4行代码(只调用一次!)放入自己的方法?

通过观察各种Android应用程序(不是我写的)的源代码,我注意到一种模式,即将某些代码放入它们自己的方法中,尽管实际上没有任何代码重用,因为这些方法在整个应用程序中只调用一次

到目前为止,我有一条经验法则,即如果一段代码在应用程序代码中使用了两次或两次以上,那么它就有了自己的方法,这仅仅是为了消除代码冗余

但是看到这些整齐地分割成自己的方法(以及自己的方法调用开销)的代码块,我开始觉得我可能遗漏了一些东西


除了出于文档的目的,还有什么其他理由可以证明只将4行代码(只调用一次!)放入自己的方法?

请参见重构的理由。

文档和可读性是将代码放入方法的很好理由,即使这些方法只执行一次。有些应用程序可能需要在启动时完成一系列逻辑步骤……您希望将所有代码混杂在一个init方法中,还是一个调用正确命名方法的init方法中?

首先有三个原因:

  • 你可以把它和其他任何东西分开测试。(这可能与只测试公共API的口号背道而驰,但这对我来说很好。如果为了测试它,我必须创建一个方法包级别而不是私有级别,这很烦人,但我宁愿这样做,也不愿一次性测试一大堆逻辑。)
  • 您可以从简单方法中构建更复杂的方法,其中复杂方法的整体处于单个抽象级别,而无需指定细节。读取高级方法意味着只需读取由其组成的构建块的名称;然后,如果需要,您可以深入了解您感兴趣的细节
  • 您可以编写每个方法都能很好地完成一件事的方法,并以明显的方式命名和记录它们

当然,这可能有点过头了,但它肯定是有用的。

希望它有助于编写更干净的代码,并且应该更容易测试


您提到了方法调用开销,但如果只调用一次该方法,则不必担心这一点。

我可以想到以下几个原因,尽管不可否认存在一些重叠:

  • 它有助于使代码自文档化
  • 它使(单元)测试更容易
  • 它有助于阻止您使用数百行长的方法
  • 您可能希望将来在其他地方使用该代码

当然,所有这些都依赖于这样一个假设,即这4行代码是相关的,并且只执行一个函数。我发现一个很好的经验法则是:如果你想不出它的名字,它可能不应该是一个方法。

可读性是我产生这种编码行为的主要原因

如果我盯着一个很长的代码列表,寻找一个特定的过程或一段代码,那么可能不会立即发现该特定过程或代码段的位置

为什么我们要把书分成段落和章节?为什么歌曲有诗节/韵文、合唱和桥梁?因为它更容易把一个大的想法分成小的、高度具体的块

正如软件开发一样,它都是为了驱动高效、干净的代码,从而尽可能快速、优雅地完成工作。它还必须能够被维护它的人阅读


至少,这是我的解释。

Java虚拟机通常对符合内联条件的方法的最大大小有限制。可以说,提取不常调用的代码可能会给程序带来麻烦。你能指出例子吗?

可读性?自文档代码?“方法调用开销”在Java中几乎可以忽略,因为这不是什么大问题。例如,该代码可以在循环中多次调用。开销应该可以忽略不计,因为在这种情况下,编译器可能会对其进行一些JIT优化。根据经验法则+1。我要强调它:
如果你想不出它的名字,它可能不应该是一个方法。