SOLID: вызов конструктора того же класса разрешен?

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

Я создал простой класс, где, как мне кажется, не только разрешено, но и действительно корректно отклоняться от вышеприведенного правила. Это абстрагирует некоторые простые запросы реестра для облегчения модульного тестирования некоторого другого кода:

public class RegistryKeyProxy : IRegistryKey
{
    private RegistryKey registrykey;

    public RegistryKeyProxy(RegistryKey registrykey)
    {
        this.registrykey = registrykey;
    }

    public IRegistryKey OpenSubKey(string subKeyName)
    {
        var subkey = this.registrykey.OpenSubKey(subKeyName);

        return (null == subkey ? null : new RegistryKeyProxy(subkey));
    }

    public IEnumerable<string> GetSubKeyNames()
    {
        return this.registrykey.GetSubKeyNames();
    }

    public object GetValue(string valueName)
    {
        return this.registrykey.GetValue(valueName);
    }
}

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

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

1 ответ

Решение

Вы говорите о принципе инверсии зависимости. Этот принцип не говорит о том, что вы никогда не должны создавать новые объекты вообще, но он различает два типа объектов. Объекты, которые реализуют поведение (службы), и объекты, которые содержат данные (DTO, Типы значений, Сущности).

Было бы довольно глупо не обновлять DTO, поскольку не нужно абстрагироваться. Они просто содержат данные. (Так же, как было бы глупо добавить IPerson интерфейс к Person DTO).

Мишко Эвери называет их инъекционными и новыми, что является хорошей терминологией.

Для получения дополнительной информации см. Этот вопрос Stackru: почему бы не использовать контейнер IoC для разрешения зависимостей для сущностей / бизнес-объектов?

Другие вопросы по тегам