WF, WCF и Декларативные сервисы (или:Что Microsoft подразумевает под “декларативным”?)

StackOverflow https://stackoverflow.com/questions/1187713

Вопрос

Я создал это сообщество Wiki, потому что некоторые могут подумать, что оно открыто для обсуждения, а другие могут подумать, что это вопрос использования слов для обозначения того, что они на самом деле означают (другими словами, это вопрос мнения, является ли это вопросом мнения).

Там есть общий вопрос по SO о декларативном программировании, в котором есть несколько отличных ответов.

Но я немного сбит с толку это сообщение в блоге от евангелиста Microsoft.

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

Пока все так хорошо - на самом деле это точно согласуется с общепринятым ответом на вопрос SO.

Но тогда ознакомьтесь с частью о "Внедрении сервиса".,

Вы можете просто просмотреть несколько десятков строк xaml -кода и быть в состоянии определить, как настроена служба WCF и как определен соответствующий рабочий процесс.

Рассмотрев несколько примеров, позвольте мне кратко ответить на это, сказав: "Нет, я не могу".Но вместо того, чтобы легкомысленно отмахиваться от всего этого, давайте посмотрите документы.

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

Загадка для меня заключается в том, что утверждается, что это "декларативно".И все же ядром этого является оператор присваивания.

Здесь есть еще кое-что:

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

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

Примером на этой странице является:

<wma:Sequence>
    <wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' />
    <wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" />
</wma:Sequence>

Иными словами, все это (включая тонну мусора, который я вырезал из примера WF) в точности эквивалентно:

void Add(int op1, int op2, out int result1)
{
    Console.WriteLine("Add(" + op1 + ", " + op2 + ") called");
    result1 = op1 + op2;
}

Итак - блок инструкций, выполняемых в том порядке, в котором они появляются, и имеющих побочные эффекты.Конечно, существуют элементы действия рабочего процесса для выполнения цикла (и вы можете написать свои собственные действия, если в WF еще нет вашего любимого императивного утверждения).По-видимому, "переписывание вашего кода в нечитаемый формат" - это то же самое, что "добавление уровня абстракции".

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

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

Итак, делает ли написание чего-либо в XML это декларативным (а также менее читабельным)?

Это было полезно?

Решение

Еще одно подтверждение того, что использование XML в возможностях, отличных от формата exchange, отнимает много времени.

"Определения" сервисов в WCF были декларативными с самого первого дня.Однако, отделяя определения интерфейса от определений сервисов (под этим я подразумеваю ServiceContractAttribute и др.) - это, ИМО, хорошая вещь.Однако использование XML в качестве языка программирования действительно отстой.

Лично я испытываю вполне объяснимые приступы чистого ужаса, когда смотрю на эти XML-документы.

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

Существует часть Windows Workflow Foundation, которая мало обсуждается (за пределами Microsoft), которая может прояснить это для вас.

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

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

Декларативный рабочий процесс (или служба) будет описывать, как объединить доступные вам действия, связанные с конкретной проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top