2009-05-07 2 views
1

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


[EDIT: Дополнительная информация]

ContainerClass представляет собой контейнер с информацией о конфигурации базы данных (пути, имя и т.д.).

textFile представляет собой конфигурацию базы данных.

xmlFile также содержит конфигурацию базы данных, но имеет больше параметров (конфигурации базы данных), чем мой textFile.

Я думаю о sth. как:

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

Так я должен предпочесть метод новообращенного, A или напечатанный материал как?

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

+0

Зачем вам этот контейнерный класс? Разве это не должен быть базовый класс для xml и текстовых конфигураций? – Grzenio

+0

Я так не думаю: ContainerClass представляет собой конфигурацию базы данных. Мой текстовый файл содержит конфигурацию базы данных. Мой xmlFile содержит разные таблицы, а одна таблица содержит конфигурацию базы данных, похожую на мою текстовую. Кроме того, конфигурация базы данных в моем xmlFile содержит больше записей, чем textFile. – Inno

ответ

3

Я думаю, что я хотел бы сделать что-то по тезисах линии:

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

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

+0

Существует несколько причин, по которым метод приведения типа или преобразования может быть более уместным: ContainerClass содержит конфигурацию базы данных (пути, имя базы данных, тип базы данных и т. Д.). textFile содержит конфигурацию базы данных. xmlFile также содержит конфигурацию базы данных, но имеет больше параметров, чем мой textFile. IMHO было бы лучше всего взять все существующие параметры из моего текстового поля и сохранить стандартные значения ContainerClass для всех отсутствующих параметров. – Inno

 Смежные вопросы

  • Нет связанных вопросов^_^