我的项目包括很多类,一堆,它可以说明通过XML文件。不用担心,它不是逻辑或实施XML。这是一个游戏,并且一个例子是,一个游戏瓦可以限定在XML文件的图像、动画框架,等等。

我要结束有一堆的职能,看起来是这样的:

public static Foo FromXml(ref XmlTextReader reader) { ... }

问题是这个:应当这些职能包含在他们自己的匹配的类,例如一个以上的将Foo。FromXml.或者,我应该做一个单独的类阅读的东西从文件吗?似乎有两个相互竞争的一般准则:

  1. 一个类应该知道的一切有关一件事本身。
  2. 一个类应该只有一个原因改变。

首先,我真的不明白第二之一,因为"原因"是相当模糊。第一,准则建议把每个读者相关类。第二个说到做一类专门的阅读xml文件。但是利弊,都是值得商榷的。一方面,每一类可能包含其自己的阅读器,所以没有一个十几类引用。另一方面,每一类将包括System.Xml如果我改变我的xml格式,事情可能的变化在多个文件(但是我不认为那太糟).

我知道的最重要的规则是"使用你的大脑"并没有这样的东西作为一个"正确"的解决方案,只有一个良好的工作之一。那么你认为会是更具可读性,或者更好的是,维护?

编辑:为了澄清,该课程可以完全无关。由于这是一场游戏,一个可能的精灵的动画,可以定义的敌人的行为,一种可能定义的地图版面或性质。所以继承已经没有什么要做到这一点。

有帮助吗?

解决方案

是的FromXml(...)功能完全相同?假设他们是我会把它放在一个共用图书馆的区域,因为它将使他们很容易因为没有代码重复。该代码应该仍然是太整齐

SomeObject o = (SomeObject)Foo.FromXml(reader);

编辑: 或者,可能的话,使一些基抽象的类只有FromXml/ToXml的功能,那么所有类想要使用这些功能继承从抽象的类。

其他提示

具有一个静态的基类方法,为所有继承类和维持适当的多态性是很困难的。你可以但是删除静态性的方法,并有一个InitializeFromXml方法,该方法将基本上能让你人类从xml。虽然我通常不关心的公共初始化方法,这往往是更好地为多态性。

这是一个例子。这是一个位于一个小的物体像这样(和我很少实际使用xml化,但将载入xml文件和拉出来的什么我所需要的反派),但当事情变的规模,是继承的,并且一般较为复杂,它可以让你重复使用相当多一点:

public class CustomObject {
    public string AValue { get; set; }
    public bool BValue { get; set; }
    protected IXmlConfiguration Config = new CustomObjectConfig( );

    public virtual string ToXml( ) {
        return Config.ToXml( this );
    }

    public virtual void InitializeFromXml( string xml ) {
        Config.FromXml( xml );
        AValue = ((CustomObjectConfig)Config).A;
        BValue = ((CustomObjectConfig)Config).B;
    }
}

public interface IXmlConfiguration {
    void FromXml( string xml );
    string ToXml( object instance );
}

[XmlRoot( "CustomObject" )]
public class CustomObjectConfig : IXmlConfiguration {
    [XmlElement( "AValue" )]
    public string A { get; set; }
    [XmlAttribute( "bvalue" )]
    public bool B { get; set; }

    public void FromXml( string xml ) {
        byte[] bytes = Encoding.UTF8.GetBytes( xml );
        using ( MemoryStream ms = new MemoryStream( bytes ) ) {
            XmlSerializer xs = new XmlSerializer( typeof( CustomObjectConfig ) );
            CustomObjectConfig cfg = (CustomObjectConfig)xs.Deserialize( ms );
            A = cfg.A;
            B = cfg.B;
        }            
    }

    public string ToXml( object instance ) {
        string xml = null;
        if ( instance is CustomObject ) {
            CustomObject val = (CustomObject)instance;
            A = val.AValue;
            B = val.BValue;
            using ( MemoryStream ms = new MemoryStream( ) ) {
                XmlSerializer xs = new XmlSerializer( typeof( CustomObjectConfig ) );
                xs.Serialize( ms, this );
                ms.Seek( 0, 0 );
                byte[] bytes = ms.ToArray( );
                xml = Encoding.UTF8.GetString( bytes );
            }
        }
        return xml;
    }
}

原因,我赞成这种方法,而不是创建xml序列化的对象是因为

  1. xml化通常需要 你结构类的一种方式, 和你通常会随后使用, 类的另一种方式。
  2. 这是一个比较容易,比具有巨大的 成堆的xml包括属性 (可以称为不同的东西) 无处不会允许的 多形态化的派生 类型。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top