Статический метод или альтернатива OO? - PullRequest
0 голосов
/ 03 июня 2009

Допустим, у кого-то есть класс, подобный Person, с которым связаны некоторые настройки по умолчанию, реализованные в классе Setting. Эти настройки могут быть такими, как «Заголовок по умолчанию» или «Требуется имя». Соответственно, другие классы, такие как класс Address, также могут иметь некоторые настройки по умолчанию. Класс Setting сохраняет каждый параметр в постоянном хранилище.

Нужно ли реализовывать статический метод в каждом классе, например, "SetDefaults ()", который содержит эти параметры, чтобы внешний метод мог вызывать SetDefaults () для каждого типа объекта? например Person.SetDefaults (), а затем Address.SetDefaults ()?

Или есть какой-то лучший объектно-ориентированный способ сделать это?

[Обновление: это не может быть в конструкторе, потому что SetDefaults () должен вызываться из внешнего класса в определенный момент времени, а не каждый раз, когда объект создается.]

Ответы [ 6 ]

3 голосов
/ 03 июня 2009

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

Один из вариантов здесь - IoC; Контейнеры IoC, такие как StructureMap, имеют возможность устанавливать свойства после инициализации, а затем абстрагироваться от вызывающего кода.

Другим вариантом может быть какой-то экземпляр шаблона (статический), из которого экземпляры могут копировать значения. Но я думаю, что это рискованно в нескольких сценариях. Также возникают проблемы, если разные потоки (например, запросы на веб-сервере) требуют разных значений по умолчанию. [ThreadStatic] не хороший вариант (хотя это вариант).

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


re update: если он используется только внешним классом; может ли он использовать что-то вроде метода расширения (вместо того, чтобы Person класс должен был что-то об этом знать):

public static class PersonExt {
    public static void SetDefaults(this Person person) {
       // your code
    }
}

Поскольку это звучит так, как будто исходный класс Person не заботится о SetDefaults, это аккуратно отделяет логику от Person.

1 голос
/ 03 июня 2009

Почему бы не установить эти значения по умолчанию при создании объекта (в конструкторе). Значением по умолчанию является -imho- значение, которое должно быть присвоено свойству, когда этому свойству не присвоено никакого конкретного значения, поэтому я думаю, что было бы неплохо установить эти значения по умолчанию при создании объекта (в конструкторе, или через завод).

Или я что-то упустил?

0 голосов
/ 03 июня 2009

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

(В этом случае хранилищем может быть файл данных, реестр, база данных.)

0 голосов
/ 03 июня 2009

Вы можете создать класс настроек, который инкапсулирует настройки для всех классов (Person, Address).

Вы можете установить настройки по умолчанию, скажем, Person:

// Injected
Settings settings;
Setting personSetting = new ...;

...
settings.StoreSettingsFor(typeof(Person), personSettings);
0 голосов
/ 03 июня 2009

Я бы поместил их в конструктор.

class Person
{
  public Person()
  {
    this.Settings = MakeDefault();
  }

  public Person(Settings settings)
  {
    this.Settings = settings;
  }
} 
0 голосов
/ 03 июня 2009

Вы также можете реализовать Абстрактный шаблон фабрики и настроить фабрики с вашими настройками. Или же вы можете использовать IoC для введения зависимости в классы фабрики.

Простой класс Factory для Preson может выглядеть следующим образом:

public class PersonFactory
{
  private readonly ISettings settings;

  public PersonFactory(ISettings settings)
  {
    this.settings = settings;
  }

  public Person Create()
  {
     Person p = new Person();
     // ... you code for populating person's attributes form settings.
     return p;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...