加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java方法中的副作用

发布时间:2020-12-15 04:39:29 所属栏目:Java 来源:网络整理
导读:这可能是一个微不足道的问题,但我需要澄清…… 有一本名为Clean Code的书说我们的方法应该很小,最好长达5-10行.为了实现这一目标,我们需要将方法拆分为较小的方法. 例如,我们可能有someMethod()如下所示.假设,’Example’的修改需要5行,我决定将其移动到一个
这可能是一个微不足道的问题,但我需要澄清……
有一本名为Clean Code的书说我们的方法应该很小,最好长达5-10行.为了实现这一目标,我们需要将方法拆分为较小的方法.
例如,我们可能有someMethod()如下所示.假设,’Example’的修改需要5行,我决定将其移动到一个单独的方法中,在那里修改’Example’并将其返回到someMethod().通过这样做,someMethod()变得更小,更容易阅读.这很好,但有一个叫做“副作用”的东西,它说我们不应该把对象传递给另一个方法并在那里修改它.至少,我被告知这是一个坏主意)但我没有看到任何禁止我在清洁代码中这样做的事情.

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;
}

那么,我是允许以这种方式分割方法还是禁止这样的副作用,而是我应该处理一个相当长的方法,这肯定会打破清洁代码关于短方法的规则?

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

public Example someMethod() {

    // ... different lines here

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

    // ... different lines here

    return example;
}

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

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

    return example;
}

解决方法

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

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

首先谈论原则,副作用通常是危险的,原因有两个:

>他们使并发更加困难
>他们模糊/隐藏信息

在您的示例中,有一些隐藏的信息.您可以将此称为潜在的副作用,并且可以通过以下问题公开:“这个doSomethingHere方法是创建新对象还是修改我传入的对象?”
答案很重要,如果它是一种公共方法,那就更是如此.
通过阅读doSomethingHere方法找到答案应该是微不足道的,特别是如果你保持你的方法’干净’,但信息仍然隐藏/模糊.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读