У меня есть модель, которая должна находиться в одном из следующих взаимоисключающих состояний: Новая, Выполняется или Закрыта.
Приложение позволяет пользователю сохранять записи, а затем извлекать их, предоставляя список совпадающих состояний.
Я унаследовал базу данных SQL, в которой состояние хранится как целое число, представляющее побитовые флаги. Я должен вызвать процедуру, которая выполняет сопоставление с побитовой операцией:
CREATE PROCEDURE SearchByState
@MatchingStates int
AS
BEGIN
SELECT Id, State
FROM Records
WHERE @MatchingStates & State > 0
END;
GO
Меня это все устраивает.
Теперь, в реализации C#, совершенно ясно, что я должен определить флаги для представления комбинации совпадающих состояний в запросе:
[Flags]
public enum States
{
None = 0x0,
New= 0x1,
InProgress = 0x2,
Closed = 0x4,
All = New | InProgress | Closed
}
Проблема в том, что модель записи должна иметь свойство, представляющее одно состояние.
Вопрос в том, каким должен быть тип свойства State модели этой записи:
1) Просто используйте флаги перечисления:
public class Record
{
public int Id { get; set; }
// Must ensure the value is equal to one of
// States.New, States.InProgress, or States.Closed
public States State { get; set; }
}
2) Определите новый тип перечисления для взаимоисключающего состояния:
public enum State
{
New,
InProgress,
Closed
}
public class Record
{
public int Id { get; set; }
// Must be stored as the value of one of
// States.New, States.InProgress, or States.Closed
public State State { get; set; }
}
Недостаток № 1 носит семантический характер: перечисление States представляет собой комбинацию состояний, а не одно состояние.
Недостаток № 2 практический: при сохранении состояния я должен определить базовое значение, которое нужно сохранить.
Можете ли вы придумать способ представить все это, сведя к минимуму эти недостатки?