这类似于:
.NET: bool vs enum as a method parameter
但是担心在某些情况下从函数返回bool。
e.g。 返回bool的函数:
public bool Poll()
{
bool isFinished = false;
// do something, then determine if finished or not.
return isFinished;
}
像这样使用:
while (!Poll())
{
// do stuff during wait.
}
从调用上下文来看,从Poll()返回的bool意味着什么并不明显。 如果“轮询”功能被重命名为“IsFinished()”,在某些方面可能更清楚,但该方法做了一些工作,并且(IMO)不会真正反映该功能实际上做了什么。像“IsFinished”这样的名字似乎也更适合于属性。另一种选择可能是将其重命名为:“PollAndReturnIsFinished”,但这也感觉不对。
所以一个选项可能是返回一个枚举。例如:
public enum Status
{
Running,
Finished
}
public Status Poll()
{
Status status = Status.Running;
// do something, then determine if finished or not.
return status;
}
这样称呼:
while (Poll() == Status.Running)
{
// do stuff during wait.
}
但这感觉有点矫枉过正。 有什么想法吗?
答案 0 :(得分:3)
方法应该像动词一样阅读,bool Poll()
方法的结果会产生误导,这可能就是为什么使用它感觉很尴尬。
// you wrote.
while( !Poll() )
{
// still waiting .. do something.
}
当我第一次阅读您的代码时,我认为它是虽然(系统)没有轮询,做某事?
但它确实说...... 民意调查,如果没有完成民意调查,我们会等待。
你的枚举版似乎改变了调用的语义,但为了更好,这就是人们喜欢它的原因。 当Poll()仍然在运行时,在我们等待的时候做点什么。
最易读的代码获胜。
答案 1 :(得分:2)
首先,代码供人们阅读,在您的情况下,枚举版本比bool版本更具可读性。
编辑:
枚举版的其他优点是,如果需要,您可以轻松添加其他状态。例如Error
。
答案 2 :(得分:2)
我遵循.Net约定,布尔属性以“Is”为前缀,布尔方法以“Try”为前缀(或者在适当的位置加上“Is”)。
在您的情况下,我认为问题出在“民意调查”名称中。命名方法,说明它正在做什么或轮询。例如的 TryDoSomething()强>
答案 3 :(得分:1)
如果您有两个以上的州,请使用enum
,否则只需使用bool
。
编辑:
作为您的示例,如果需要,您可以轻松地使用两者。
public bool IsRunning { get {return Poll() == Running; }}
public bool IsFinished { get {return Poll() == Finished; }}
答案 4 :(得分:0)
我阅读并重新阅读您要做的事情。对我来说,Poll()应该意味着你正在为某些事情进行投票。然后我会检查状态是否仍在运行。
我的结果代码看起来像这样。
while (myObject.Poll() && myObject.IsRunning)
{
// myObject successfully poll it ..
// and is successful
// do more things here...
}
注意:IsRunning是一个getter / setter。这会更清楚吗?