【问题标题】:how big should function length be (lines of code in a function)? [duplicate]函数长度应该有多大(函数中的代码行)? [复制]
【发布时间】:2010-06-04 18:40:49
【问题描述】:

可能重复:
How many lines of code should a function/procedure/method have?

我想知道函数应该有多少行代码?多少行太多了。

我不久前读过这篇文章,大约有 10 或 20 行,但这是因为屏幕只能容纳这么多行。现在随着屏幕尺寸变大,这将不成立。

让我们假设函数的任何部分都没有在其他任何地方使用,即忽略 DRY 原则。

我想听听其他人对此有何看法。

谢谢。

注意When is a function too long?的重复,我发帖时找不到。

【问题讨论】:

  • 在回答这个问题之前,我们需要定义“代码行”。
  • 二十七岁半。
  • 会的,谢谢你毫无意义的评论。希望你感觉好多了。

标签: function lines-of-code


【解决方案1】:

线条无关紧要,但复杂性才是。

一个函数应该完成一项任务,并且应该很明显。您只需片刻即可准确了解该函数的作用方式和作用。

【讨论】:

  • 根据我的经验,“控制器”或“主循环”怎么样?它们往往比单一用途的功能更复杂一些 - 当然,也许我做错了......我同意总体而言,您的评论,但认为总是有例外
  • @blissapp:嗯,总有明显的例外;)
【解决方案2】:

此类问题在Code Complete 中得到了很好的解答。 Steve McConnel 写了一整页来回答这个问题。他的结论:

数十年的证据表明,例行公事 这样的长度(> 100 行)是没有 比更短更容易出错 例行公事。 让诸如 套路的凝聚力,决策的数量 点数,需要的 cmets 数 解释例程和其他 复杂性相关的考虑 规定例程的长度 而不是强加一个长度 限制本身。也就是说,如果你 想写例程比 大约200行,小心。

【讨论】:

    【解决方案3】:

    它应该有尽可能多的。

    我认为将函数行数限制为屏幕大小没有任何意义(公平地说,我直到屏幕可以容纳超过 10-20 行之后才开始编程 - 也许这在一些环境)。只需编写有意义的函数即可。当它变得如此之大以至于代码片段开始重复时,将这些片段重构为其他函数/类/组件。

    【讨论】:

      【解决方案4】:

      这是一个相当随意的经验法则。有些喜欢 20 行,有些喜欢不滚动规则。最后,只要确保它可读且易于理解即可。阅读您的 SOLID principles 并确保该方法只有 1 个职责,等等。

      【讨论】:

        【解决方案5】:

        尽可能长,尽可能短。

        我将 5-10 行作为经验法则,但如果有一些逻辑不能(重新)轻松分解为多个函数,我会在必要时写更长的时间。另一方面,我经常有只有一两行长的函数。

        如果您不立即理解代码的一部分是做什么的,请为它编写一个新函数。

        【讨论】:

          【解决方案6】:

          我认为它有多少行并不重要......只要它是有效的。

          任何可以在代码库中任何地方重用的代码都应该移动到同一类或共享类中的另一个函数/方法并调用。

          【讨论】:

          • 大小确实很重要——可读性非常重要,当面对一堵文字墙时,我们程序员(都是高效的)对函数感到震惊。我知道,我们都喜欢假装我们不这样做,但我们确实这样做。
          • 您无需创建更多函数即可使代码具有可读性。
          【解决方案7】:

          我以前也听说过屏幕尺寸指标,但显然不是硬限制或随显示器尺寸缩放。它只是为了传达 DRY 的原则,并且保持函数尽可能小是编写可扩展的代码的最佳方法之一(在项目大小中)。

          【讨论】:

          • 让我们假设函数的任何部分都没有在其他任何地方使用,即忽略 DRY 原则。更改了关于 DRY 原则的问题。
          • 部分功能今天其他地方可能用不上,但明天或者明年呢?当您回到代码并需要使用该功能时,它是否可以在自己的功能中随时使用,或者您是否必须将其从现有功能中撬出?当你达到这一点时,重新分解旧功能可能需要太多工作或太不稳定,所以你只需复制你想要的部分。这是违反 DRY 的主要方式。你很少会后悔做一个额外的函数或类,但你经常会后悔没有这样做。
          【解决方案8】:

          Linux 内核编码风格文档说:

          函数应该简短而甜美, 只做一件事。他们应该 适合一两屏文本 (ISO/ANSI 屏幕尺寸为 80x24,如 我们都知道),做一件事,做 很好。

          现在,我意识到这是在内核代码的上下文中,但我认为它提出的一些观点:函数长度通常是有效的。查找副本here。函数部分是第 4 章。

          总而言之,函数长度不应该受到一些人为规则的限制;如果有意义就将内容排除在外,因为它使内容更易于阅读,但是关于 1-2 个屏幕的规则并不是一成不变的。

          【讨论】:

            【解决方案9】:

            这只是一个OO视角的观点:

            我更喜欢将我的方法保留在逻辑工作单元中,而不真正关心诸如 LoC 之类的指标。这也使得正确命名您的方法变得非常容易,并防止它们变得臃肿。

            一个非常微不足道的函数示例不是在循环中内联计算斐波那契数列的函数,而是添加一个由 fibonacci() 函数调用的 successor(int a,int b) 函数。

            OO 方式中更复杂的示例是执行 GET 请求的 http 客户端。我会把它分解成这样的:

            Connection getConnection(String host, int port)
            Request createRequest(String[] params)
            void sendRequest(Request r)
            String getResponse(Connection c,Request r)
            

            【讨论】:

              【解决方案10】:

              函数应该足够小以完成它们的工作,但不能更小。

              【讨论】:

                猜你喜欢
                • 2010-10-11
                • 2022-12-07
                • 2012-10-22
                • 1970-01-01
                • 2012-02-01
                • 1970-01-01
                • 2023-03-04
                • 2015-04-10
                • 1970-01-01
                相关资源
                最近更新 更多