Каковы основные недостатки Java Server Faces 2.0? - PullRequest
230 голосов
/ 02 сентября 2010

Вчера я видел презентацию на Java Server Faces 2.0, которая выглядела действительно впечатляюще, хотя я в настоящее время являюсь счастливым разработчиком ASP.NET MVC / jQuery.Что мне больше всего понравилось в JSF, так это огромное количество компонентов пользовательского интерфейса с поддержкой AJAX, которые, кажется, делают разработку намного быстрее, чем с ASP.NET MVC, особенно на сайтах с интенсивным использованием AJAX.Интеграционное тестирование тоже выглядело очень хорошо.

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

Итак, мои вопросы:

  • Каковы основные недостатки Java Server Faces 2.0?
  • Что может заставить разработчика JSF подумать об использовании ASP.NET MVC вместо JSF?

Ответы [ 13 ]

457 голосов
/ 05 сентября 2010

Недостатки JSF 2.0?Честно говоря, кроме сравнительно крутой кривой обучения, когда у вас нет достаточных знаний о основы веб-разработки (HTML / CSS / JS, на стороне сервера и на стороне клиента и т. Д.) И основыJava Servlet API (запрос / ответ / сеанс, переадресация / перенаправление и т. Д.), Никаких серьезных недостатков не приходит на ум.JSF в своем текущем выпуске все еще нуждается в том, чтобы избавиться от негативного изображения, полученного им в ранние века, во время которого было несколько серьезных недостатков.

JSF 1.0 (март 2004 г.)

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

JSF 1.1 (май 2004 г.)

Это был релиз исправления ошибки.Производительность по-прежнему не сильно улучшилась.Был также один существенный недостаток: вы не можете безупречно встроить HTML на странице JSF.Весь простой ванильный HTML-код отображается до дерева компонентов JSF.Вам нужно обернуть все простые ванили в теги <f:verbatim>, чтобы они были включены в дерево компонентов JSF.Хотя это было в соответствии со спецификацией, это получило много критики.См. Также JSF / Facelets: почему не стоит смешивать JSF / Facelets с тегами HTML?

JSF 1.2 (май 2006 г.)

Это былПервый выпуск новой команды разработчиков JSF под руководством Райана Любке.Новая команда проделала огромную работу.Также были изменения в спецификации.Основным изменением было улучшение обработки представления.Это не только полностью отделил JSF от JSP, поэтому можно было использовать технологию представления, отличную от JSP, но также позволило разработчикам встроить простой ванильный HTML-код в страницу JSF без лишних хлопот с тегами <f:verbatim>.Еще одним важным направлением деятельности новой команды было улучшение производительности.В течение жизненного цикла эталонной реализации Sun JSF 1.2 (кодовое название Mojarra , начиная со сборки 1.2_08, примерно в 2008 году), практически каждая сборка поставлялась с (существенными) улучшениями производительности рядом с обычными (незначительными) исправлениями ошибок.

Единственным серьезным недостатком JSF 1.x (включая 1.2) является отсутствие области действия между запросом и сессией , так называемым разговор сфера.Это вынудило разработчиков беспокоиться о скрытых элементах ввода, ненужных запросах БД и / или злоупотреблении областью сеанса всякий раз, когда кто-то хочет сохранить исходные данные модели в последующем запросе, чтобы успешно обрабатывать проверки, преобразования, изменения модели и вызовы действий в болеесложные веб-приложения.Боль можно смягчить, приняв стороннюю библиотеку, которая сохраняет необходимые данные в последующем запросе, такие как Томагавк MyFaces <t:saveState>, JBoss Seam область разговора и MyFaces Orchestra инфраструктура диалога.

Другим недостатком для пуристов HTML / CSS является то, что JSF использует двоеточие : в качестве символа разделителя идентификаторов, чтобы обеспечить уникальность элемента HTML id в сгенерированном выводе HTML, особенно когдакомпонент повторно используется в представлении более одного раза (шаблоны, итерации компонентов и т. д.).Поскольку это недопустимый символ в идентификаторах CSS, вам нужно будет использовать \ для экранирования двоеточия в селекторах CSS, что приведет к появлению уродливых и странно выглядящих селекторов, таких как #formId\:fieldId {} или даже #formId\3A fieldId {}.См. Также Как использовать сгенерированный JSF идентификатор элемента HTML с двоеточием ":" в селекторах CSS? Однако, если вы не пурист, читайте также По умолчанию JSF генерирует непригодные идентификаторы, которыенесовместим с css частью веб-стандартов .

Кроме того, JSF 1.x не поставлялся с Ajax-средствами из коробки. На самом деле это не технический недостаток, но из-за шумихи над Web 2.0 в этот период он стал функциональным недостатком. Exadel рано представила Ajax4jsf, которая была тщательно разработана в течение многих лет и стала основной частью библиотеки компонентов JBoss RichFaces . Другие библиотеки компонентов были также поставлены со встроенными возможностями Ajax, хорошо известной из которых является ICEfaces .

Примерно на полпути жизни JSF 1.2 была представлена ​​новая технология представления на основе XML: Facelets . Это дало огромные преимущества перед JSP, особенно в области шаблонов.

JSF 2.0 (июнь 2009 г.)

Это был второй крупный релиз с Ajax в качестве модного слова. Было много технических и функциональных изменений. JSP заменена Facelets в качестве технологии представления по умолчанию, а Facelets была расширена за счет возможности создания пользовательских компонентов с использованием чистого XML (так называемые составные компоненты ). См. Также Почему Facelets предпочтительнее, чем JSP, как язык определения представления, начиная с JSF2.0 и далее?

Возможности Ajax были введены во вкусе компонента <f:ajax>, который очень похож на Ajax4jsf. Аннотации и соглашения об изменении конфигурации были добавлены в kill подробный файл faces-config.xml в максимально возможной степени. Кроме того, стандартный символ разделителя идентификатора контейнера именования : стал настраиваемым, поэтому пуристы HTML / CSS могли дышать с облегчением. Все, что вам нужно сделать, это определить его как init-param в web.xml с именем javax.faces.SEPARATOR_CHAR и убедиться, что вы нигде не используете этот символ в идентификаторах клиента, например -.

И последнее, но не менее важное: была введена новая область действия, view scope. Это устранило еще один существенный недостаток JSF 1.x, как описано выше. Вы просто объявляете bean-компонент @ViewScoped, чтобы включить область диалога, не теряя при этом все способы сохранения данных в последующих (диалоговых) запросах. Бин @ViewScoped будет жить до тех пор, пока вы впоследствии отправляете и переходите к одному и тому же представлению (независимо от открытой вкладки / окна браузера!), Синхронно или асинхронно (Ajax). См. Также Разница между областью просмотра и запроса в управляемых компонентах и Как правильно выбрать область действия компонента?

Несмотря на то, что практически все недостатки JSF 1.x были устранены, есть ошибки, специфичные для JSF 2.0, которые могут стать недопустимыми. @ViewScoped завершается неудачно в обработчиках тегов из-за проблемы с куриным яйцом при частичном сохранении состояния. Это исправлено в JSF 2.2 и перенесено в Mojarra 2.1.18. Также передача пользовательских атрибутов, таких как HTML5 data-xxx, не поддерживается. Это исправлено в JSF 2.2 с помощью новой функции прохождения элементов / атрибутов. Кроме того, реализация JSF Mojarra имеет свой собственный набор проблем . Относительно многие из них связаны с иногда неинтуитивным поведением <ui:repeat>, новой реализацией частичного сохранения состояния и плохо реализованной областью флэш-памяти . Большинство из них исправлены в версии Mojarra 2.2.x.

Примерно во время JSF 2.0 было представлено PrimeFaces , основанное на пользовательском интерфейсе jQuery и jQuery. Это стало самой популярной библиотекой компонентов JSF.

JSF 2.2 (май 2013 г.)

С введением JSF 2.2 HTML5 использовался как модное слово, хотя технически это поддерживалось только во всех старых версиях JSF. См. Также Поддержка JavaServer Faces 2.2 и HTML5, почему XHTML все еще используется . Наиболее важной новой функцией JSF 2.2 является поддержка пользовательских атрибутов компонентов, открывая тем самым целый мир возможностей, таких как пользовательские группы бесключевых переключателей .

Помимо ошибок, связанных с реализацией, и некоторых «досадных мелочей», таких как невозможность внедрения EJB в валидатор / преобразователь (уже исправленный в JSF 2.3), в спецификации JSF 2.2 нет серьезных недостатков.

MVC на основе компонентов против MVC на основе запросов

Некоторые могут предпочесть, что основным недостатком JSF является то, что он позволяет очень мало детализированного контроля над сгенерированным HTML / CSS / JS. Это не принадлежит JSF, просто потому, что это основанная на компонентах * инфраструктура MVC, а не основанная на запросе (действии) платформа MVC. Если при рассмотрении фреймворка MVC вашим основным требованием является высокая степень контроля над HTML / CSS / JS, то вы уже должны смотреть не на фреймворк MVC на основе компонентов, а на фреймворк MVC на основе запросов, такой как Spring MVC . Вам нужно только принять во внимание, что вам придется писать все эти шаблоны HTML / CSS / JS самостоятельно. См. Также Разница между запросом MVC и компонентом MVC .

Смотри также:

54 голосов
/ 25 января 2014

После 5 лет работы с JSF я думаю, что могу добавить свои 2 цента.

Два основных JSF недостатка:

  1. Большая кривая обучения. JSF сложен, это просто правда.
  2. Его компонент природа. Компонентно-ориентированная структура пытается скрыть истинную природу сети, которая сопровождается огромным количеством осложнений и катастроф (например, отсутствие поддержки GET в JSF в течение почти 5 лет).
    ИМХО скрывать HTTP-запрос / ответ от разработчика - огромная ошибка. По моему опыту, каждая основанная на компонентах инфраструктура добавляет абстракцию к веб-разработке, и эта абстракция приводит к ненужным накладным расходам и более высокой сложности.

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

  1. По умолчанию идентификатор объекта состоит из идентификаторов его родителей, например form1: button1.
  2. Нет простого способа закомментировать неправильный фрагмент страницы. Тег <ui:remove> нуждается в синтаксически правильном контенте, который все равно анализируется.
  3. Компоненты низкого качества сторонних производителей, например, не проверяйте isRendered() внутри processXxx() метода, прежде чем продолжить.
  4. Включить LESS & Sencha сложно.
  5. Не очень хорошо с REST.
  6. Не так просто для дизайнеров UX, потому что готовые к использованию компоненты имеют свои собственные стили CSS, которые необходимо перезаписать.

Не поймите меня неправильно. Как фреймворк для компонентов JSF в версии 2 действительно хорош, но он все еще основан на компонентах и ​​всегда будет ...

Пожалуйста, обратите внимание на низкую популярность Tapestry, Wicket и низкий энтузиазм опытных разработчиков JSF (что еще более значимо). И для контраста взгляните на успех Rails, Grails, Django, Play! Framework - все они основаны на действиях и не пытаются прятаться от программиста истинный запрос / ответ и природа без состояния Интернета.

Для меня это главный недостаток JSF. IMHO JSF может подойти для некоторых типов приложений (интрасеть, интенсивные формы), но для реальных приложений web это не очень хороший способ.

Надеюсь, это поможет кому-то с его / ее выбором в отношении внешнего интерфейса.

24 голосов
/ 12 января 2011

Несколько недостатков, которые приходят на ум:

  1. JSF - это основанная на компонентах структура. Это имеет врожденные ограничения, которые связано с подчинением компонентная модель.
  2. AFAIK JSF поддерживает только POST, так что если вы хотите получить GET где-то у вас есть сделать простой сервлет / JSP.
  3. Большинство компонентов пытаются предоставить абстракции над доменами, такими как реляционные базы данных и интерфейс JavaScript, и много раз эти абстракции "дырявые" и их очень трудно отлаживать.
  4. Эти абстракции могут быть хорошей отправной точкой для начинающего разработчика или кого-то, кто не знаком с конкретным доменом (например, интерфейсный JavaScript), но его очень трудно оптимизировать для повышения производительности, поскольку задействовано несколько уровней, и большинство людей использующие их, мало понимают, что происходит под капотом.
  5. Механизмы шаблонов, которые обычно используются с JSF, не имеют ничего общего с работой веб-десигеров. WYSIWYG-редакторы для JSF примитивны, и в любом случае ваш дизайнер предоставит вам HTML / CSS, который вам придется потратить целую вечность на конвертацию.
  6. Такие вещи, как выражения EL, не проверяются статически, и компилятор, и IDE плохо справляются с поиском ошибок, так что вы получите ошибки, которые вам придется обнаруживать во время выполнения. Это может быть хорошо для динамически типизированного языка, такого как Ruby или PHP, но если мне нужно противостоять явному раздутию экосистемы Java, я требую печатать для своих шаблонов.

Подводя итог: Время, которое вы сэкономите с помощью JSF, от необходимости избегать написания шаблонного кода JSP / servlet / bean, потратит его в 10 раз, чтобы его масштабировать и делать именно то, что вы хотите это делать.

19 голосов
/ 19 сентября 2011

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

  • HTML в различных воплощениях.Не притворяйтесь, что вам не нужно это знать.
  • HTTP - когда вы не можете понять, что происходит, вы должны открыть Firebug и посмотреть.Для этого вам нужно знать это.
  • CSS - нравится вам это или нет.Это не так уж и плохо, и есть, по крайней мере, несколько хороших инструментов.
  • XML - JSF, вероятно, будет первым местом, где вы будете использовать пространства имен до такой степени.
  • Спецификация сервлета.Рано или поздно вы попадете в методы вызова в этом пакете.Кроме того, вы должны знать, как ваши Facelets превращаются в XHTML или что-то в этом роде.
  • JSP (в основном, чтобы вы знали, почему он вам не нужен в JSF)
  • JSTL (опять же, в основном* справиться с унаследованной платформой)
  • Язык выражений (EL) в его различных формах.
  • ECMAScript, JavaScript или как угодно, как вы хотите его называть.
  • JSON -Вы должны знать это, даже если вы не используете его.
  • AJAX.Я бы сказал, что JSF 2.0 неплохо скрывает это от вас, но вам все равно нужно знать, что происходит.
  • ДОМ.И как браузер использует это.См. ECMAScript.
  • DOM Events - сама по себе тема.
  • Java Persistence Architecture (JPA), которая предназначена для того, чтобы ваше приложение имело какую-либо внутреннюю базу данных.
  • Сама Java.
  • JSEE, пока вы в нем.
  • Спецификация внедрения зависимостей контекста (CDI) и как она конфликтует и используется с JSF 2.0
  • JQuery - мне бы хотелосьчтобы увидеть, как вы обходитесь без него.

Теперь, как только вы закончите с этим, вы можете приступить к проприетарным спецификациям, а именно к библиотекам компонентов и библиотекам провайдеров, которые вы подберете по пути:

  • PrimeFaces (моя любимая библиотека компонентов)
  • RichFaces
  • MyFaces
  • ICEFaces
  • EclipseLink (мой поставщик JPA)
  • Спящий режим
  • Сварка

И не забудьте контейнер!И все эти файлы конфигурации:

  • GlassFish (2, 3 и т. Д.)
  • JBoss
  • Tomcat

Итак - ЭТОДелать это легко?Несомненно, JSF 2.0 «прост», если все, что вам нужно, - это самые простые веб-страницы с простейшими взаимодействиями.

Проще говоря, JSF 2.0 - это самая сложная и громоздкая путаница склеенных технологий, которая существует сегодня во вселенной программного обеспечения.И я не могу придумать ничего, что я бы предпочел использовать.

13 голосов
/ 14 июня 2014
  1. Неопытные разработчики обычно создают приложения, которые мучительно медленны, а код будет очень уродливым и сложным в обслуживании. Его обманчиво просто начать, но на самом деле он требует определенных вложений в обучение, если вы хотите писать хорошие программы.
  2. По крайней мере, на старте вы часто «застряли» на какой-то проблеме и будете тратить больше времени на чтение сообщений в интернете, чем на работу :) Через некоторое время это будет все меньше и меньше, но это все еще может раздражать .
  3. Еще больше раздражает, когда вы обнаружите, что проблема не в том, что у вас нет знаний / ошибок, а на самом деле ошибка. Мохарра была (есть?) Довольно глючной, а другой слой компонентов добавляет еще больше проблем. Richfaces был самой большой частью программного обеспечения для дерьма, когда-либо написанного :) Не знаю, как сейчас на версии 4. У нас есть Primefaces, который лучше, но все же вы столкнетесь с ошибками или отсутствием функций, особенно с более экзотическими компонентами. И теперь вам нужно будет оплатить обновления Primefaces. Так что я бы сказал, что он глючит, но становится лучше, особенно после того, как версия 2.2 исправила некоторые проблемы со спецификацией. Фреймворк становится все более зрелым, но все еще далеким от совершенства (может быть, мои лица лучше?).
  4. Я не нахожу это особенно гибким. Часто, если вам нужно что-то очень индивидуальное и нет компонентов, которые это делают - это будет немного больно. Опять же, я говорю со средней точки зрения разработчика - с крайними сроками, краткими руководствами по чтению и поиском стекового потока, когда застряли, потому что нет времени, чтобы узнать, как это действительно работает :) Часто некоторые компоненты, кажется, имеют «почти» то, что вам нужно, но не совсем, и иногда вы можете потратить слишком много времени, чтобы заставить его делать то, что вы хотите :) Нужно быть осторожным в оценке, лучше ли создать свой собственный или мучить существующий компонент. На самом деле, если вы создаете что-то действительно уникальное, я бы не рекомендовал JSF.

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

Конечно, есть и преимущества, но это не то, что вы спросили. В любом случае, это мой опыт работы с фреймворком. У других могут быть разные мнения, так что лучший способ - просто попробовать его на некоторое время, чтобы увидеть, подходит ли он вам (просто что-то более сложное - не наивные примеры - JSF действительно блестит там :) JSF - это бизнес-приложения, такие как CRM и т. Д. *

11 голосов
/ 06 сентября 2010

"JSF выведет HTML и JavaScript уровня представления, которые вы не можете контролировать или изменять, не входя в код контроллера."

На самом деле JSF дает вам гибкость, вы можете использовать стандартные / сторонние компоненты или создавать свои собственные, которые вы имеете полный контроль над тем, что отображается. Это всего лишь один HTML-файл, необходимый для создания пользовательских компонентов в JSF 2.0.

10 голосов
/ 17 марта 2015

Я вообще не эксперт по Java Server Faces. Но ИМХО главный недостаток в том, что это серверная сторона. Я устал от изучения и использования серверных фреймворков уровня веб-презентации, таких как ASP.NET Web Forms, ASP.NET MVC, Java Server Faces, Struts, php-фреймы и ruby ​​на rails-фреймворках. Я попрощался со всеми ними и поздоровался с Angularjs и TypeScript. Мой уровень презентации работает в браузере. Мне не важно, обслуживается ли он Windows IIS под управлением php или ASP.NET или веб-сервер Apache под управлением Linux. Мне просто нужно изучить только один фреймворк, который работает везде.

Только мои два цента.

10 голосов
/ 30 апреля 2014

Мы разработали пример проекта с JSF (это было трехнедельное исследование, поэтому мы могли потерять некоторые вещи!)

Мы пытаемся использовать базовый jsf, если нужен компонент, мы использовали PrimeFaces.*

Проект представлял собой веб-сайт с навигацией.Каждая страница должна быть загружена через ajax при нажатии на меню.

На сайте есть два варианта использования:

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

Мы обнаружили, что:

  1. Вам нужно использовать некоторые хаки из omniFaces, чтобы сделать состояние просмотра JSF фиксированным.Состояние JSF будет повреждено, если вы включите страницы через ajax друг в друга.Это кажется ошибкой в ​​JSF и может быть исправлено в следующих выпусках (не в 2.3).
  2. Поток JSF не работает корректно с ajax (или мы не могли заставить его работать!) Мы пытаемся использовать Primeface Wizardкомпонент, но проверка клиента, кажется, не поддерживается и означает, что, хотя он не был стандартным стандартом потока JSF.
  3. Если вы используете некоторые компоненты jQuery, такие как jqGird, и вам нужно загрузить результаты JSON, тогда вам рекомендуется использовать чистый сервлет, JSF ничего не сделает для вас.Поэтому, если вы используете компоненты такого типа, ваш дизайн не будет соответствовать JSF.
  4. Мы пытаемся создать некоторые клиентские скрипты, когда ajax завершится к ajaxComplete, и мы обнаружили, что PF 4 реализовал свои собственные события ajax,У нас было несколько компонентов jQuery, и нам нужно изменить их код.

Если вы измените приведенный выше пример на проект non Ajax (или, по крайней мере, на меньше проект ajax), вы не будетесталкиваются с множеством вышеуказанных проблем.

Мы суммируем наше исследование следующим образом:

JSF не работает хорошо на полностью базовом веб-сайте ajax.

Конечнов JSF есть много полезных функций, которые могут быть очень полезны в некоторых проектах, поэтому примите во внимание потребности вашего проекта.

Пожалуйста, обратитесь к технической документации JSF для ознакомления с преимуществами JSF, и, на мой взгляд, самое большое преимущество JSF - это полная и огромная поддержка @BalusC; -)

6 голосов
/ 26 июля 2015

Комментируя мои последние несколько месяцев опыта работы с Primefaces / JSF:

  • Если вы можете использовать компоненты "с полки", я думаю, это не страшно.
  • Однако, он не очень хорошо играет, как только вы выходите на улицу и нуждаетесь в пользовательских интерфейсах.- Например, нам нужно было использовать загрузчик Twitter для нашего проекта.(Не простые начальные загрузки).
    • Теперь наши страницы работают следующим образом:
      • Загрузка страниц.
      • Пользователь взаимодействует с Primefaces, имеющим функциональность ajax
      • Прерывание привязки javascript Bootstrap
      • Мы запускаем дополнительный javascript для повторного связывания всего

Обещание JSF избежать написания javascript превратилось в написание большего количества javascript, чем было бы, если бы мы не использовали Primefaces - и этот javascript исправляет то, что ломается Primefaces.

Этоутечка времени - если только вы снова не используете "готовые" вещи.Также очень некрасиво (Primefaces), когда приходится работать с Selenium.Все это может быть сделано - но опять же - есть только так много времени.

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

6 голосов
/ 20 ноября 2011

Для меня самым большим недостатком JSF является плохая поддержка программно (динамически) сгенерированных страниц.
Если вы хотите динамически построить свою страницу (создать компонентную модель страницы) из кода Java.Например, если вы работаете над конструктором веб-страниц WYSIWYG.Адекватная документация по этому варианту использования не всегда доступна.Есть много точек, где вы должны экспериментировать, и разработка идет медленно.Многие вещи не работают так, как вы ожидаете.Но, как правило, его можно как-то взломать.
Хорошо, что это не проблема философии или архитектуры JSF.Это просто недостаточно проработано (насколько я знаю).

JSF 2 принес Композитные Компоненты, которые должны упростить разработку компонентов, но их поддержка динамического (программного) конструирования очень слабая.Если вы преодолеете сложный и почти недокументированный процесс создания динамического Composite Component, вы обнаружите, что если вы вложите несколько Composite компонентов немного глубже, они перестанут работать, выдав некоторые исключения.

Но, похоже, сообщество JSF знает об этих недостатках.Они работают над этим, как вы можете видеть из этих двух ошибок
http://java.net/jira/browse/JAVASERVERFACES-1309
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-599

С JSF 2.2 ситуация должна быть лучше, по крайней мере, если речь идет о спецификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...