Возвратить перечисление вместо bool от функции для ясности?

Это подобно:

.NET: bool по сравнению с перечислением как параметр метода

но проблемы возвращая bool из функции в некоторых ситуациях.

например, Функция, которая возвращает bool:

    public bool Poll()
    {
        bool isFinished = false;

        // do something, then determine if finished or not.

        return isFinished;
    }

Используемый как это:

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

Не очевидный из контекста вызова, что 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.
        }

Но это чувствует себя подобно излишеству. Какие-либо идеи?

7
задан Community 23 May 2017 в 10:30
поделиться

5 ответов

Метод следует читать как глагол , а результат bool Poll ( ) вводит в заблуждение, и, вероятно, поэтому его неудобно использовать.

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

Когда я впервые прочитал ваш код, мне показалось, что там написано Пока (система) не опрашивает, сделайте что-нибудь ?

Но на самом деле там сказано ... Опрос, а если нет закончил опрос делаем что-нибудь, пока ждем.

Ваша версия enum, похоже, изменила семантику вызова, но в лучшую сторону, поэтому людям она нравится. Пока Poll () все еще выполняется, сделайте что-нибудь, пока мы ждем.

Побеждает наиболее читаемый код.

3
ответ дан 7 December 2019 в 05:18
поделиться

Прежде всего, код - это то, что люди должны читать, и в вашем случае версия enum более читабельна, чем версия bool.

Edit:

Другое преимущество версии enum в том, что вы можете легко добавить другие статусы, если вам нужно. Например, Error.

2
ответ дан 7 December 2019 в 05:18
поделиться

Если у вас более 2 состояний, используйте enum, иначе просто используйте bool.

Edit:

В вашем примере вы можете легко использовать оба варианта, если это необходимо.

public bool IsRunning  { get {return Poll() == Running; }}
public bool IsFinished { get {return Poll() == Finished; }}
1
ответ дан 7 December 2019 в 05:18
поделиться

Я следую соглашению .Net, согласно которому логические свойства имеют префикс «Is», а логические методы - префикс «Try» (или «Is», где это необходимо).

В вашем случае, я думаю, проблема в названии "опроса". Назовите метод, указав, что он делает или опрашивает. например TryDoSomething ()

2
ответ дан 7 December 2019 в 05:18
поделиться

Я читаю и перечитываю то, что вы пытаетесь сделать. Для меня Poll () должен означать именно то, что вы что-то опрашиваете. Затем я бы проверил статус, если он все еще работает.

Мой результирующий код будет выглядеть так.

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

Примечание. IsRunning - это средство получения / установки. Было бы понятнее?

0
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: