1

次のコードが間違っていると感じたので、正しい道をたどっているかどうか知りたいのですが。申し訳ありませんが、この質問に適切な名前を付ける方法がわかりませんでした。

DBからデータをロードするために使用される特定のShapeEntityクラスがあります。Shapeには他にも具体的なクラスがあり(将来的には多く持つことができます)、LSPを使用してこれらの形状を描画したいので、IShape抽象化を使用します。ShapeEntityによって提供されるDB情報を使用して、具体的な形状オブジェクトをインスタンス化します。

したがって、私の懸念はMain()関数内にあり、単純なif-elseを使用してこれらのシェイプを作成します。if-elseブロックを使用して「不明な」オブジェクトを作成するこの正しいアプローチはありますか?たぶん、ある種のShapeServiceに対してShapeオブジェクトの作成を実行できますか?どうすれば他の方法で解決できますか?

public class ShapeEntity
{
    int idShape { get; set; }
}

public interface IShape
{
    void Draw();
}

public class Square : IShape
{
    public void Draw() { }
}

public class Rectangle : IShape
{
    public void Draw() { }
}

public class Canvas()
{
    public static void Main()
    {
        List<IShape> Shapes = new List<IShape>();

        foreach(ShapeEntity ShapeItem in ShapeRepository.GetAll())
        {
            if(ShapeItem.idShape == 1)
            {
                Shapes.Add(new Square());
            }
            else if(ShapeItem.idShape == 2)
            {
                Shapes.Add(new Rectangle());
            }
        }
    }

    public void DrawShapesOnCanvas(IList<IShape> Shapes)
    {
        foreach(IShape Shape in Shapes)
        {
            Shape.Draw();
        }
    }
}
4

1 に答える 1

5

パターンの使用を検討する必要がFactoryあり、代わりに使用Idする必要がありますenum

例:

 public class ShapeFactory
    {
        public static IShape GetShape(ShapeType shapeType)
        {
            switch (shapeType)
            {
                case ShapeType.Square:
                    return new Square();

                case ShapeType.Rectangle:
                    return new Rectangle();
                default:
                    break;
            }

            return null;
        }
    }

    public enum ShapeType
    {
        Square,
        Rectangle
    }
于 2012-07-29T22:02:19.060 に答える