Java方法中的副作用
这可能是一个微不足道的问题,但我需要澄清……
有一本名为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返回void.这样,人们就没有可能认为你已经创造了一个新的对象.这只是一种个人方法 – 我相信很多开发人员都说你应该返回你修改的对象.或者,您可以选择一个“好的”方法名称. “modifyExampleInPlace”或“changeSomeFieldsInPlace”是您的特定示例imo的非常安全的名称. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |