为了清晰起见,从功能中返回enum而不是bool?

时间:2010-06-10 04:29:06

标签: c# coding-style

这类似于:

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

但这感觉有点矫枉过正。 有什么想法吗?

5 个答案:

答案 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。这会更清楚吗?