Как я могу указать, какое значение может иметь перечисление на основе текущего значения? - PullRequest
0 голосов
/ 03 июня 2019

Я ищу способ указать, что давайте назовем его Decision Tree или Flow.

У меня есть начальное значение 1 или REQUESTED, и это перечисление может иметь несколько следующих значений, таких как 2 или IN_PROGRESS или 3 или DECLINED.

И теперь только из значения 2 должно быть возможно перейти к более высокому значению, например 4 или FINISHED.

Как наиболее практично определить возможные пути, которые может иметь процесс или поток?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

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

Во-первых, вот enum и простой класс, который переключается из одного состояния в другое, если это изменение разрешено. (Я не охватил все штаты.)

enum RequestState
{
    Requested,
    InProgress,
    Declined,
    Finished
}

public class Request
{
    private RequestState _state = RequestState.Requested;

    public void BeginWork()
    {
        if (_state == RequestState.Declined || _state == RequestState.Finished)
            throw new InvalidOperationException("You can only begin work on a new request.");
        _state = RequestState.InProgress;
    }

    public void Decline()
    {
        if (_state == RequestState.Finished)
            throw new InvalidOperationException("Too late - it's finished!");
        _state = RequestState.Declined;
    }

    // etc.
}

Если мы основываем его на числовом значении _state и определяем, что число может только увеличиваться, некоторые вещи могут пойти не так:

  • Кто-то может изменить порядок перечислений или добавить новый, не зная, что числовое значение или позиция имеет логическое значение. Это простая ошибка, потому что это значение обычно не имеет значения.
  • Возможно, вам потребуется реализовать логику, которая не так проста. Возможно, вам понадобится состояние, которому могут предшествовать некоторые значения перед ним, но не все из них.
  • Вы можете понять, что есть веская причина для того, чтобы идти в обратном направлении. Что если запрос будет отклонен, и в будущем вы определите, что хотите снова открыть запросы, фактически отправив их обратно на Requested?

Если способ реализации этого начинается немного странно, эти изменения могут усложнить его изменение и следование. Но если вы просто четко опишите, какие изменения возможны при любом состоянии, тогда его будет легко прочитать и изменить.

0 голосов
/ 03 июня 2019

Вы можете сделать что-нибудь, чтобы использовать перечисления в основном как целые числа:

private static Status NextState(Status status)
{
    var intOfStatus = ((int)status) + 1;
    return (Status)intOfStatus;
}

И некоторые примеры логики, основанные на этом подходе:

public enum Status
{
    NotStarted = 0,
    Started = 1,
    InProgress = 2,
    Declined = 3
}
public static void Main()
{
    var curStatus = Status.NotStarted;

    Console.WriteLine(curStatus.ToString()); //writes 'NotStarted'

    if ((int)curStatus++ == (int)Status.Started)
    {
        curStatus = Status.Started; 
    }

    Console.WriteLine(NextState(curStatus)); //writes 'InProgress'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...