はじめに
Unity公式がプログラミングパターンのデモを説明書と共に全12種公開していたので、1つずつ読み取っていきたいと思います!
英語の説明書でしたので間違った解釈をしているかもしれませんが、ご了承下さい!
最初の5種は、SOLID原則に沿ったデモとなっており、コードのみが公開されています。
残り7種は、Scene付きのデモが入っていますので、ZIPファイルをダウンロードして試してみてください。
今回は、2つ目のOpenClosed(オープン・クローズドの原則)についてです。
環境
OS : Windows10
Unity バージョン : 2021.3.8f1
OpenClosed(オープン・クローズドの原則)とは
OpenClosed(オープン・クローズドの原則)は、クラスは拡張に対してはオープンでなければならないが、変更に対してはクローズでなければならないというものです。
要するに、機能拡張はいくらでもできるようにして、機能そのものの修正はできないようにするということです。
デモではよく目にする面積を求めるコードが掲載されていました。
悪いコード例
四角形と円の面積を求めるコードです。
public class AreaCalculator
{
// 四角形の面積
public float GetRectangleArea(Rectangle rectangle)
{
return rectangle.width * rectangle.height;
}
// 円の面積
public float GetCircleArea(Circle circle)
{
return circle.radius * circle.radius * Mathf.PI;
}
}
public class Rectangle
{
public float width;
public float height;
}
public class Circle
{
public float radius;
}
これで十分に機能しますが、台形や平行四辺形の面積を求めたい時、更に新しいメソッドを作成する必要があります。
オープン・クローズドの原則を守るには、Shapeという基底クラスを作成し、四角形や円のクラスが基底クラスを継承するようにします。
良いコード例
public abstract class Shape
{
public abstract float CalculateArea();
}
public class Rectangle : Shape
{
public float Width { get; set; }
public float Height { get; set; }
public override float CalculateArea()
{
return Width * Height;
}
}
public class Circle : Shape
{
public float Radius { get; set; }
public override float CalculateArea()
{
return Radius * Radius * Mathf.PI;
}
}
public class AreaCalculator
{
public float GetArea(Shape shape)
{
return shape.CalculateArea();
}
}
これでAreaCalculatorクラスは、任意の形状の面積を取得できるようになりました。
変更の際はAreaCalculatorクラスに手を加える必要はなく、台形や平行四辺形の面積を求める機能拡張もShapeを継承するだけでよくなります。
つまり、面積を求める機能に修正を加えることなく、それぞれの形ごとにバグを見つけ出すことができます。
オープン・クローズドの原則を守ると長期的に新しいコードを追加することがより簡単になります。
参考