Опердень и паттерн-матчинг.
А поимею-ка я вам мозг классической задачкой из любой опердени.
Дано: в базе данных есть таблица фактов (проводки, платежи, вообще любые первичные операции). В таблице обычно имеется дата-время операции, сумма, и куча полей с аналитическими кодами (от кого, кому, дебет-кредит, тип операции, итд).
И есть набор правил, согласно которым эта таблица раскладывается по статьям некоего выходного отчетакоторый ложится на стол Президенту РБ, т.е. к примеру "все проводки с типом операции 126 относятся на статью затрат "Цех забоя и переработки свинины", за исключением проводок со счета 91, который относится на статью затрат "Цех забоя и переработки лошадей"". В таких правилах обычно проверяется где-то 5-10 условий на значения полей записи операции, самих правил может быть порядка сотни штук. И правила могут меняться, например в 2008 году переработка лошадей и свиней делилась на две статьи, а в 2009 министерство статистики решило, что достаточно одной статьи "забой любого скота", но обязательно детализированной по фазам луны.
И вот как бы вы такое решали?
Анализ этого дела в коде выглядит как паттерн-матчинг, реализованный вручную. Но в код это пихать как бэ нехорошо - потому что при изменениях правил придется менять код. А если хранить правила в таблице, получается что мы впадаем в грех реализации собственного языка правил и его обработки.
PS: Здесь немного объяснено, что имеется в виду под "грехом собственного языка".
Дано: в базе данных есть таблица фактов (проводки, платежи, вообще любые первичные операции). В таблице обычно имеется дата-время операции, сумма, и куча полей с аналитическими кодами (от кого, кому, дебет-кредит, тип операции, итд).
И есть набор правил, согласно которым эта таблица раскладывается по статьям некоего выходного отчета
И вот как бы вы такое решали?
Анализ этого дела в коде выглядит как паттерн-матчинг, реализованный вручную. Но в код это пихать как бэ нехорошо - потому что при изменениях правил придется менять код. А если хранить правила в таблице, получается что мы впадаем в грех реализации собственного языка правил и его обработки.
PS: Здесь немного объяснено, что имеется в виду под "грехом собственного языка".
no subject
result ::= [db.table.field | sql]
— через запятую, например.
(no subject)
(no subject)
(no subject)
(no subject)
(Anonymous) - 2009-11-18 16:17 (UTC) - Expand(no subject)
(no subject)
(no subject)
(Anonymous) - 2009-11-18 19:00 (UTC) - Expand(no subject)
(no subject)
(no subject)
(Anonymous) - 2009-11-19 14:52 (UTC) - Expandno subject
А в generic-решениях "через данные" есть проблема: они постоянно оказываются недостаточно generic. Код править придётся по-любому, как минимум для дополнения, а скорее всего и для исправления багов в обработке данных, представляющих собой алгоритм матчинга.
Ещё один момент, не совсем в тему.
"все проводки с типом операции 126 относятся на статью затрат "Цех забоя и переработки свинины", за исключением проводок со счета 91, который относится на статью затрат "Цех забоя и переработки лошадей""
Если это просто пример, то забьём. Иначе же я бы обязательно вытащил "цех" в атрибуты первичного документа, и (определял бы | разрешал бы выбирать) бух.счёт на основании цеха.
no subject
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Наверняка для С# тоже что-то подобное есть
(no subject)
(Anonymous) - 2009-11-18 16:18 (UTC) - Expandno subject
(no subject)
(Anonymous) - 2009-11-18 16:19 (UTC) - Expand(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
no subject
я бы сделал DSL для удобного написания правил, а потом бы по этим правилам генерил бы, например, SQL-скрипты.
DSL очень удобно делать в Jetbrains MPS, т.к. там шикарнейший редактор и правильная структура.
А за полсотни строк кода можно получить автокомплит нужной части структуры БД (даже с подсказкой-описанием), вытаскивая её по jdbc. Ну или просо руками захардкодить, если она часто не меняется.
А на выходе из правил получать что угодно. Хоть java-код, хоть sql, хоть низкоуровневый DSL для Drools, хоть код для кастомной системы отчётов и уже его выполнять.
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
где-нибудь внутри интерпретатора языка будет паттерн-матчинг...
(no subject)
no subject
(no subject)
(no subject)
no subject
А чтобы оптимально и на уровне базы то просто таблица правил выходного отчёта, в которой для каждой статьи выходного отчёта запись с источником и условиями, делов то :)
(no subject)
(no subject)
no subject
В вашем случае есть F#, который родственен окамлу и должен обеспечивать приемлимую степень изоляции и разумный набор правил.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
(no subject)
no subject
вообще говоря, это где-то рядом с грехом. но, чото, реальноприменимых альтернатив не видно.