Alexander Kuklev (akuklev) wrote,
Alexander Kuklev
akuklev

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

Даже если детально знаешь, как авторазрешалка конфликтов работает, всё равно можно проколоться в какой-нибудь редкой ситуации, о которой не задумался вначале. От этого совершенно никто не застрахован. Вот я казалось бы человек с весьма богатым опытом построения interlinked-систем и намётаным на дедлоки/конфликты глазом, а всё-равно написал стратегию поведения, в которой была дыра. И нашел только благодаря тому, что мне не лень было верифицировать эту хрень математически.

Дыра была связана с тем, что для авторазрешения конфликов применялся приоритет правил. Казалось бы, правило А важнее правила Б, поставим ему выше приоритет и всё. Но не всё так просто. Снижение приоритета правилу Б потянуло за собой третье правило В и возник перекос, который приводил к тому, что в определённой редкой ситуации самое важное правило А не срабатывало вообще. Что делать?
А делать вот что:
- В менее важном правиле Б следует писать ... «and not А». В случае применения автоордеринга это автоматически повлечёт выполнение правила два вначале, а если это невозможно, позволит найти deadlock в компайл-тайме.
- Ситуацию, когда верны оба, при необходимости разрулить руками. (Т.е. отдельным правилом)

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

Да, да, это в общем случае неразрешимая задача, но нас нифига не интересует общий случай, нас интересуют частные, в 95% которых это детектируется моментально. (потому что в 95% случаев система правил имеет структуру близкую к древовидной) В оставшихся пяти процентах случаев выдавать вместо ошибки предупреждение, что «система правил слишком сложна и мы ничего не гарантируем. Попытайтесь переписать попрозрачнее, и всем от этого будет польза».
Subscribe

  • (no subject)

    Встретил фотографию толпы футбольных фанатов, и она меня скорее напугала, у меня уж точно нет желания быть там среди них. Но внезапно я понял, что…

  • Прогресс

    Десять дней назад, вторая ступень SpaceX'овского корабля Starship своим ходом слетала своим ходом на десять километров вверх, и усмепшно приземлилась…

  • О водосбережении

    Как известно, питьевая вода во многих странах дефицитный ресурс. И даже в дождливой Германии летом иногда случаются засухи, в результате которых она…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 9 comments