Есть ли причина иметь интерфейсы для очень простых объектов данных? - PullRequest
2 голосов
/ 16 августа 2010

При написании моего текущего проекта я создал интерфейсы для всех своих объектов. Я думал, что это считается хорошей практикой кодирования.

В основном я получил несколько интерфейсов, которые определяют довольно тривиальные классы.

Например:

public interface IUser
{
    int Id { get; }
    string DisplayName { get; }
}

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

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

Я бы хотел услышать мнение других пользователей здесь. Есть ли цель определения интерфейсов для базовых объектов? Есть ли вред, если они там есть, даже если они на самом деле не нужны?

Ответы [ 7 ]

6 голосов
/ 16 августа 2010

Если интерфейсы не увеличивают ценность, удалите их.Когда дело доходит до интерфейсов на объектах, если они не имеют общей основы, я не вижу никакой выгоды в том, чтобы поместить их за интерфейс.

Если они имеют общую основу, это позволит вам использовать общие алгоритмы дляобрабатывая их.

Я обычно вижу "сущности", расширяющие базовые классы, которые содержат информацию аудита.

interface IAuditBase{
    int Id { get; }
    string UpdateDate{ get; }
    //etc.
}
4 голосов
/ 16 августа 2010

Я бы не использовал их, если вы не можете определить, почему вы их используете.Интерфейсы хороши, когда у вас очень стандартизированный способ взаимодействия с набором похожих объектов, и вам нужно, чтобы все они «взаимодействовали» одинаково.

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

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

Вы упомянули интерфейс IUser, поэтому у вас есть несколько реализаций различий объекта Userчто у всех одинаковый интерфейс, схожие методы, поведение и т. д.?Интерфейс может иметь смысл, но если вы используете только класс User, то нет никакой реальной причины использовать интерфейс.

1 голос
/ 16 августа 2010

Основной целью интерфейса является предоставление «контракта», которого будет придерживаться класс. Это действительно становится важным только в том случае, если нескольким классам нужно будет придерживаться одного и того же контракта или , если некоторому классу нужен только доступ к членам интерфейса, и ему не нужна реализация класса.

Если у вас не будет таких сценариев, не стесняйтесь опускать некоторые интерфейсы.

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

0 голосов
/ 16 августа 2010

Это одна из причин, почему мне нравится TDD (или похожий подход). Вы не получите Интерфейсы, пока шаг Рефакторинга не скажет, что они вам нужны.

0 голосов
/ 16 августа 2010

Лично я думаю, что у DTO очень редко должны быть интерфейсы. Гораздо более вероятно, что DTO будет оставаться статичным, а то, что будет «сопряжено», будет кодом, из которого DTO будет получено / сохранено.

0 голосов
/ 16 августа 2010

Интерфейс должен рассматриваться только как контракт в большинстве случаев.Сущности, которые вы определили, должны рассматриваться как класс (как объект, созданный из него).

Интерфейсы обеспечивают своего рода гибкость в реализации.

Существует несколько других причин, по которым вы могли бывы хотите использовать интерфейсы вместо наследования классов:

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

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

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

Интерфейсы полезны в тех случаях, когда вы не можете использовать наследование классов.Например, структуры не могут наследоваться от классов, но они могут реализовывать интерфейсы.

0 голосов
/ 16 августа 2010

Интерфейсы подразумевают различные реализации для меня. Если объекты вашей модели не изменят поведение, не будут когда-либо проксированы, или если они будут неизменными, или если они будут не чем иным, как DTO, тогда я не увижу причину интерфейса.

...