Вопрос дизайна: как бороться с инициализацией? - PullRequest
1 голос
/ 24 марта 2009

Предположим, у нас есть класс, который будет широко использоваться в коде (c #), например, класс Log. Скажем, журнал записывает записи в файлы XML в определенном каталоге. Теперь одной из попыток заставить пользователя инициализировать класс необходимой информацией было бы сделать конструктор по умолчанию (без параметров) закрытым и предоставить тот, который принимает параметр logdirectory . Недостатком этого является то, что пользователь каждый раз, когда что-то должно быть записано в журнал, и, таким образом, создается экземпляр класса Log, должен быть предоставлен параметр.

Какие еще варианты доступны? Заранее спасибо за ваши ответы.

Ответы [ 5 ]

4 голосов
/ 24 марта 2009

Четыре варианта (в основном покрыты, но не явно и вместе):

  • Просто сделайте вызовы статическими и включите статическую инициализацию. Это ужасно для тестирования (классов, которые зависят от него), но очень просто.

  • Используйте singleton , как предлагается в большинстве других ответов. Это потенциально лучше с точки зрения тестирования (у вас могут быть внутренние методы для замены синглтона только для целей тестирования) и реализация интерфейса для целей имитации.

  • Использовать внедрение зависимостей: сделать все, что требует зависимости, взять его в конструкторе или чем-то еще, и заставить вашу DI-инфраструктуру все подключить. Гораздо лучше с точки зрения тестирования, но это не совсем удобно.

  • Используйте фабрику - как синглтон, но отделяйте реализацию от конструкции. (Это может эффективно закончиться как синглтон, но без такого большого количества предположений об этом.)

1 голос
/ 24 марта 2009

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

0 голосов
/ 24 марта 2009

Singleton. Вы можете использовать статический класс, поэтому его не нужно создавать. Затем, если у вас есть каталог журналов, есть путь к журналу по умолчанию и обнуляемый параметр для метода writelog или переопределенная сигнатура метода, один принимает путь, другой принимает значения по умолчанию из файла конфигурации.

0 голосов
/ 24 марта 2009

Просто сделайте функцию Logger.Log () статическим вызовом и сделайте так, чтобы он ссылался на статический член, который является информацией каталога. Затем вам нужно только один раз установить элемент информации каталога в начале выполнения, и все последующие вызовы Logger.Log () будут «просто работать».

0 голосов
/ 24 марта 2009

Вы так близко ... реализуйте это как одиночку, и вам не нужно будет инициализироваться более одного раза. Краткий ответ - создать статический открытый экземпляр вашего класса внутри себя и открытый статический метод, который либо (а) инициализирует этот экземпляр, если он в настоящий момент равен нулю, либо (б) возвращает уже инициализированный экземпляр.

Есть еще несколько деталей, которые следует учитывать при работе с одноэлементным шаблоном, но с этого следует начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...