Typecast还是转换方法?

时间:2009-05-07 12:40:22

标签: c# oop single-responsibility-principle

我有一个容器类,其参数来自不同类型的配置文件(例如text或xml)。

所以我为textConfigurationFiles创建了一个类,为xmlConfigurationFiles创建了一个类(我想我稍后会实现一个接口IConfigFile)。

我的容器类的初始化如下所示:

ContainerClass myContainer = new ContainerClass();
myTextConfig = new TextConfig(textFile);
myContainer.ParameterA = myTextConfig.ParameterA;
myContainer.ParameterB = myTextConfig.ParameterB;
myContainer.ParameterC = myTextConfig.ParameterC;

或xml

ContainerClass myContainer = new ContainerClass();
myXMLConfig = new XMLConfig(xmlFile);
myContainer.ParameterA = myXMLConfig.ParameterA;
myContainer.ParameterB = myXMLConfig.ParameterB;
myContainer.ParameterC = myXMLConfig.ParameterC;

但我没有指定每一个值,而是想进行某种转换。现在我不知道我是应该实现类型转换还是仅仅是一个返回ContainerClass对象的简单方法?

myContainer = myTextConfig.ConvertToContainer();

myContainer = (ContainerClass)myTextConfig;

你的建议是什么?

因为我正在尝试实现单一责任原则,我希望我的ContainerClass代表一个简单的Container。所以我认为像

ContainerClass myContainer = new ContainerClass(configFile);

会破坏SRP吗?

也许我应该提一下我的ContainerClass是由文本 xml文件初始化的;并不是参数来自文本 xml文件。


[编辑:其他信息]

ContainerClass表示具有数据库配置信息(路径,名称等)的容器。

textFile表示数据库配置。

xmlFile也包含数据库配置,但具有比textFile更多的(数据库配置)参数。

我想到了......像:

IConfig        config    = new TextFileConfig(fileName);
ContainerClass container = config.ConverToContainer();

IConfig        config    = new TextFileConfig(fileName);
ContainerClass container = (ContainerClass)config;

在TextFileConfig中:

public class TextFileConfig : IConfig
{
    ContainerClass container;

    //
    // Constructor
    //
    public TextFileConfig(string fileName)
    {
        //
        // Initialize all values from file fileName
        //
        ...

        //
        // Initialize container with standard values
        //
        container = new ContainerClass();

        //
        // Merge container with values from textFile
        //
        ...

        //
        // Now container contains all values from textFile,
        // all missing parameters are initialized with
        // standard values.
        //
    }


    public ContainerClass ConvertMethodOrTypecastThatsTheQuestion()
    {
        return container;
    }
}

我应该更喜欢转换方法,类型转换还是两者兼而有之?

起初我会考虑表现,最佳用法和个人习惯。

1 个答案:

答案 0 :(得分:3)

我想我会沿着这些方面做点什么:

  • 创建代表您的配置的类型:IConfig
  • 创建表示配置加载程序IConfigLoader
  • 的类型
  • 创建返回XmlConfigLoader个实例的不同配置加载器实现(TextConfigLoaderIConfig等)。
  • 选择要动态使用的加载程序实现,或通过配置或硬编码等来使用。例如,您可以使用抽象工厂或IoC容器。
  • 将加载的IConfig实例传递给ContainerClass构造函数,并让它自己初始化。

关于你的问题,我不确定将配置对象传递给容器会破坏SRP。至少,你可以拥有一个容器工厂,它可以读取和读取配置,以实例化和初始化容器。它可能是过度设计的 - 这取决于容器创建任务的复杂程度,我想。