Date: 2014-11-12 08:52 am (UTC)
From: [identity profile] jakobz.livejournal.com
Из десятка проектов на дотнете, я видел только один активно использующий XML как DSL - там вьюшки собирались в страницы из компонент. Ну и WPF еще бывает, да, но я не трогал.

Короче половина проекта на XML - это вроде больше про яву.

И лиспы как DSL для дотнета - в топку. Они не типизированы, и это в реалиях энтерпрайза - жопа. Такая же точно как XML - только букв меньше, код загадочнее, и поддержки IDE нет. В дотнете есть средства делать eDSL и метапрограммировать не убирая типизацию - вот ими и надо пользоваться.

Date: 2014-11-12 08:01 pm (UTC)
From: [identity profile] love5an.livejournal.com
>В дотнете есть средства делать eDSL и метапрограммировать не убирая типизацию - вот ими и надо пользоваться.

Какие это такие "типизированные" мегасредства для eDSL и метапрограммировать есть в дотнете, и почему я, разработчик с минимум 7-летним опытом в дотнете, чуть ли не наизусть знающий мельчайшие его детали с версии 2, о них не знаю?

Date: 2014-11-12 08:14 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Objects/array literals, fluent interfaces, LINQ, expression trees, аттрибуты, рефлекшн, генерация MSIL налету, интроспекция и изменение сборок через post sharp и т.п., и т.д. А еще Roslyn выходит, и есть F# давно, так что вообще грех жаловаться.

Типа вот из кода:
            Entity<Program>()                
                .PropagateChangesTo<EventInstance>(
                    getId: (db, p) => db.EventInstances.Where(e => e.ProgramId == p.Id).Select(e => (int?)e.Id).FirstOrDefault(), 
                    condition: p => p.IsSingleEvent
                )
                .HideField(p => p.IsSingleEvent)
                .HideField(p => p.Responsible)
                .Field(t => t.Comments, c => c.DoNotLogValues())
                .AffectUnit(p => p.OrgUnitId, RelatedEntityRole.EventSupervisor)
                .AffectUser(p => p.Created.By, RelatedEntityRole.EventOrganizer)
                .AffectUser(p => p.ResponsibleId, RelatedEntityRole.EventOrganizer);


Или вот Sprache:
Parser<string> identifier =
    from leading in Parse.WhiteSpace.Many()
    from first in Parse.Letter.Once()
    from rest in Parse.LetterOrDigit.Many()
    from trailing in Parse.WhiteSpace.Many()
    select new string(first.Concat(rest).ToArray());


Супротив аналогичной XML-ки или лиспа - оно тайпчекается и держит рефакторинг.

Я бы не сказал что у какого-нибудь хаскеля инструментов для того же самого сильно больше. Лаконичнее и прямее - это да, но качественно там примерно тоже самое.
Edited Date: 2014-11-12 08:16 pm (UTC)

Date: 2014-11-12 08:40 pm (UTC)
From: [identity profile] love5an.livejournal.com
Ээээ

>Objects/array literals
Средство метапрограммирование? Шта?

>fluent interfaces
Туда же

>LINQ
LINQ, и его Expression trees - крайне ограниченная вещь. Это API работы с коллекциями и реляционными запросами. Максимум что из нее можно было выжать это Rx. Но сам по себе LINQ и его реализации это не метапрограммирование вообще никаких боком, это обычное функцональное API. Монада, если угодно.

>Expression trees,
Expression trees - самое интересное и хоть сколько-то относящееся к метапрограммированию из перечисленного. Фактически это урезанное AST C#. Типизация тут вообще никоим боком, на самом деле, потому что самая важная и крутая фича этого API это динамическая генерация и обработка кода на C#. Но по сравнению с возможностями современных реализаций лиспа, Expression Trees это просто детский сад. А еще - ты ими в продакшне пользовался хоть раз то? Я вот регулярно. И могу сказать - по сравнению с лиспами - они сложны и использовании, ограничены, и намноого менее юзабельны, чем встроенные инструменты самого простейшего даже лиспа, типа емаксового.

Далее
>аттрибуты, рефлекшн, генерация MSIL налету, интроспекция
Это все как раз мной в том числе активно используется(чем кстати интроспекция от рефлекшн отличается ггг?), но по сравнению с инструментами лиспа того же, это все крайне убого, громоздко и отвратительно, это во-первых, а во-вторых, опять же - ни в коем случае не типизировано. Используя эти инструменты, программист на C# или любом другом языке .NET фактически переизобретает лисп-систему через жопу, а даже скорее не лисп-систему, а недо-питон какой-нибудь.

>и изменение сборок через post sharp
PostSharp вот это уже ближе, но это настолько через жопу достигается(и кстати платно), что Типизированным Достоинством Дотнета я бы это не назвал даже в бреду.

>А еще Roslyn выходит
Roslyn еще не вышел, но мне тоже интересно, что еще MS утащит из лиспа в очередной раз.

>и есть F# давно
F# к метапрограммирования никоим боком.

Date: 2014-11-12 08:45 pm (UTC)
From: [identity profile] jakobz.livejournal.com
А приведи пример что ты хочешь делать на лиспе в контексте метапрограммирования дотнета?

Date: 2014-11-12 08:53 pm (UTC)
From: [identity profile] love5an.livejournal.com
Собственно там в постинге было.

Максимально декларативно описывать модель данных, генерировать ее из этого описания, вдобавок к этому декларативно описывать модель джойнов данных, и метаданные свойств(полей классов), для гридов и вообще любых UI-контролов, и опять же, генерировать гриды и контролы из этого. Плюс к этому, декларативным и внятным DSL-ем описать модель воркфлоу бизнес-логики и разнообразные валидаторы и функции перехода состояний объектов и комбинаций состояний объектов.

Отчасти это у меня в текущем проекте делается. Естественно, через рефлекшн и подобное, с описаниями в XML. Но выглядит это, хм ... Ну хотя, намного лучше и(особенно) компактнее и яснее, чем тупым хардкодом на C#, с типизацией и прочим.

Date: 2014-11-12 09:30 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Все это делается без всяких XML, на голом C# - указанными выше средствами. "Тупой хардкод" - плохой аргумент за использование XML для этой цели. Я не вижу ни одного плюса у XML относительно C#.

Классы модели данных можно генерировать из одной сборки в другую. Я вот генерирую typescript, например. Но не вижу препятствий зафигачить eDSL-код для конфигурации модели данных в отдельной сборке, и генерить из этой сборки C# классы для всего остального.

Метаданные навешиваются аттрибутами и fluent-интерфейсами. В отличии от XML имеется возможность втыкать в метаданные логику, например .Condition(s => s == Sex.Male).

Стейт-машины, бизнес-процессы, валидация, и прочее - тоже вполне себе нормально делается.

Да, eDSL на C#, да и вообще любые eDSL проиграют по прямоте правильно сделанным DSL отдельным.

Но лисп - это тоже ведь нифига не правильно сделанный DSL. Это general-purpose-язык, со своим мешком проблем, который ты хочешь как-то хостить в дотнете, и на котором ты планируешь делать eDSL.

Если писать вообще всё на какой-нибудь там кложури - такое можно. Но нужно понимать что никакой серебрянной пули от этого не случится.

Date: 2014-11-12 09:44 pm (UTC)
From: [identity profile] love5an.livejournal.com
>В отличии от XML имеется возможность втыкать в метаданные логику, например .Condition(s => s == Sex.Male).

Ээээ. В XML ты вообще-то можешь втыкать вообще всё, что придумаешь. XML это просто язык разметки.

>Стейт-машины, бизнес-процессы, валидация, и прочее - тоже вполне себе нормально делается.

Нет. У нас была недоделанная стейт-машина на аттрибутах. Я выкинул, за 2 дня написал с XML.
Аттрибуты остались для валидации переходов стейтов. Но это тоже надо выкинуть в XML, по идее. Потому что это банально меньше кода, потому что проще, потому что код яснее выглядит, итд. На C# DSL тупо не сделать нормально. XML позволяет хоть какое-то подобие.

>Но лисп - это тоже ведь нифига не правильно сделанный DSL. Это general-purpose-язык, со своим мешком проблем, который ты хочешь как-то хостить в дотнете, и на котором ты планируешь делать eDSL.

Как старый лиспер, авторитетно заявляю: Лисп это не то что не DSL, лисп это вообще не язык программирования. Это метаязыковая среда.


Про другое потом отвечу, сейчас лень.

Date: 2014-11-12 10:03 pm (UTC)
From: [identity profile] jakobz.livejournal.com
XML - нормальный язык разметки документов. При этом XML - плохой хост для eDSL. Он даже как формат сериализации плох.

Не надо стейт-машину делать на аттрибутах. Надо делать что-нибудь, например, такое:

Transition(
  from: State.Draft,
  to: State.Published, 
  verb: "Publish"
)
.Precondition((entity, context) => context.User.IsManager(), description: "You must be a manager to publish entities")
.Precondition((entity, context) => entity.IsValid(), description: "All fields should be specified correctly to publish entity")
.SideEffect(entity => new AddToNewsFeed(entity.ID);
.PostTransitionTask(entity => new SendPublishNotificationTask(entity.ID));
...
Edited Date: 2014-11-12 10:03 pm (UTC)

Date: 2014-11-12 10:13 pm (UTC)
From: [identity profile] love5an.livejournal.com
>XML - нормальный язык разметки документов. При этом XML - плохой хост для eDSL. Он даже как формат сериализации плох.

Ну какой есть. Привыкли. Хотя я бы все на S-выражениях делал.

>
Transition(
from: State.Draft,
to: State.Published,
verb: "Publish"
)
.Precondition((entity, context) => context.User.IsManager(), description: "You must be a manager to publish entities")
.Precondition((entity, context) => entity.IsValid(), description: "All fields should be specified correctly to publish entity")
.SideEffect(entity => new AddToNewsFeed(entity.ID);
.PostTransitionTask(entity => new SendPublishNotificationTask(entity.ID));

Кошмар. Вот у меня это описывается в 2 строки в XML абсолютно декларативно, без всякого там "entity, context => ..." и прочего, плюс 1 аттрибут в 15 символов считая квадратные скобки, плюс две стринги, локализируемые ресурсы.

Date: 2014-11-12 10:15 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Я не верю что тоже самое ты опишешь в две строчки. Именно с той же семантикой - с ограничением на переходы (кто имеет право, в каком состоянии должен быть объект), со всякими побочными эффектами и прочим.

Можешь хотя-бы показать как у тебя будет в XML-е выглядеть аналог (entity, context) => context.User.IsManager() ?

Date: 2014-11-12 10:34 pm (UTC)
From: [identity profile] love5an.livejournal.com
в личку скину, бо NDA

Date: 2014-11-12 10:35 pm (UTC)
From: [identity profile] love5an.livejournal.com
юзеры у меня кстати вооще хендлятся динамическими переменными по типу CL

Date: 2014-11-12 09:26 am (UTC)
From: [identity profile] enternet.livejournal.com
> высокоуровневый интерпретатор XML чтобы он нам генирировал наш XML из декларативного описания другим XML

XSLT же. Приловчившись, можно даже превращать один xslt-шаблон в другой при помощи третьего или самого себя. И только потом натравливать на xml )))

Но в целом, язык тут не важен. Конфигурирование всего - это ловушка. Один раз в неё попал, и всё, обратной дороги нет. Компиляция возможна только на лету. Отладка превращается в ад. Тестирование занимает гораздо больше времени. Сопровождение тоже. Ну и в дополнение обычно идет исключительно уродский UI. Короче, highway to hell. Уж сколько я таких наработок видел.

Date: 2014-11-12 08:21 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Надо просто воспринимать это не как разработку "гибкой системы конфигурации", а как разработку нового языка. Тогда всё встает на свои места.

Date: 2014-11-21 10:24 am (UTC)
From: [identity profile] dr-vlat.livejournal.com
Я таким образом игрушки пишу для portable устройств.
Все что можно вынесено в XML. Сишный код по сути только двигло.

Profile

love5an: (Default)
Dmitry Ignatiev

December 2016

S M T W T F S
    123
45678910
11121314 151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 23rd, 2017 03:42 am
Powered by Dreamwidth Studios