C#

C#でのenum使いどころと区分ValueObjectの書き方

C#でのenumの使い方を考えていきましょう。

Enumの使い方

enumは数値で区分を表すときに使用されます。

例えば「アナログ単位」という区分があり

温度は「0」,電流は「1」,電圧は「2」という仕様が決まっている場合
C#のコードでは次のように書くことができます。

 

 

このように書くと
AnalogUnitに続けて「.」ドットを打ち込むと
TemperatureとElectricCurrentとVoltageがインテリセンスに表示されるため
コーディングしやすくなる。

if文なので使用する場合は次のような感じで使用します。

昔はenumがなかったので
区分の固定値は次のように記述していました。

しかし,この書き方だと,どこまでが一つのグループ(区分)なのかが
明示的に示されていないため,enumを使用したほうがよいと思います。

ValueObject

しかし,enumで表せるのは数値だけなので
AnalogUnitのTemperatureは「0」という事だけしか
コードで表現できません。
Temperatureのときの「単位は℃」「小数点以下表示桁数は2桁」などを
表現しようとするとenumではできません。

データベースの中に数値で格納されている区分の多くは
このように区分「0」のときどのように動作するか?
という仕様が詰まっています。

C#ではそのような仕様をコードで表現することが
より良いコーディングであると思います。

私はデータベース上の区分を
C#で取り込むときは次のようにクラスを記述し,ValueObjectと呼んでいます。

序盤の3つの読み取り専用の変数が,3つの区分を表しています。

AnalogUnitクラスの中に,3つのpublicでstaticなAnalogUnitクラスを宣言し
それぞれに対応区分でインスタンスを生成しています。

readonlyのため,インスタンス生成後は変更できないので
完全コンストラクターパターンになります。

そしてこのクラスは区分の値保持用に
Value変数のみが存在しています。

AnalogUnitクラスを生成するときに
区分を引数としてあたえれば,
あとは二度と変更できないクラスとなり,
DisplayValueやUnitNameを取得することで
区分ごとのふるまいを一元管理するクラスを
作ることができます。

データベースから取得する区分は
いろいろな仕様を持つことが多いので
それをいろいろなクラスで実装すると
同じようなコードが散らばり始めます。

こういったValueObjectクラスを作ることで
コードが一か所に集まります。

ですからアプリケーション全体で
統一する必要のある区分は
enumではなくValueObjectで表現しています。

enumの使いどころ

それではenumの使いどころはないのか?
ってことになりますけど,
データベースとかが絡まない
アプリの中で完結するような使い方では
効果があると思います。

このように,本当に区分としてしか
機能がないようなものはenumを使うと効果的です。
要するに,ビジネスロジックのない区分のときって感じです。

今回は少々長くなりましたが,enumと
ValueObjectでの区分の表現の仕方に関する解説は以上となります。
最後までお読みいただきありがとうございました。

トップページへ戻る

自動リファクタリング

C#を正しい3層構造で造れてますか?

非売品コースを受け取る