Тип или метод преобразования? - PullRequest
1 голос
/ 07 мая 2009

У меня есть контейнерный класс с параметрами, которые поступают из различных типов файлов конфигурации (например, текст или 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 представлял простой контейнер. Поэтому я думаю что-то вроде

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;
    }
}

Так что мне лучше выбрать метод convert, typecast или оба?

Сначала я думаю о производительности, лучшем использовании и личных привычках.

1 Ответ

3 голосов
/ 07 мая 2009

Я думаю, что сделал бы что-то вроде этих строк:

  • Создайте тип, соответствующий вашей конфигурации: IConfig
  • Создайте тип, который представляет ваш загрузчик конфигурации IConfigLoader
  • Создание различных реализаций загрузчика конфигурации (XmlConfigLoader, TextConfigLoader и т. Д.), Которые возвращают IConfig экземпляров.
  • Выберите реализацию загрузчика для использования либо динамически, либо по конфигурации, либо по жесткому кодированию и т. Д. Вы можете использовать абстрактную фабрику или контейнер IoC, например.
  • Передайте загруженный экземпляр IConfig конструктору ContainerClass и дайте ему инициализироваться.

Что касается вашего вопроса, я не уверен, что передача объекта конфигурации в контейнер нарушит SRP. По крайней мере, у вас может быть фабрика для вашего контейнера, которая будет принимать и считывать конфигурацию, чтобы создать экземпляр и инициализировать контейнер. Это может быть слишком сложно - это будет зависеть от уровня сложности задачи создания контейнера, я думаю.

...