Элегантный способ представить состояние проекта в enum - PullRequest
2 голосов
/ 20 марта 2012

Я использую перечисление для описания различных состояний проекта:

[Flags]
public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened =1 << 2,
   ToMigrate = 1<<3 
}

Теперь, если я хочу перейти из одного состояния в другое, я должен проверить, возможно ли это. Для этого у меня была идея расширить мой список следующим образом:

[Flags]
public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened = 1 << 2,
   ToMigrate = 1<<3,
   CanOpen = Opened | ToMigrate,
   CanClose = Opened,
   CanDelete = Closed | ToMigrate 
}

С помощью этого решения я могу проверить изменение состояния:

if ((actualState & CanOpen) == CanOpen)
   {
      // open is allowed.
   }

Моя единственная проблема сейчас, например, в том, что CanClose и Opened имеют одинаковое базовое значение, а CanClose == Opened имеет значение true.

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

спасибо заранее!

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Используйте разные значения, не путайте их вместе, например

public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened = 1 << 2,
   ToMigrate = 1<<3      
}

И после проверки, можно ли закрыть проект в функции

public bool CanClose(ProjectStatus status)
{
    return (status & Opened) == Opened;
}

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

Другими словами, уберите логику решения из перечисления в функциях. В enum оставьте только raw data.

1 голос
/ 20 марта 2012

Не отвечая на ваш вопрос напрямую, я не думаю, что CanOpen CanClose должно быть частью ProjectStatus, это свойства Project.

[Flags]
public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened =1 << 2,
   ToMigrate = 1<<3 
}

public class Project
{
   //other properties

   public ProjectStatus Status { get; set; }

   public bool CanOpen
   {
       get 
       { 
             return this.Status == ProjectStatus.Opened 
                 || this.Status == ProjectStatus.StatusToMigrate;  
       } 
   }
}
...