代码之家  ›  专栏  ›  技术社区  ›  Moe Sisko

为清楚起见,是否从函数中返回enum而不是bool?

  •  7
  • Moe Sisko  · 技术社区  · 16 年前

    .NET: bool vs enum as a method parameter

    例如

        public bool Poll()
        {
            bool isFinished = false;
    
            // do something, then determine if finished or not.
    
            return isFinished;
        }
    

    用法如下:

            while (!Poll())
            {
                // do stuff during wait.
            }
    

    从调用上下文看,Poll()返回的bool的含义并不明显。 如果将“Poll”函数重命名为“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 回复  |  直到 9 年前
        1
  •  3
  •   Robert Paulson    16 年前

    方法应该像 动词 ,以及 bool Poll() 方法具有误导性,这可能就是为什么使用它会感到尴尬的原因。

    // you wrote.
    while( !Poll() )
    {
        // still waiting .. do something.
    }
    

    当我第一次读到你的代码时,我以为它说 当(系统)不轮询时,做些什么 ?

    但它真的说。。。 投票,如果没有完成投票做一些事情,而我们等待。

    您的enum版本似乎已经改变了调用的语义,但效果更好,这就是人们喜欢它的原因。

    可读性最强的代码获胜。

        2
  •  2
  •   bniwredyc    16 年前

    首先,代码是供人们阅读的,在您的示例中,enum版本比bool版本更具可读性。

    编辑:

    Error 例如。

        3
  •  2
  •   adrianm    16 年前

    我遵循.Net约定,布尔属性的前缀是“Is”,布尔方法的前缀是“Try”(或“Is”(如果合适)。

    在你的情况下,我认为问题出在“民意测验”的名字上。命名方法,说明它正在执行的操作或轮询的目的。例如

        4
  •  1
  •   leppie    16 年前

    enum bool .

    编辑:

    public bool IsRunning  { get {return Poll() == Running; }}
    public bool IsFinished { get {return Poll() == Finished; }}
    
        5
  •  0
  •   Syd    16 年前

    我一遍又一遍地读你想做的事。对我来说,Poll()应该确切地表示您正在轮询某些内容。然后我会检查状态,如果它仍然在运行。

    我的结果代码如下所示。

    while (myObject.Poll() && myObject.IsRunning)
    {
       // myObject successfully poll it .. 
       // and is successful
       // do more things here... 
    }
    

    注意:IsRunning是getter/setter。这会更清楚吗?