Пустые интерфейсы ICommand и IQuery при реализации CQRS

Я читал о CQRS и искал несколько примеров. В ходе этого процесса я нашел репозиторий GitHub курса Pluralsight "CQRS на практике". (к сожалению, я не могу получить доступ к курсу прямо сейчас). Я просматривал исходный код и заметил кое-что, что поначалу показалось мне неудобным: есть два интерфейса ICommand и IQuery, которые просто оставлены пустыми. Другими словами:

public interface ICommand { }
public interface IQuery<TResult> { }

После этого все команды будут реализовывать ICommand, а все запросы будут реализовывать IQuery<TResult>.

Но это неудобно для меня. Интерфейс — это контракт. Класс, реализующий его, подпишет контракт и будет гарантированно иметь указанные методы. Здесь нет никакого метода. Так что я действительно не понимаю, зачем кому-то это делать.

Так какой смысл иметь пустой интерфейс? Зачем кому-то создавать и реализовывать интерфейсы, которые не определяют никакого контракта?


person user1620696    schedule 20.01.2020    source источник
comment
Это шаблон интерфейса маркера. Он просто сообщает вам, какие конкретные классы, как ожидается, будут использоваться, например, как ICommand. Обычно у вас было бы IHandleCommand<T extends ICommand>. Иногда вы можете использовать для этого аннотации вместо интерфейсов маркеров, но я считаю, что вы не можете иметь общие типы, ограниченные аннотациями на большинстве языков (возможно, на всех).   -  person plalx    schedule 20.01.2020


Ответы (1)


Хороший справочник здесь — Effective Java Джошуа Блоха:

Используйте интерфейсы маркеров для определения типов

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

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

Блох предлагает конкретный вопрос: могу ли я написать один или несколько методов, которые принимают только объекты, имеющие эту маркировку?

В случае с DDD вы когда-нибудь хотели написать метод, который принимает только ICommand или IQuery?

После быстрого просмотра примера Хорикова для меня не очевидно, что ему нужно определить тип - аннотация или даже комментарий могут быть лучшим выбором.

person VoiceOfUnreason    schedule 20.01.2020