2017-01-09 65 views
0

我有以下方法:枚举或布尔?

public void publish(Object source, long id, boolean status) { 
} 

当我调用该方法从某些类,它看起来是这样的:

element.publish(this, property.getId(), true) 

element.publish(this, property.getId(), false) 

谁看的代码获得了”不知道真假的含义,直到他们看到这个方法。我正在考虑使用枚举而不是布尔值。

您认为什么是正确和干净的方式?

+0

我没有完整的上下文,但为什么不将“status”设置为对象的一个​​字段? 'id'也一样!如果用户可以简单地做:'element.publish(this)'而不用担心实现细节,那将会是一个更好的“用户体验”。此外,“地位”并不多说。尝试更加明确的参数名称,例如考虑使用:'publishStatus'或'enabled'而不是'status' – alfasin

+1

对于上下文(并且可能会更好地解决您的问题):http://softwareengineering.stackexchange。 com/q/147977/54997 – Makoto

+2

这是什么'status'参数用于?这是一个不太具名的名称。 –

回答

0

在这里使用枚举看起来是一个很好的代码清晰思路。鉴于参数名称status不解释真假值之间的差值(不像,说,isValid),枚举,如:

public enum PublishStatus { 
    OK, 
    LOG, 
    ERROR 
    // ... 
} 

会去很长的路要走的可读性。

1

好吧......在方法签名的参数上使用布尔值几乎不是一个好习惯。替代品:

1-创建一个枚举并将其作为参数传递。

2-根据您收到的参数,您可以使用此参数创建一个类。

3-重载方法,取决于哪一个会做不同。

此外,具有描述性名称有帮助。

+0

这是一个相当广泛的声明!我可以多次想到参数有两个选项可以直观地表达真/假。有些情况甚至是非常明显的布尔值,你甚至可以猜测他们的行为,甚至没有看到参数名称。 'rmdir(String,boolean)'是一个很容易想到的例子。我大概可以猜测每个参数是什么,仅仅通过类型。如果你给了我'rmdir(字符串路径,布尔递归)'的更完整的签名''它肯定会很清楚。 – yshavit

+0

你也可以在变量上给出描述性的名字,例如:'public static final boolean STATUS_ON = true;'use:'element.publish(this,property.getId(),STATUS_ON)',但那不是重点...众所周知,作为参数的布尔值可能是一种代码味道,但也有一些需要标记的情况。顺便说一句,如果你看到:'rmdir(path,true)'并且你不知道签名,你会知道'true'是什么意思吗?这是一个简单的例子,但对于线数很多的代码,可读性可能(并且将会)受到影响,您只是为了查看签名而浪费时间。 –

+1

另请参见:https://martinfowler.com/bliki/FlagArgument.html,http://softwareengineering.stackexchange.com/q/147977/54997和本书的第41页:https://www.amazon.com/清洁代码手册,软件工匠/ DP/0132350882 –