gpt4 book ai didi

java - Java 方法中的副作用

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:21:37 24 4
gpt4 key购买 nike

这可能是一个微不足道的问题,但我需要一些澄清......有一本叫做 Clean Code 的书说我们的方法应该很小,最好最多 5-10 行。为了实现这一点,我们需要将我们的方法拆分成更小的方法。例如,我们可能有如下所示的 someMethod() 。比方说,修改“Example”需要 5 行,我决定将它移到一个单独的方法中,在那里修改“Example”并将其返回给 someMethod()。通过这样做,someMethod() 变得更小且更易于阅读。这很好,但是有一个叫做“副作用”的东西,它说我们不应该将一个对象传递给另一个方法并在那里修改它。至少,有人告诉我这是个坏主意)但我在 Clean Code 中没有看到任何禁止我这样做的内容。

public Example someMethod() {

// ... different lines here

Example example = new Example();
example = doSomethingHere(example, param1, param2, ...);

// ... different lines here

return example;
}

private Example doSomethingHere(Example example, 'some additional params here') {

// ... modify example's fields here ...

return example;
}

那么,我是否允许以这种方式拆分方法,或者这样的副作用是被禁止的,相反,我应该处理一个相当长的方法,它肯定违反了 Clean Code 谈论短方法的规则?


已更新(子方法的更具体名称)

public Example someMethod() {

// ... different lines here

Example example = new Example();
example = setExampleFields(example, param1, param2, ...);

// ... different lines here

return example;
}

private Example setExampleFields(Example example, 'some additional params here') {

// ... modify example's fields here ...

return example;
}

最佳答案

正如 JB Nizet 评论的那样,如果它是唯一的效果,那么它实际上并不是副作用,因此任何“所有副作用都是不好的”的笼统声明在这里都不适用。

不过,主要问题仍然存在:这种(副作用)效果好吗?

先说原理,一般来说,副作用是危险的,原因有二:

  • 它们使并发变得更加困难
  • 他们模糊/隐藏信息

在您的示例中,有一些信息是隐藏的。您可以将其称为潜在 副作用,它可以通过一个问题暴露出来:“这个 doSomethingHere 方法是创建一个新对象还是修改我传入的对象?”答案很重要,如果是公共(public)方法则更是如此。通过阅读 doSomethingHere 方法很容易找到答案,特别是如果您保持方法“干净”,但信息仍然被隐藏/模糊。

在这种特定情况下,我会让 doSomethingHere 返回无效。这样人们就不可能认为您创建了一个新对象。这只是一种个人方法——我相信很多开发人员都说你应该返回你修改的对象。或者,您可以选择一个“好的”方法名称。 “modifyExampleInPlace”或“changeSomeFieldsInPlace”对于您的特定示例来说是非常安全的名称,imo。

关于java - Java 方法中的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45018663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com