Интерфейсы тегов (или маркеров) устарели?

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

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


person markh    schedule 11.06.2009    source источник
comment
Возможно, будет полезна ссылка на что-то, объясняющее, что вы подразумеваете под интерфейсом тега?   -  person    schedule 11.06.2009


Ответы (7)


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

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

Расчетное время прибытия:

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

Несколько реальных примеров:

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

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

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

person Eric Petroelje    schedule 11.06.2009
comment
Не могли бы вы привести пример из реальной жизни? - person Oorang; 12.06.2009
comment
@Oorang - хорошо, привел несколько примеров. Надеюсь, это немного прояснит ситуацию. - person Eric Petroelje; 12.06.2009
comment
Хороший ответ и примеры из реального мира. Я использовал пустые интерфейсы для реального варианта использования (пользователи могут динамически расширять некоторые классы сущностей во время выполнения), но я не знал, что это называется интерфейсом маркера/тега. - person felipsmartins; 13.02.2016

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

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

person Matthew Whited    schedule 11.06.2009
comment
Сладкий ... диск против голосования. Похоже, они спрашивают, полезны ли интерфейсы тегов. И я думаю, что пример их использования - это плохо. - person Matthew Whited; 11.06.2009
comment
Другие причины, по которым я нашел интерфейсы тегов полезными, - это имитация множественного и статического наследования. - person Matthew Whited; 11.06.2009
comment
Понижение связано с тем, что совет, данный в этом ответе, находится в прямом противоречии с рекомендациями по дизайну, рекомендованными MS. В Руководстве по разработке фреймворка говорится: НЕ используйте пустые интерфейсы; ОБЯЗАТЕЛЬНО используйте атрибуты. Дело не в том, что я не согласен с ответом; это то, что я думаю, что это на самом деле вредно. - person Cheeso; 12.06.2009
comment
И когда было написано это руководство. Я бы согласился с этой точкой зрения до выхода .Net 3.5. И если общие фильтры будут обновлены для соответствия атрибутам, я могу рассмотреть возможность возврата. Но в то же время лучше увидеть, относится ли объект к определенному типу, чем перечислять все атрибуты нужного объекта. - person Matthew Whited; 12.06.2009
comment
Этот ответ stackoverflow.com/questions/1023068/ перечисляет несколько очень веских причин, по которым следует отдавать предпочтение интерфейсам маркеров, а не атрибутам. - person John Rasch; 21.09.2009

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

person Scott Langham    schedule 11.06.2009
comment
хорошо, вы не знакомы с термином, но вы видели идиому. Я слышал, что их чаще называют маркерными интерфейсами. Пустой интерфейс, никаких методов или свойств. Сериализуемый в Java — один из них. java.sun.com/javase/6/docs/ api/java/io/Serializable.html В .NET идиома не одобряется. - person Cheeso; 11.06.2009
comment
Да, теперь я посмотрел, я знаю, что это такое. Я использовал Serializable в Java, не зная, что это называется интерфейсом тегов. Я вроде как думаю, что это немного трюк, хотя на самом деле. Я не могу вспомнить ни одного раза, когда я хотел сделать что-то подобное в своем коде. - person Scott Langham; 12.06.2009

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

person Dan Davies Brackett    schedule 11.06.2009
comment
Согласен, особенно с последним утверждением. Частое использование интерфейсов тегов, вероятно, является признаком плохо спроектированной объектной модели. - person Eric Petroelje; 11.06.2009
comment
@ Эрик ... я должен с тобой не согласиться. Интерфейсы тегов могут быть очень полезными. Другой способ получить метаданные времени компиляции без использования атрибутов. - person Matthew Whited; 11.06.2009

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

person thecoop    schedule 11.06.2009

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

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

person Cheeso    schedule 11.06.2009
comment
Атрибуты бесполезны для привязки к методам расширения - person Matthew Whited; 11.06.2009
comment
Правильно - атрибуты не являются интерфейсами, если вы это имеете в виду. - person Cheeso; 12.06.2009
comment
Вот почему тегирование интерфейсов может быть полезным. (не будь марионеткой 8o) - person Matthew Whited; 12.06.2009
comment
Я не понимаю ни вашего комментария, ни того, почему вы называете меня марионеткой. Вы говорите, что теговые интерфейсы полезны, потому что такое использование противоречит рекомендуемой практике? Потому что это удивительно для разработчиков? Потому что это творческий способ сделать то, что атрибуты делают лучше? - person Cheeso; 12.06.2009
comment
Я говорил это как укол за то, что меня проголосовали против. Есть причина, по которой это рекомендации. Это похоже на использование goto. Если вы скажете, что они работают, вас проголосуют, но правда в том, что они действительно работают. - person Matthew Whited; 12.06.2009
comment
Кроме того, эта книга до .Net 3.5 (и помимо этого мой пример в качестве интерфейса из фреймворка. Так что они не могут быть слишком противны им) - person Matthew Whited; 12.06.2009

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

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

person orbfish    schedule 15.03.2011