我应该创建一个单独的类为了这个?
-
11-09-2019 - |
题
我的项目包括很多类,一堆,它可以说明通过XML文件。不用担心,它不是逻辑或实施XML。这是一个游戏,并且一个例子是,一个游戏瓦可以限定在XML文件的图像、动画框架,等等。
我要结束有一堆的职能,看起来是这样的:
public static Foo FromXml(ref XmlTextReader reader) { ... }
问题是这个:应当这些职能包含在他们自己的匹配的类,例如一个以上的将Foo。FromXml.或者,我应该做一个单独的类阅读的东西从文件吗?似乎有两个相互竞争的一般准则:
- 一个类应该知道的一切有关一件事本身。
- 一个类应该只有一个原因改变。
首先,我真的不明白第二之一,因为"原因"是相当模糊。第一,准则建议把每个读者相关类。第二个说到做一类专门的阅读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序列化的对象是因为
- xml化通常需要 你结构类的一种方式, 和你通常会随后使用, 类的另一种方式。
- 这是一个比较容易,比具有巨大的 成堆的xml包括属性 (可以称为不同的东西) 无处不会允许的 多形态化的派生 类型。