概要
オブジェクト指向プログラミングにおいてクラスはオブジェクトを作成するための設計図とよく言われます。
良いクラスは良い設計図ということになりますが、良いクラスはどんなクラスでしょうか?
本記事では例題からクラス図とサンプルコードを作成して、より実践的に良いクラスに関する考察をしていきます。
前回はクラスに責務を与えるを紹介しました。
今回は「クラスかオブジェクトかそれが問題だ」について考えてみます。
クラスを抽出する時はクラスなのかオブジェクトなのかを判断することはとても重要です。
オブジェクトはクラスをnewした実体です。
本来オブジェクトで良いものまでクラスとして定義すると関連が複雑になってしまったり、
無駄なコードを沢山書くことになります。
例題
現在、社内には部と課があります。部には複数の課があります。
社内の部と課を階層構造で管理するためにクラスを抽出してください。
とりあえずクラスとして抽出する
例題から部と課をそれぞれクラスとして抽出して関連を付けます。
概念クラス図
概念クラス図のため、属性やメソッドは省略しています。
何をクラスとして定義していて、関連(矢印)や多重度に注目してください。
表現はできていますが、係が追加になった場合...
表現はできていますが、グループが追加になった場合...
扱う階層が増える度にクラスを追加しなければなりません。
また部と課の間に階層構造を追加したい場合はクラスの関連を見直す必要があります。
とりあえずクラスとして抽出すると追加や変更があった時の影響度が大きいです。
クラスとオブジェクトを見極める
部と課をクラスとして抽出すると、あまり良くない結果になることがわかりました。
このような場合、部や課をもう少し汎化したものをクラスにすると上手くいきます。
ここでは部と課をまとめたクラスを「組織階層」と定義します。
概念クラス図
概念クラス図は以下になります。
再帰的なデータ構造にするのがポイントです。
オブジェクト図
具体的なオブジェクトの関連をオブジェクト図で見てみましょう。
オブジェクト図でも階層構造が表現できていることが確認できます。
オブジェクト図を使用することはクラス図が正しく表現できているかを確認するために有効です。
実装クラス図
概念クラスをよりサンプルコードに近いクラス図で記述します。
ChildListとしてOrganizationHierarchyをリスト(配列)で保持できるようにします。
サンプルコード(C#)
実装クラス図からサンプルコードを作成します。
今回のサンプルコードではクラスの使用例は省略します。
public class OrganizationHierarchy
{
public OrganizationHierarchy()
{
ChildList = new List<OrganizationHierarchy>();
}
public string Code { get; set; }
public string Name { get; set; }
public string ParentCode { get; set; }
public List<OrganizationHierarchy> ClildList { get; set; }
public bool IsRoot()
{
return string.IsNullOrEmpty(ParentCode);
}
}
大きな組織になると数千件のデータになることもあり、数千件のクラスを作成するのは現実的ではありません。
クラスとオブジェクトを見極めることは実装をシンプルにし、ソースコードの削減にもなります。
まとめ
今回は「クラスかオブジェクトかそれが問題だ」について考えてみました。
同じようなクラス定義を何度も記述しなければならない、クラスのオブジェクトが1つしかない場合は
オブジェクトで良いものをクラス定義しているかもしれません。
クラスを抽出する時はクラスかオブジェクトかをよく考えてみましょう。
それがオブジェクトならわざわざクラス定義する必要はない。
最後まで読んでいただきありがとうございます。