是否将一个类的等级划分为多个等级?

问题描述 投票:1回答:1

目前,我们有一个.NET应用程序,它依赖于标准的.NET XML序列化/反序列化机制。该示例已简化,但含义相同。

public abstract class Shape
{
    [XmlAttribute("id")]
    public string Id { get; set; }
    [XmlAttribute("level")]
    public int Level { get; set; }

    public abstract void Draw();
    public abstract void Clear();
    public abstract void Scale(double scale);
}

[XmlType("Circle")]
public class Circle : Shape
{
    public double Radius { get; set; }

    public override void Draw() {}

    public override void Clear() {}

    public override void Scale(double scale) {}
}

[XmlType("Rectangle")]
public class Rectangle: Shape
{
    public double Height { get; set; }
    public double Width { get; set; }

    public override void Draw() {}

    public override void Clear() {}

    public override void Scale(double scale) {}
}

public class Picture
{
    public double Scale { get; set; }
    [XmlArrayAttribute("Shapes")]
    public Collection<Shape> Shapes { get; set; }

    public void Setup()
    {
        foreach (Shape shape in Shapes)
        {
            shape.Draw();
        }

        foreach (Shape shape in Shapes)
        {
            shape.Scale(Scale);
        }
    }

    public void Cleanup()
    {
        foreach (Shape shape in Shapes)
        {
            shape.Clear();
        }
    }

    public static Picture FromXml(XmlReader xmlReader)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Picture));
        return serializer.Deserialize(xmlReader) as Picture;
    }
}

例如,输入的XML文件如下所示:

<Picture>
    <Scale>0.9</Scale>
    <Shapes>
        <Circle id="1">
            <Radius>1.5</Radius>
        </Circle>
        <Circle id="2">
            <Radius>3</Radius>
        </Circle>
        <Rectangle id="3">
            <Height>300</Height>
            <Width>300</Width>
        </Rectangle>
    </Shapes>
</Picture>

但是模型类包含逻辑(Draw(),Clear()和Scale()方法),并且似乎违反了单一责任原则。因此,我们不知道将逻辑分为几个类是否有意义?

如果是,那么如何?因为一旦读取XML文件,所有对象都只能作为Shape对象访问,因此我们必须在传递给处理程序类之前或在该方法内部之前显式转换对象,例如:

public abstract class Drawer
{
    public abstract void Draw(Shape shape);
}

public class CircleDrawer : Drawer
{
    public override void Draw(Shape shape)
    {
        Circle circle = shape as Circle;
        if (circle == null)
        {
            throw new ArgumentException("Passed object is not of type Circle");
        }
    }
}

如果知道该问题,请直接将我重定向到该资源。

先谢谢您。

c# .net oop design-patterns xml-serialization
1个回答
0
投票

您应将模型和业务逻辑分开,因此,将要反序列化的对象将仅包含属性。然后,在创建业务逻辑的工厂或方法中,将其作为圈子(例如)业务逻辑的成员插入。

© www.soinside.com 2019 - 2024. All rights reserved.