Pull to refresh

Comments 10

Не уверен, что это DSL. Помоему, это pattern Builder, сам балуюсь постоянно.
Я бы сказал, что это DSL примененный к паттерну билдер
Не совсем понятна задача. То что в XML невозможно описать с помощью XSD? Если возможно, почему нельзя использовать JAXB?
Xml в данном случае не формат передачи данных, а просто их представление, удобное для объяснения. Форматом является c++ объект, доступ к которому осуществляется через jni. Этот объект допускает инициализацию через xml, но она менее эффкутивна, чем прямой jni доступ для продакшна.

С другой стороны, этот билдер я использовал в тестах, так что вопрос производительности не стоял, но альтернативы с jaxb было бы
* добавить xsd (отсутствует, тк xml побочный продуктов, как human readable представление c++ структуры)
* сгенерировать java класс
* в итоге все равно нужен dsl для создания инстанса этого класса

Надеюсь это отвечает на вопрос
Идея fluent interface в том, что API представляет собой некоторое подмножество домен-ориентированного языка описания.

Вообще-то, нет. Fluent interface — это просто специфический вид API (не всегда бизнес-ориентированный), для которого характерно очень агрессивное использование method chaining, где каждый метод не обязательно выполняет независимую функцию, а может быть уточнением или расширением предыдущего вызова.
Я безусловно соглсаен, что это вид API. Но мне кажется, что не стоит зацикливаться на method chaining — в том, что я отношу к fluent interface, применяются разные техники, которые все вместе помогают сформировать эту самую fluency за счет образования DSL.

Вот, навскидку, пример из статьи Фаулера, ссылающийся на JMock (который для меня является одним из родоначальников техники):
mock.expects(once()).method("m").with( or(stringContains("hello"), stringContains("howdy")) );
В примере из Фаулера тот же method chaining, что вы им пытаетесь доказать?

в том, что я отношу к fluent interface

Я как раз про это и говорю: что ваше понимание fluent interface отличается от общего.
В примере из фаулера я хотел обратить внимание на конструкцию
or(stringContains("hello"), stringContains("howdy"))

без которой интерфейс был бы не таким удобным. Прощу прощения, что не сделал это достаточно явно.

> Я как раз про это и говорю: что ваше понимание fluent interface отличается от общего.
Вполне допускаю. Более того уверен, что есть люди, которые не делают различия между method chaining и fluent interface. Я считаю более удобным их раделять: первое это технический прием организации кода (который может привести к удобочитаемому интерфейсу, а может и нет), а второе использование dsl в интерфейсе.

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

… которая в современных FI давно превратилась в with(a().or.b()) (например, во Fluent Assertions). Все развивается.

а второе использование dsl в интерфейсе

Не всякое использование DSL в интерфейсе является Fluent Interface. Можно построить интерфейс (API), который будет DSL, но не будет FI. Хотя, конечно, в языках типа Java и C# это сделать сложно.

Fluent, как следует из названия — это весьма специфический вид DSL, близкий к многословной речи. Он избыточен (это в данном случае достоинство).
Sign up to leave a comment.

Articles