Feb. 6th, 2008
(no subject)
Feb. 6th, 2008 06:12 pmПрограмма должна делать то, что ей сказали. И это должно прописываться достаточно прямо. Все автомагические "угадывания", что хотел сказать программист следует немедленно отправлять на помойку. В том числе, автоматическую разрешалку конфликтов в гениальных Drools.
Даже если детально знаешь, как авторазрешалка конфликтов работает, всё равно можно проколоться в какой-нибудь редкой ситуации, о которой не задумался вначале. От этого совершенно никто не застрахован. Вот я казалось бы человек с весьма богатым опытом построения interlinked-систем и намётаным на дедлоки/конфликты глазом, а всё-равно написал стратегию поведения, в которой была дыра. И нашел только благодаря тому, что мне не лень было верифицировать эту хрень математически.
Дыра была связана с тем, что для авторазрешения конфликов применялся приоритет правил. Казалось бы, правило А важнее правила Б, поставим ему выше приоритет и всё. Но не всё так просто. Снижение приоритета правилу Б потянуло за собой третье правило В и возник перекос, который приводил к тому, что в определённой редкой ситуации самое важное правило А не срабатывало вообще. Что делать?
А делать вот что:
- В менее важном правиле Б следует писать ... «and not А». В случае применения автоордеринга это автоматически повлечёт выполнение правила два вначале, а если это невозможно, позволит найти deadlock в компайл-тайме.
- Ситуацию, когда верны оба, при необходимости разрулить руками. (Т.е. отдельным правилом)
Как избегать таких проблем принципиально:
- Принципиально запретить использование приоритетов и других непрозрачных механизмов, влияющих на принятие решений.
- Анализировать правила статическими методами в компайл-тайме, может ли возникнуть конфликт и сообщать об этом программисту.
Да, да, это в общем случае неразрешимая задача, но нас нифига не интересует общий случай, нас интересуют частные, в 95% которых это детектируется моментально. (потому что в 95% случаев система правил имеет структуру близкую к древовидной) В оставшихся пяти процентах случаев выдавать вместо ошибки предупреждение, что «система правил слишком сложна и мы ничего не гарантируем. Попытайтесь переписать попрозрачнее, и всем от этого будет польза».
Даже если детально знаешь, как авторазрешалка конфликтов работает, всё равно можно проколоться в какой-нибудь редкой ситуации, о которой не задумался вначале. От этого совершенно никто не застрахован. Вот я казалось бы человек с весьма богатым опытом построения interlinked-систем и намётаным на дедлоки/конфликты глазом, а всё-равно написал стратегию поведения, в которой была дыра. И нашел только благодаря тому, что мне не лень было верифицировать эту хрень математически.
Дыра была связана с тем, что для авторазрешения конфликов применялся приоритет правил. Казалось бы, правило А важнее правила Б, поставим ему выше приоритет и всё. Но не всё так просто. Снижение приоритета правилу Б потянуло за собой третье правило В и возник перекос, который приводил к тому, что в определённой редкой ситуации самое важное правило А не срабатывало вообще. Что делать?
А делать вот что:
- В менее важном правиле Б следует писать ... «and not А». В случае применения автоордеринга это автоматически повлечёт выполнение правила два вначале, а если это невозможно, позволит найти deadlock в компайл-тайме.
- Ситуацию, когда верны оба, при необходимости разрулить руками. (Т.е. отдельным правилом)
Как избегать таких проблем принципиально:
- Принципиально запретить использование приоритетов и других непрозрачных механизмов, влияющих на принятие решений.
- Анализировать правила статическими методами в компайл-тайме, может ли возникнуть конфликт и сообщать об этом программисту.
Да, да, это в общем случае неразрешимая задача, но нас нифига не интересует общий случай, нас интересуют частные, в 95% которых это детектируется моментально. (потому что в 95% случаев система правил имеет структуру близкую к древовидной) В оставшихся пяти процентах случаев выдавать вместо ошибки предупреждение, что «система правил слишком сложна и мы ничего не гарантируем. Попытайтесь переписать попрозрачнее, и всем от этого будет польза».