次の相互に排他的な状態のいずれかでなければならないモデルがあります: New、In Progress、またはClosed。
アプリケーションを使用すると、ユーザーはレコードを保存してから、一致する状態のリストを提供することでレコードを取得できます。
状態がビット単位のフラグを表す整数として格納される 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 の欠点は実用的です。状態を格納するとき、格納する基になる値を決定する必要があります。
これらの欠点を最小限に抑えながら、これらすべてを表現する方法を考えられますか?