我们什么时候应该创建一个新方法?

Joh*_*ker 29 oop design-patterns

我试图找出是否就我们何时应该在代码中创建新方法达成共识.例如,如果我们要再次使用代码,那么我们应该只创建一个新的方法/函数(因此我们显然会减少使用的行),或者这样做是为了避免代码混乱.我已经编程很长一段时间但我真的只是进入并以相当随机的方式决定.

是否有任何设计模式或书籍可以解决这个问题?一个相关的问题是,我们是否应该只使用getter和setter方法在对象中设置参数.这会显然创建更多的代码,但会使事情更易于管理?对此有何见解?

Gra*_*ton 32

我认为没有针对此的具体设计指南.但是一些设计原则确实讨论了方法创建.

DRY(不要重复自己)是方法创建的指导原则.您可以在一个方法中对类似的逻辑进行分组,这样您就不会在代码中复制它们,从而使维护成为一场噩梦.

单一责任原则是另一个原则.它说你的班级或方法应该只做件事.这是为了使方法尺寸变小.

  • 此外,如果一个方法变得非常冗长和复杂,它有助于在较小的函数中将其分解,以使其更易于管理,即使这些部分不会被重用. (7认同)
  • SRP是一个很好的原则,但要确保将其视为一个指导原则,很多时候,即使它违反SRP,在有意义的类中对方法进行分组也是有意义的.然而,DRY是一种更接近编程法则的惯例.代码重复从根本上说是阴险的,应尽可能避免. (7认同)
  • *不会被重复使用.然而 (3认同)
  • 另一方面是方法具有名称,名称可以是非常具有描述性的,并且用于记录代码.因此,将代码块重构为具有描述性名称的方法可以是朝向更多自我记录代码迈出的一步.我已经多次使用并看到它用于此特定目的,并且发现它是寻求可读和可维护代码的非常有用的工具. (3认同)

Ita*_*vka 24

我认为编程是一门艺术.因此我把方法时,感觉对分裂他们,或者写一个新的.

也就是说,有一些拇指规则(不会否定我的直觉).

  1. 如果需要滚动屏幕以阅读一种方法,则需要将其拆分
  2. 如果你有似曾相识(你写的代码似乎很熟悉),你可能会重复自己,这意味着你应该使用现有的函数/方法,而不是写一个新函数/方法.

  3. 不超过两个结构深

    for(...)for(...)for(...)BAD

  4. 连续不超过一个循环(一个接一个).

  5. 如果你需要返回多于一种类型的数据(不是null/false版本),那么你需要拆分一些东西.
  6. 如果您在阅读方法时感到困惑 - 将其拆分
  7. 方法/功能应该负责一项任务.
  8. 最明显的 - 写新功能时:-)

  • 很好,这是一个很好的具体指导清单,立即让我想到了我的一些信息,特别是"如果你需要返回多种类型的数据"之一. (2认同)

lor*_*zog 14

一个有趣的观点,虽然与面向对象编程无关,但是在linux的编码风格指南中提出:

第4章:功能

功能应该简短而甜蜜,只做一件事.它们应该适合一两个屏幕文本(ISO/ANSI屏幕大小为80x24,我们都知道),做一件事并做得很好.

函数的最大长度与该函数的复杂度和缩进级别成反比.所以,如果你有一个概念上简单的函数,它只是一个很长(但很简单)的case语句,你需要为很多不同的情况做很多小事,那么拥有更长的函数是可以的.

但是,如果你有一个复杂的功能,并且你怀疑一个不太优秀的一年级高中生可能甚至不了解这个功能的全部内容,那么你应该更加严格地遵守最大限度.使用具有描述性名称的辅助函数(如果您认为它对性能至关重要,您可以要求编译器对它们进行内联,并且它可能会比您更好地完成它).

函数的另一个度量是局部变量的数量.他们不应该超过5-10,否则你做错了什么.重新考虑功能,并将其拆分成更小的部分.人类的大脑通常可以轻松地跟踪大约7种不同的东西,更多的东西,它会混淆.你知道你很聪明,但也许你想了解你在2周后所做的事情.


Gor*_*don 8

如果你的方法很长,那么将它们重新分解成较小的块是有意义的,即使这些块在其他任何地方都没有使用过.这将提高可维护性和可测试性.此外,通过这种方法,您可以允许其他开发人员更轻松地扩展您的代码,以防他们想要更改方法的某些职责,例如通过重载它.

至于getter和setter,它在某种程度上取决于你使用的语言.在某些语言中,这可能非常冗长.就个人而言,我只为公共财产提供吸气剂和制定者和/或如果更改财产涉及的逻辑不仅仅是设置/获取财产.