如果不多次调用它们,您是不是应该将代码重构为私有方法? [关闭]

Posted

技术标签:

【中文标题】如果不多次调用它们,您是不是应该将代码重构为私有方法? [关闭]【英文标题】:Should you refactor code into private methods if they aren't called more than once? [closed]如果不多次调用它们,您是否应该将代码重构为私有方法? [关闭] 【发布时间】:2010-10-21 01:43:24 【问题描述】:

是否值得为仅在类中调用一次的代码提取私有方法,或者将代码留在父方法中(可能)并带有说明其作用的注释?

【问题讨论】:

【参考方案1】:

您应该根据您在其他地方使用时想要公开的 API 和方法/属性的设计将其重构为私有。您不应该考虑使用它来决定是否将其设为私有/公开。

【讨论】:

【参考方案2】:

只是一个愚蠢的估计,但我想说大多数私有方法只在普通类中的几个地方被调用。但是,如上所述,如果您将所有功能分解为逻辑块,它会使您的代码更具可读性并且更易于测试/维护。重构是个好习惯

【讨论】:

【参考方案3】:

如果能阐明代码的意图,提取方法总是值得的。

对于非常长的方法尤其如此。虽然 cmets 很好,但它们并没有描述(至少不是以非常可靠的方式)它解释的过程在哪里结束以及下一个过程从哪里开始。有时常见的抽象只会在您提取方法后变得更加明显。

如果您从事自动化单元测试(不一定是 TDD),那么对较小的方法块进行单元测试也会容易得多 - 尽管您可能必须为此公开您的方法,具体取决于测试你使用的框架。

关键是,使用较小的方法不会出错,尤其是当它们具有描述性名称时。

【讨论】:

我非常同意。我一直以这种方式重构,它为代码增加可读性的程度是巨大的。抽象是非常有用的,甚至可以达到短(例如 1 行)方法的级别。以这种方式进行重构可以非常容易地查看原始方法的流程以及更改主要方法或其任何组件的设计或实现。 我一直在思考这个答案。我认为您应该更改“使用较小的方法不会出错,尤其是在它们具有描述性名称的情况下。”到“如果方法没有描述性名称,你只会出错” 因为最后一行而被否决。我见过很多代码,其中含义或结构隐藏在一长串选择不当的抽象和私有方法名称中。我还认为,如果您突出显示“如果它阐明了代码的意图”会有所帮助。我发现这很关键——通常,提取方法并不能实现这一点【参考方案4】:

对我来说,这取决于代码有多大,以及它与父方法的作用有多相关。如果代码很多(比如超过 5-10 行代码,或者超过父方法中代码总量的 50%),我会将其提取到私有方法中,以提高代码结构和可读性。否则,我会将其留在父方法中并带有描述性注释。

我认为如果代码中有太多非常小的方法,可维护性和可读性会降低。我争取一个良好的平衡。但每当我怀疑时;我将其提取为私有方法。

【讨论】:

【参考方案5】:

是的。

如上所述:它通常会阐明代码的意图。 即使现在只使用一次,以后也可以更方便地重用代码。

另外一点:对于简单的辅助方法,您可能希望将它们设为静态(这样它们就不会依赖或更改其实例的状态),然后您可以将它们公开以便更容易重用。

【讨论】:

【参考方案6】:

这样做有很大的好处。这完全是关于信息隐藏,并使意图非常明确。

在重构代码中,他们称之为组合方法,您可以将一个大方法分解为许多较小的方法。这有两个作用。

首先,它减少了您在处理父方法时需要担心的信息量。

其次,方法的名称应表明其意图,使代码更具可读性。

【讨论】:

它还使变量范围问题变得更加容易。与检查不到 12 行的方法相比,扫描 100 行代码以找出变量的使用位置是不小的浪费时间。

以上是关于如果不多次调用它们,您是不是应该将代码重构为私有方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果私有帮助方法可以是静态的,那么它们是不是应该是静态的

在 C++ 中调用私有方法

我可以将我的网站资源设为私有吗?

我应该测试私有方法还是仅测试公共方法? [关闭]

评估一个静态私有变量(Java),不应该是非法的吗? [复制]

了解重构