Ваш метод работает.Однако вы ограничиваете повторное использование вашего класса.
Если бы вы описали MyClass
другим, не могли бы вы сказать, что метод, используемый для чтения параметров конфигурации, необходим для MyClass
?Другими словами: будет ли большая часть кода вашего класса бессмысленной, если параметры конфигурации не будут считываться из файла конфигурации, но, например, из CSV-файла, или из Интернета, или каким-либо другим способом?
Вы, вероятно, скажете «нет»: большая часть кода моего класса может быть повторно использована, если параметры конфигурации должны быть предоставлены по-другому.
Так зачем ограничивать ваш класс классом, который может работать, только если он читает параметры конфигурации изфайл конфигурации?
Я полагаю, что у вас сейчас есть что-то вроде:
static class ConfigurationSettings
{
public static int LeftControl => ...
public static int RighControl => ...
}
class MyClass
{
// MyClass uses configuration settings:
public int LeftControl => ConfigurationSettings.LeftControl;
public int RightControl => ConfigurationSettings.RightControl;
...
}
Вы не можете создать два объекта MyClass
, каждый из которых имеет свой собственный набор параметров конфигурации.Вы не можете создать MyClass
объект, который использует другой метод предоставления значений конфигурации.
Один из случаев использования, который мне часто нужен, это когда выполняется модульное тестирование: я хочу быстрый способ, чтобы иметь возможностьизменить настройки конфигурации без необходимости изменения файла конфигурации проекта модульного тестирования.
Простой способ позволить пользователям вашего класса предоставлять различные методы настройки - создать интерфейс с настройкой и предоставить конструкторс этим интерфейсом:
interface IMySettings
{
int LeftControl {get;}
int RightControl {get;}
...
}
class ConfigurationSettings : IMySettings
{
// ConfigurationSettings reads settings from the configuration file
}
class MyClass
{
// default constructor use the configuration file via ConfigurationSettings:
public MyClass() : this (new ConfigurationSettings())
{
}
// extra constructor for those who don't want to use configuration file
public MyClass(IMySettings settings)
{
this.Settings = settings;
}
protected readonly IMySettings settings;
// MyClass uses settings:
public int LeftControl => this.settings.LeftControl;
public int RightControl => this.settings.RightControl;
}
Пользователи, которые хотят использовать настройки из файла конфигурации, могут использовать конструкторы по умолчанию;использует тех, кто хочет конкретные настройки использовать альтернативный конструктор.Этот альтернативный конструктор также используется, если вам нужны два разных объекта MyClass
, каждый со своими настройками.
На первый взгляд кажется, что с минимальными изменениями вы все равно можете использовать файл конфигурации.Однако для реализации интерфейса класс, который читает файл конфигурации (MyClass
), не может быть статическим.
Однако вы были правы: существует только один файл конфигурации, следовательно, должен быть только один экземпляр класса, который читает из файла конфигурации: создайте одиночный файл.
По моему опыту,классы, представляющие конфигурацию, является одной из часто используемых причин использовать одиночный вместо статического класса