Являются ли интерфейсы тегов (или «маркеров») устаревшими? - PullRequest
4 голосов
/ 11 июня 2009

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

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

Ответы [ 7 ]

9 голосов
/ 11 июня 2009

Интерфейсы тегов используются в Java (очевидным примером является Serializable). C # и даже Java, похоже, отходят от этого, хотя и в пользу атрибутов, которые могут выполнять то же самое, но и делать гораздо больше.

Я все еще думаю, что им есть место в других языках, у которых нет концепции атрибутов, которая есть в .NET и Java.

ETA:

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

Некоторые примеры из реального мира:

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

Другим примером может быть система кэширования веб-страниц. Скажем, у вас есть объект "Page" и объект "RequestHandler". RequestHandler принимает запрос на страницу, находит / создает соответствующий объект Page, вызывает метод Render () для объекта Page и отправляет результаты в браузер.

Теперь, скажем, вы хотели реализовать кэширование для отображаемых страниц. Но проблема в том, что некоторые страницы являются динамическими, поэтому их нельзя кэшировать. Одним из способов реализации этого было бы использование кешируемых объектов Page для реализации интерфейса «тега» ICacheable (или наоборот, вы могли бы иметь интерфейс INotCacheable). Затем RequestHandler проверит, реализована ли страница ICacheable, и если он это сделал, то после вызова Render () будет кэшировать результаты и обработать эти кэшированные результаты при последующих запросах для этой страницы.

7 голосов
/ 11 июня 2009

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

Примеры в .Net Framework INamingContainer является частью ASP.Net

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

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

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

Я бы назвал себя программистом OO, и я никогда не слышал об интерфейсе тегов.

0 голосов
/ 15 марта 2011

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

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

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

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

альтернативный текст http://www.freeimagehosting.net/uploads/th.4528577db5.jpg
Нажмите для полного изображения
источник: http://www.informit.com/articles/article.aspx?p=423349&seqNum=6
или любое количество других точек воздействия рекомендаций Квалины, таких как книга.

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

Я пару раз использовал интерфейсы тегов в объектной модели, представляющей базу данных SQL. В этих случаях это подтип корневого интерфейса для определенных типов объектов. Проще проверить интерфейс тега, чем атрибут («obj is IInterface» вместо использования отражения)

...