Какой смысл DSLs / быстрые интерфейсы

Слово предупреждения: если вы поместите файлы конфигурации в папку WEB-INF/classes, а ваша среда IDE, скажем, Eclipse, выполняет очистку / перестройку, она будет уничтожать ваши файлы conf, если они не были в исходном каталоге Java. Большой ответ BalusC намекает на то, что в варианте 1, но я хотел добавить акцент.

Я усвоил, что если вы «скопируете» веб-проект в Eclipse, он очистит / перестроит из любых исходных папок , В моем случае я добавил «связанный исходный каталог» из нашей Java-библиотеки POJO, он будет скомпилирован в папку WEB-INF/classes. Выполнение чистых / перестроек в этом проекте (а не в проекте веб-приложений) вызвало ту же проблему.

Я думал о том, чтобы поместить мои confs в папку POJO src, но эти confs - все для сторонних библиотек (например, Quartz или URLRewrite), которые находятся в папке WEB-INF/lib, так что это не имеет смысла , Я планирую протестировать его размещение в папке «src» веб-проектов, когда я обхожусь к нему, но эта папка в настоящее время пуста, и в ней есть файлы conf, которые выглядят inelegant.

Итак, я голосую за то, в WEB-INF/commonConfFolder/filename.properties, next в папку классов, которая является параметром Balus 2.

26
задан M4N 21 April 2009 в 09:40
поделиться

5 ответов

2 - этот быстрый интерфейсный подход является просто заменой для не существующих именованных параметров метода в C#? Был бы названные параметры делать быстрые интерфейсы устаревшими, например, что-то подобные объективные-C предложения:

Хорошо да и нет. Быстрый интерфейс дает Вам большее количество гибкости. Что-то, что не могло быть достигнуто с именованными параметрическими усилителями:

sizer.FromImage(i)
 .ReduceByPercent(x)
 .Pixalize()
 .ReduceByPercent(x)
 .OutputImageFormat(ImageFormat.Jpeg)
 .ToLocation(o)
 .Save();

FromImage, ToLocation и OutputImageFormat в жидком интерфейсе, пахнут немного мне. Вместо этого я сделал бы что-то вдоль этих строк, которые я думаю, намного более ясно.

 new Sizer("bob.jpeg") 
 .ReduceByPercent(x)
 .Pixalize()
 .ReduceByPercent(x)
 .Save("file.jpeg",ImageFormat.Jpeg);

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

var sb = new StringBuilder(); 
sb.AppendLine("Hello")
 .AppendLine("World"); 
13
ответ дан Sam Saffron 25 September 2019 в 07:54
поделиться

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

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

Ваш пример немного походит на излишество.

я в последнее время сделал некоторый быстрый интерфейс сверху SplitterContainer от Windows Forms. Возможно, семантическая модель иерархии средств управления несколько сложна для корректного построения. Путем обеспечения маленькому быстрому API разработчик может теперь декларативно выразить, как его SplitterContainer должен работать. Использование идет как

var s = new SplitBoxSetup();
s.AddVerticalSplit()
 .PanelOne().PlaceControl(()=> new Label())
 .PanelTwo()
 .AddHorizontalSplit()
 .PanelOne().PlaceControl(()=> new Label())
 .PanelTwo().PlaceControl(()=> new Panel());
form.Controls.Add(s.TopControl);

, я теперь уменьшил сложную механику иерархии управления к нескольким глаголам, которые важны для текущего вопроса.

Hope это помогает

8
ответ дан M4N 25 September 2019 в 07:54
поделиться

Рассмотрите:

sizer.ResizeImage(inputImage, outputImage, 0.5, ImageFormat.Jpeg);

, Что, если Вы использовали менее ясные имена переменной:

sizer.ResizeImage(i, o, x, ImageFormat.Jpeg);

Предполагают, что Вы распечатали этот код. Более трудно вывести, каковы эти аргументы, поскольку у Вас нет доступа к сигнатуре метода.

С быстрым интерфейсом, это более ясно:

 sizer.FromImage(i)
 .ToLocation(o)
 .ReduceByPercent(x)
 .OutputImageFormat(ImageFormat.Jpeg)
 .Save();

кроме того, порядок методов не важен. Это эквивалентно:

 sizer.FromImage(i)
 .ReduceByPercent(x)
 .OutputImageFormat(ImageFormat.Jpeg)
 .ToLocation(o)
 .Save();

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

 sizer.FromImage(i)
 .ToLocation(o)
 .Save();

Это потребовало бы, чтобы перегруженные конструкторы достигли того же эффекта.

6
ответ дан toolkit 25 September 2019 в 07:54
поделиться

Это - один способ реализовать вещи.

Для объектов, которые действительно только управляют тем же объектом много раз, нет ничего действительно неправильно с ним. Рассмотрите Потоки C++: они - окончательное в этом интерфейсе. Каждая операция возвращает поток снова, таким образом, можно объединить в цепочку вместе другую операцию с потоками.

, Если Вы делаете LINQ и делаете управление объектом много раз, это имеет некоторый смысл.

Однако в Вашем дизайне, необходимо быть осторожными. Чем должно состоять в том поведение, если Вы хотите отклониться на полпути через? (IE,

var obj1 = object.Shrink(0.50); // obj1 is now 50% of obj2
var obj2 = object.Shrink(0.75); // is ojb2 now 75% of ojb1 or is it 75% of the original?

, Если obj2 составлял 75% исходного объекта, то это означает создание полной копии объекта каждым разом, когда (и имеет его преимущества во многих случаях, как то, при попытке сделать два экземпляра того же самого, но немного по-другому).

, Если методы просто управляют исходным объектом, то этот вид синтаксиса несколько лицемерен. Это - манипуляции на объекте вместо манипуляций для создания измененного объекта.

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

2
ответ дан Robert P 25 September 2019 в 07:54
поделиться

Необходимо читать Domain Driven Design Eric Evans для получения некоторое представление, почему DSL считают хорошим проектным решением.

Книга полна хороших примеров, советов лучшей практики и шаблонов разработки.Очень рекомендуем.

2
ответ дан zendar 28 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: