Аннотации Java для шаблонов проектирования?

Есть ли проект, который поддерживает аннотации для шаблонов?

Например, когда я пишу конструктор, я хочу отметить его @Builder.

Аннотирование таким образом сразу дает четкое представление о том, что реализует код. Кроме того, Javadoc аннотации @Builder может ссылаться на объяснения шаблона построителя. Кроме того, переход от Javadoc реализации компоновщика к @Builder Javadoc упрощается за счет аннотирования @Builder с помощью @Documented.

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

Обновление: я создал Проект Pattern Notes в ответ на это обсуждение. Взносы приветствуются! Вот @Builder

У меня нет ответа на ваш вопрос, но мне интересно, почему вы хотите это сделать? Если это не какой-то действительно непонятный шаблон дизайна, я думаю, что большинство разработчиков смогут обнаружить их без какой-либо дополнительной документации. Не могли бы вы просто назвать свой класс WhateverBuilder?

Outlaw Programmer 24.09.2008 18:18

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

Greg Mattes 24.09.2008 18:45

Я вижу преимущество автоматического создания документации, которая будет определять роль каждого класса, используемого в шаблоне. Иногда это не совсем очевидно.

Rob 24.09.2008 18:50

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

Outlaw Programmer 24.09.2008 18:52

Продолжим с @Builder в качестве примера. В Javadoc для моего @Builder есть ссылка на пункт 2 «Эффективная Java», который представляет собой хорошо написанное 6-страничное обсуждение шаблона экспертом. Я бы хотел, чтобы это было в голове у разработчика при поддержке кода. Речь идет о последовательности, а не о «не трогайте это».

Greg Mattes 24.09.2008 19:02

Основная причина, по которой это полезно, - помочь документировать ваши намерения. Когда кто-то другой смотрит на какой-то ваш код, наличие аннотации или комментария, например, «Builder», помогает им понять, почему вы написали код именно так, как вы это сделали.

Scott Stanchfield 24.09.2008 21:33

Что, если кто-то имеет другое представление о том, что такое Строитель, чем то, что Джош Блох говорит в «Эффективной Java»? Это далеко не единственный способ написать построитель, и другие методы столь же «правильны».

cynicalman 25.09.2008 05:59

Это отличный момент. В моем связанном коде также есть ссылка на материал Gang of Four по Builder. Теперь, это не может быть бесспорно «правильной» либо. Но это не имеет значения. Документ с аннотациями содержит ссылки на разумные ссылки, которые могут дать информацию тем, кто в этом нуждается или хочет.

Greg Mattes 25.09.2008 06:18

Аааааааааааааааааааааааааааауз вузе, нужно думать не о шаблоне проектирования как о «реализации», а о «намерении». Есть много способов реализовать любой из шаблонов. Но цель остается прежней. Я думаю, что слишком много книг и статей посвящено реализации.

Scott Stanchfield 25.09.2008 07:08

Мне нравится ваш подход, но я сомневаюсь, что можно использовать аннотации, потому что аннотация связана с классом (предметом), а не с конфигурацией, в которой он находится (паттерн проектирования). Например: я могу создать класс фильтра (ProcessorImpl <A, B>), который делает кое-что интересное. Это шаблон стратегии, потому что он полиморфно реализует интерфейс и настраивает ProducerA -> ProcessorImpl <A, B> -> Processor <B,?> ... но где мне поместить @Strategy? Это его использование, а не вещь, которая создает узор.

helios 28.07.2010 10:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
10
4 503
10

Ответы 10

Мне это кажется неправильным использованием аннотаций. Конечно, я мог понять, почему вы можете захотеть отметить, какой шаблон проектирования помогает реализовать класс, но просто использование Javadoc и / или имени класса кажется более подходящим. Название шаблона, который вы используете, не имеет реального значения для самого кода ... шаблоны - это просто руководство по часто используемому способу решения проблемы. Вместо того, чтобы создавать новый файл для каждого используемого вами шаблона, будет достаточно комментария.

Хорошая мысль, но у моей схемы есть комментарий: это Javadoc аннотации. Вот почему аннотация @Documented. Аннотации ссылаются на документы, которые в противном случае могли бы быть продублированы.

Greg Mattes 25.09.2008 00:03

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

cynicalman 25.09.2008 05:57

Намерение! Добавление комментария или аннотации, чтобы указать, какие шаблоны используются, помогает донести замысел проекта до читателя / сопровождающего. Это может помочь им решить, где внести изменения, которые могут потребоваться позже.

Scott Stanchfield 25.03.2009 17:33

@ScottStanchfield есть более эффективные способы сообщить о намерениях. Если шаблон уже используется, будет достаточно имен классов или (в редких случаях, когда они не являются ориентировочными) комментариев в ключевых областях. Если шаблон еще не используется, это призыв к комментарию типа «преобразовать это в шаблон стратегии, если переключатель становится слишком большим». В отличие от аннотаций, комментарии не ограничены ни по форме, ни по месту.

ivan_pozdeev 11.12.2015 07:09

Кроме того, аннотации предназначены для машинного чтения во время выполнения. Нет причин проверять шаблоны, используемые во время выполнения.

ivan_pozdeev 11.12.2015 07:14

@ivan_pozdeev Аннотации не позволяют читать имеют во время выполнения. Их нет, если они не имеют маркировки @Retention(RUNTIME).

ColinD 11.12.2015 20:20

@ivan_pozdeev Помечая аннотацию RUNTIME, она становится доступной для любого кода отражения, который работает с классом. Это может быть полезно, например, если вы хотите написать инструментальную среду, которая сообщает о шаблонах, используемых во время выполнения. В противном случае я бы по-прежнему рекомендовал, чтобы они были хотя бы КЛАССНЫМИ, чтобы инструменты, исследующие банки, могли их видеть.

Scott Stanchfield 18.12.2015 04:28

@ivan_pozdeev Соглашения об именах и комментарии невероятно ненадежны - вы можете написать их неправильно. Аннотации были созданы для проверки метаданных во время компиляции (что было проблемой для многих метаданных на основе javadoc - если вы введете ошибку, она будет проигнорирована). Используя аннотацию для обозначения используемого вами шаблона, вы не сможете сделать ошибку в написании или получите ошибку компилятора.

Scott Stanchfield 18.12.2015 04:30

Это интересное решение, но мне все время интересно, в чем на самом деле проблема, которую вы этим решаете? Или, другими словами, что вы получаете от использования чего-то подобного, чего вы не получаете, если надлежащим образом прокомментировали его использование в верхней части вашего класса?

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

Минусы будут, а именно:

  1. еще одна вещь, о которой должны подумать программисты, что никогда не бывает хорошо
  2. неаннотированные шаблоны могут сбивать с толку - возможно, кто-то забыл их задокументировать, но, может быть, это не шаблон ..?
  3. вы действительно можете аннотировать все шаблоны ..? как насчет шаблонов, которые не привязаны к одному классу / методу, например трехуровневому архитектурному шаблону, пулу потоков или даже MVC?

(Проблема решена / есть над чем подумать): я готов поспорить, что большинство из нас открыли исходный файл и быстро спросили: «О чем думали предыдущие разработчики, когда писали это?» Идея применения аннотаций шаблонов помогает ответить на такие вопросы. Отвечая на подобные вопросы, пусть даже частично, можно получить ценную «общую картину» для части кода. Кроме того, с помощью @Dокументированных ссылок можно легко найти дополнительные справочные материалы. Бремя этой дополнительной информации о шаблоне невелико.

Greg Mattes 24.04.2009 18:22

(Применимость / охват): Вероятно, не имеет значения, все ли шаблоны / могут / быть аннотированы, или все ли шаблоны / аннотируются / на практике. Каждый маленький кусочек помогает увеличить ценность. Сегодня у нас есть много кода, который явно не помечен предполагаемыми шаблонами. Отсутствие аннотации не означает, что какой-то шаблон отсутствует, просто он не задокументирован.

Greg Mattes 24.04.2009 18:23

(Шаблоны разбросаны по разным локациям): Представление о шаблонах, распределенных по разным участкам кода, интересно. Буквально вчера я применил шаблон представления шаблона (martinfowler.com/eaaCatalog/templateView.html), в котором есть «шаблон» и «помощник». Аннотирование помощника с помощью @TemplateView, казалось, рассказывало только часть истории. Возможно, следует ввести понятие «роль». Например, @TemplateView (role = "Helper") или @MVC (role = "Model").

Greg Mattes 24.04.2009 18:24

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

Да, у меня тоже было это. Я кажется разумным следующим шагом для расследования. Хотя не сразу понятно, какие свойства можно проверить, поскольку нет единого способа реализовать какой-либо конкретный шаблон. Такое решение, вероятно, приведет к определенному количеству «ложных срабатываний», как и другие инструменты контроля качества. Это не значит, что такой инструмент не имеет ценности. При наличии достаточного количества метаданных, возможно, количество ложных срабатываний может быть достаточно низким.

Greg Mattes 18.08.2009 16:39

@GregMattes Одна вещь, которую трудно проверить таким способом, - это предположения: например, в Observer мы предполагаем, что Субъекты не хотят напрямую знать своих Наблюдателей; в Visitor мы предполагаем, что иерархия элементов фиксирована и что мы хотим добавить новые функции через ConcreteVisitors; в Façade предоставленные методы являются упрощением базовой подсистемы и имеют несколько клиентов и т. д. Я думаю, что эффективный способ документирования шаблонов должен отражать эти предположения (возможно, для проверки человеком). Если / когда они больше не действительны, шаблон не нужен. Сколько разработчиков удаляют шаблоны?

Fuhrmanator 15.12.2014 18:51

Во-первых, вы хотите задокументировать намерение (или намерениеs).

Итак, почему бы не использовать общую версию вашей аннотации, что-то вроде @UsePattern, которая использует @ Документированный, которая является аннотацией маркера (хороший учебник от IBM)? Что мне не нравится, так это то, что аннотация сохраняется во время выполнения, что является пустой тратой, если вы не хотите влиять на семантику программы.

Или Пользовательский тег Javadoc, что кажется более подходящим.

Некоторая информация о сравнении: Сравнение аннотаций и тегов Javadoc с красивым резюме из одного предложения:

<< В общем, если разметка предназначена для изменения или создания документации, вероятно, это должен быть тег javadoc; в противном случае это должна быть аннотация. >>

Есть / были также дебаты по документация в виде аннотации или тегов javadoc.

Это отличные моменты и отличные ссылки на ресурсы - спасибо! Большинство моих аннотаций имеют политику хранения исходного кода, поэтому они не хранятся во время выполнения. Что касается настраиваемых тегов Javadoc: как мне ими поделиться? Аннотации можно упаковать в виде jar-файла, но пользовательские теги Javadoc реализованы с помощью переключателей командной строки, что не так просто поделиться. Кроме того, аннотации открывают возможность создания инструментов, которые могут проверять согласованность реализации шаблона. Сравнение аннотаций и тегов Javadoc говорит о том, что аннотации «влияют на то, как программы обрабатываются инструментами и библиотеками».

Greg Mattes 07.10.2009 18:04

Я только что наткнулся на другую интересную для вас статью: Маркеры дизайна - явное программирование для всех остальных, в которой рассказывается об интерфейсах маркеров, таких как Serializable.

По их словам:

...just because a class declares that it "implements Serializable" doesn't mean that it has correctly implemented the Serializable contract.

Since Java can't really tell if the contract has been met, using the marker interface is more of an explicit pledge by the programmer that it has.

The overlooked benefit of marker interfaces is that they also document the intention that a contract should be met...

Why haven't design choices traditionally been recorded in source code? Mostly, because there has been no clear place to put them.

Even if each "typesafe enumeration" class had a comment noting that it followed that pattern, any elaboration (much less tutorial information) would not have been added because one either had to copy it repeatedly, or worse, place it sporadically in arbitrary spots.

When creating the JavaDoc comments attached to each Design Marker interface, one can put in more detail than is typical because the comments do not need to be repeated anywhere else.

Они также упоминают некоторые недостатки, это хорошая пища для размышлений!

Еще есть статья 2008 года по информатике: Реализация шаблона проектирования в Java и AspectJ, она была представлена ​​на OOPSLA 2008, что должно дать представление о ее качестве.

Хорошая цитата из него:

... the mere existence of classes that exclusively contain pattern code serve as records of what patterns are being used. In the AspectJ cases, we observe two additional improvements. First, all code related to a particular pattern instance is contained in a single module (which defines participants, assigns roles, etc.). This means that the entire description of a pattern instance is localized and does not “get lost” [21] or “degenerate” [7] in the system. Secondly, with the current AspectJ IDE support, all references, advised methods etc. are hyperlinks that allow a developer an overview of the assignment of roles and where the conceptual operations of interest are...

Было бы лучше использовать аннотации для создания шаблона для Builder. Посмотрим правде в глаза, большинство из них довольно стандартные.

@Builder("buildMethodName")
Class Thing {
  String thingName;
  String thingDescr;
}

Типичное использование:

Thing thing =
      new Thing.Builder().setThingName("X").setThingDescr("x").buildMethodName();

Мне кажется, это неправильное использование аннотаций. Если нет намерения реализовать поведение с этими аннотациями, я бы использовал принцип KISS: простой старый javadoc отлично подходит для документирования того, что должен делать / быть артефакт; кастомные доклеты для расширения javadoc; и Google для тех, кто хочет знать, для чего нужен шаблон X или Y (или ссылку на него где-нибудь в Интернете).

Есть отличные, полуофициальные объяснения большинства закономерностей. Зачем писать свои собственные? Есть ли дополнительная информация, которая имеет решающее значение для проекта? Использование аннотаций, чтобы убедиться, что можно переходить от javadoc одного класса к специально написанному шаблону javadoc, похоже на рассказ о генеральном директоре, который собрал команду разработчиков для создания отчета, который объединяет итоги двух существующих квартальных отчетов - это было слишком сложно (и все же дешевле) складывать итоги двух с помощью калькулятора 4 раза в год: - /

Во-первых, это очень хорошая идея, и я тусуюсь здесь только потому, что искал в Google библиотеку "аннотаций шаблонов проектирования". Хорошо, что я нашел это! Я проверю это и скоро дам ответ.

Всем скептикам: извините, очевидно, что большинство из вас не очень опытны в теме дизайна. Например. Сообщение Мартина Харриса от 03 декабря 2009 в 21:56 ... Насколько я понимаю, вы хотели, чтобы ваш «пример» был простым. Но это не Строитель в смысле Паттерна проектирования.

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

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

Что касается таких предложений, как использование @UsePattern () или @Builder ("buildMethodName") и т.д. ... тут мы должны спросить, как это сделать "сохраненным"? В конце концов, эти строки подвержены опечаткам.

Одним из преимуществ правильных аннотаций является то, что вы можете аннотировать роли ... Большинство шаблонов проектирования состоят не из одного класса (например, синглтона), а из нескольких классов, работающих вместе! Например. если у вас есть строитель, результат (помеченный @Product) также может быть @Composite. Итак, части, которые собирает конструктор, будут @Component (в отношении @Composite) и @Part (в отношении @Builder и @Product).

Возможно, лучшим аргументом в пользу таких аннотаций будет java.lang.class, так что вы можете это выразить.

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

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

ivan_pozdeev 11.12.2015 06:54

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

Я хотел бы придерживаться принципа KISS, чтобы людям было как можно проще использовать аннотации. Например, если вы пишете адаптер, вы можете просто сказать:

@AdapterPattern
public class EnumerationIteratorAdapter<T> implements Enumeration<T> {
  ...
}

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

Домашняя страница проекта находится на http://www.jpatterns.org, откуда вы также можете получить доступ к исходному дереву исходных текстов. Пожалуйста, свяжитесь со мной на сайте heinz по адресу javaspecialists dot eu, если вы хотите внести свой вклад в этот проект.

Хайнц (Информационный бюллетень специалистов по Java)

Другие вопросы по теме