metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-11-18 05:11 pm

Опердень и паттерн-матчинг.

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

И есть набор правил, согласно которым эта таблица раскладывается по статьям некоего выходного отчета который ложится на стол Президенту РБ, т.е. к примеру "все проводки с типом операции 126 относятся на статью затрат "Цех забоя и переработки свинины", за исключением проводок со счета 91, который относится на статью затрат "Цех забоя и переработки лошадей"". В таких правилах обычно проверяется где-то 5-10 условий на значения полей записи операции, самих правил может быть порядка сотни штук. И правила могут меняться, например в 2008 году переработка лошадей и свиней делилась на две статьи, а в 2009 министерство статистики решило, что достаточно одной статьи "забой любого скота", но обязательно детализированной по фазам луны.

И вот как бы вы такое решали?

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

PS: Здесь немного объяснено, что имеется в виду под "грехом собственного языка".

[identity profile] gds.livejournal.com 2009-11-18 05:35 pm (UTC)(link)
кстати, мы с верхним каментатором прикидывали, что нехуйово бы кодексы (особенно налоговый и уголовный) загнать в какую-нибудь декларативную хуйню. Ему надо было для корректности/отмазок вроде, а я думал и поабьюзить при случае, если чо.

[identity profile] kosiakk.livejournal.com 2009-11-18 05:36 pm (UTC)(link)
кто запретил?
собственно, вся идеология DSL как раз вокруг этого.

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

Запрещают изобретать "велосипеды", а не языки.
Это ж не sql и не язык общего назначения будет. DSL изобретать не то что можно, а скорее _приходится_, т.к. без этого вообще никак.

Как правило это т.н. embedded-DSL, которые шифруются под библиотеку, написаны на самом языке и даже самим автором не признаются как языки =) это dsl по факту.

[identity profile] metaclass.livejournal.com 2009-11-18 05:37 pm (UTC)(link)
О блина, это ж холокост.
Юристы, экономисты и знающие пролог будут нарасхват :)
И как только случай выходит за пределы правил - сразу его на решение высшим законодательным органам, а потом внос в базу :)

[identity profile] clayrat.livejournal.com 2009-11-18 05:39 pm (UTC)(link)
действительно, а почему доменспецифик язык стал вдруг грехом? вся лисповая идеология проектирования на том построена.

[identity profile] metaclass.livejournal.com 2009-11-18 05:39 pm (UTC)(link)
90% "готовых" языков и библиотек это такой ад, что лучше сразу писать что-нибудь свое, даже в лоб, на обычном языке - будет проще, чем встраивать какой-нибудь BPEL и воевать с ним.

[identity profile] metaclass.livejournal.com 2009-11-18 05:42 pm (UTC)(link)
Как почему? Вот представьте, приходите вы к менеджеру и говорите "ну вот тут нам надо собственный язык сделать". Он сразу говорит "пишите сука на яве и не выпендривайтесь, после вас это индусам и таджикам поддерживать". Тогда на следующий день вы приходите и говорите "вот я тут библиотеку для обработки правил сделал, настраиваемую". Менеджер радуется и говорит "ну вот, никаких собственных языков". А то что библиотека внутри себя лисп пополам с прологом, с исходниками хранящимися в базе данных - то никому не ведомо. Главное не упоминать слово "язык" :)

[identity profile] gds.livejournal.com 2009-11-18 05:46 pm (UTC)(link)
пока рассмотрят, пока внесут, пока вынесем, ну и не обязательно пролог сразу. Сходу -- даже не знаю, как такую сложную штуку можно рассматривать, чтобы выгодно было.

[identity profile] graynm.livejournal.com 2009-11-18 06:15 pm (UTC)(link)
+1
С файликами проще. Тупо первое что в голову приходит: не затирать старый, а класть его в выбранный каталог с именем составленным из даты начала применения. А при обработке по диапазону времени выбирать нужную версию или несколько, если на стык попали и юзать.

По крайней мере с перезаливкой SQL процедур версионность так просто не слепишь.

(Anonymous) 2009-11-18 07:00 pm (UTC)(link)
Наверное, можно было и по-русски. У человека, может, просто клавиатуры русифицированной под рукой нет. :)

[identity profile] metaclass.livejournal.com 2009-11-18 07:07 pm (UTC)(link)
А, а я думал, это так модно :)

[identity profile] sergiej.livejournal.com 2009-11-18 07:41 pm (UTC)(link)
Счас меня будут бить, возможно ногами, но я скажу эти слова XML+XSLT :)
А чтобы оптимально и на уровне базы то просто таблица правил выходного отчёта, в которой для каждой статьи выходного отчёта запись с источником и условиями, делов то :)

[identity profile] permea-kra.livejournal.com 2009-11-18 08:08 pm (UTC)(link)
Я бы взял ghc as lifrary, сваял бы модуль, точенный на нужные запросы и писал бы генератор отчёта на комбинаторах/функциях этого модуля. При этом есть библиотеки, парсящие хаскель, и оттуда можно проверить отсутствие левых импортов. А само приложение грузило бы и компилировало запрос в рантайме.

В вашем случае есть F#, который родственен окамлу и должен обеспечивать приемлимую степень изоляции и разумный набор правил.

[identity profile] yurri.livejournal.com 2009-11-18 08:20 pm (UTC)(link)
Реализовать обработку правил на WWF и редактировать потом только описательные XML-карты. Или вообще спихнуть это на MSSQL SSIS или даже BizTalk, если такой есть в инфраструктуре.

[identity profile] bigfrogg.livejournal.com 2009-11-18 08:38 pm (UTC)(link)
QtScript идеально ложится под эту задачу

[identity profile] metaclass.livejournal.com 2009-11-18 09:00 pm (UTC)(link)
Звучит привлекательно, за исключением того, что я не совсем понял, "куды здесь лошадь запрягать".
Мы встраиваем хаскель себе? Как мы с ним будем взаимодействовать - т.е. передавать ему данные и получать результат?

[identity profile] permea-kra.livejournal.com 2009-11-18 09:16 pm (UTC)(link)
Я пишу исключительно на хаскеле, так что для меня вопрос интеропа не стоит - программка в рантайме подцепит модуль, вытащит из него функцию про генерацию отчёта по имени и будет с ней работать (всё средствами http://hackage.haskell.org/package/hint). Поскольку вы пишете на .Net, то хаскель для вас отпадает, зато можно поискать аналогичной функциональности для F#. Посколькольку я краем уха слышал про REPL для него, есть мнение, что инструмент вроде hint должен быть.

[identity profile] alexey-rom.livejournal.com 2009-11-18 09:22 pm (UTC)(link)
Именно, он для таких задач идеален. Или rule engine.

[identity profile] metaclass.livejournal.com 2009-11-18 09:42 pm (UTC)(link)
Ну я бы все таки предпочел интероп с хаскелем, потому что опердень бухгалтерскую всякую я пишу на дельфи. А дотнет это на другой работе, там таких сложностей возникает меньше, потому что сложных отчетов вообще нет, там свои заморочки, типа статически типизированного описания состояний гуи с переходами между ними :)

[identity profile] theiced.livejournal.com 2009-11-18 09:45 pm (UTC)(link)
обработчик_говна_v1.scm
обработчик_говна_v2.scm
...

к энтитям которые обрабатываются привязываем версию данного обработчика. при создании новой энтити - тупо берём последнюю. не вижу проблем.

[identity profile] theiced.livejournal.com 2009-11-18 09:48 pm (UTC)(link)
а хрена. оно там противоречивое на каждом шагу. плюс возникает вопрос толкований. плюс кое что вообще не описано. плюс нету общей терминологии даже внутри одного документа. плюс оно писано умалишёнными пидорасами и нормальным человеком быть понято не может.

[identity profile] theiced.livejournal.com 2009-11-18 09:49 pm (UTC)(link)
гнусный овцеёб.

ну на кой хрен там xml и уродливо-ублюдочный xslt если есть кошерная схема например.

[identity profile] permea-kra.livejournal.com 2009-11-18 09:50 pm (UTC)(link)
FFI- это грустно. Может оказаться удобно перехватить сеанс ghci, возможно, чуток подрихтованный. (по такому принципу устроен emacs mode для Agda2). Благо какой-то интерфейс к базам у хаскеля есть, так что с базой он в случае чего сможет работать самостоятельно, тогда морде останется только gui.

[identity profile] theiced.livejournal.com 2009-11-18 09:52 pm (UTC)(link)
будет сложно (в итоге кончим набором процедур обработка_говна_vXYZ ибо нужны они все). при этом модифицировать их сложнее - ибо где база, там ебанутый на всю голову дба.

[identity profile] permea-kra.livejournal.com 2009-11-18 10:09 pm (UTC)(link)
К слову, тут выше XML+XSLT предлагали, я такого делать не буду, но предлагаю посмотреть на два XQuery-движка - xqills и qt-шный. Если я правильно помню, им можно подсунуть кастомную реализацию DOM'а. Тогда можно будет писать запросы на XQuery, а он всё-же достаточно удобен.

Page 2 of 3