Необходимость различать интерфейс и класс на самом деле указывает на недостаток дизайна. В хорошо спроектированном приложении это всегда будет понятно. Подкласс всегда должен быть специализацией, а классы могут специализироваться только на одном предмете и никогда больше.
Класс должен иметь единственную причину существования. Ни в коем случае не следует помещать второстепенные роли в базовый класс. Например.:
public class XmlConfigurationFile : ConfigurationFile, IDisposable
{
}
public class YamlConfigurationFile : ConfigurationFile, IDisposable
{
}
Первый — это файл конфигурации, специализированный на Xml, второй — на Yaml. Они тоже одноразовые, но это не так важно. Вы не создали эти два класса из-за разных процессов утилизации.
Сравните это с:
public class XmlConfigurationFile : IDisposable, ConfigurationFile
{
}
Это скажет вам, что основная цель XmlConfigurationFile заключается в том, что он одноразовый. То, что вы можете использовать его как способ представления файлов конфигурации, хорошо, но второстепенно.
Проблема начинается, когда вы создаете классы, у которых есть несколько причин существования:
public class MyConfigurationFile : XmlConfigurationFile, YamlConfigurationFile
{
}
Даже если XmlConfigurationFile и YamlConfigurationFile были бы интерфейсами, это все равно указывает на плохой дизайн. Как ваш файл конфигурации может быть Xml и Yaml одновременно?
Если вы прочитаете приведенные примеры (здесь и в других местах), люди всегда изо всех сил пытаются найти хороший пример того, когда I-префикс имеет значение. Один из ответов здесь:
public class Dog : Pet, Mammal
{
}
Вот так этот класс будет выглядеть в приложении про домашних животных. Основная цель собаки — быть специализированным домашним животным, которое может делать вещи, связанные с домашним животным, а не млекопитающим.
public class Dog : Mammal, Pet
{
}
Вот так этот же класс будет выглядеть в приложении о классификации животных. Приятно знать, что собака — домашнее животное, но ее основная цель — быть специализированным млекопитающим, которое может делать вещи, связанные с млекопитающими.
Я думаю, что ваши классы должны рассказать вам правильную историю об архитектуре и предметной области вашего приложения. Требование, чтобы интерфейс имел префикс «I», является техническим требованием и не поможет вам лучше рассказать историю вашего приложения.
Как только вы начнете писать небольшие, специализированные, одноцелевые классы, необходимость знать, реализует ли он или расширяет, автоматически исчезнет.
person
Jeroen
schedule
05.08.2016