ФорумПрограммированиеPHP для идиотовРасширения PHP → Запись иерархии правил: XML vs YAML vs еще чой-то

Запись иерархии правил: XML vs YAML vs еще чой-то

  • Коля Дубр

    Сообщения: 45 Репутация: N Группа: Адекваты

    Spritz 26 июля 2010 г. 21:08

    Привет!

    Есть задачка - записать иерархию каких-то там правил и каких-то действий, которые выполняются по этим правилам. Не суть зачем, это отдельная история. Сейчас сделано на XML, получается такой трэшачок:

    <rule match="//n" test="@id = 10">
    <layout name=".top" area="doc.body" />
    <rule test="@code = 'g'">
    <module sig="foo.bar@code:{@code}" />
    </rule>
    <module sig="booze.bar@entity_id:{@id}" area="doc.body.top" />
    </rule>


    Не пытайтесь врубиться, чо оно делает. Предложите лучше, как его красявей записать. Часто слышу, что XML плохо годится для человекочтения, очень многословный и т.д. Но вот попробовал записывать в YAML и JSON, получается шняга какая-то. Я наверное что-то не так делаю.

    Кому не лень, покажите, как бы вы это записали в том формате, которым вам лично удобней всего пользоваться?
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 26 июля 2010 г. 21:16, спустя 8 минут 37 секунд

    в формате ini. читается заебись! трудно накосячить
    ιιlllιlllι унц-унц
  • Коля Дубр

    Сообщения: 45 Репутация: N Группа: Адекваты

    Spritz 26 июля 2010 г. 21:19, спустя 2 минуты 42 секунды

    Да, пара уточнений.

    1. То что внутри атрибутов - трогать не надо, это хитрый xpath, так и должно быть.
    2. В каком порядке идут layout, rule и module друг относительно друга - не важно. В каком порядке идут элементы относительно аналогичных - важно.

    INI штука хорошая, но "Sections may not be nested", если верить википедии. А у меня вложенность может быть уровня 3-4 свободно.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 июля 2010 г. 21:24, спустя 5 минут 3 секунды

    покаж как оно в JSON'е выглядит.

    ЗЫ: Любой валидный JSON есть валидный YAML, если че)
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 26 июля 2010 г. 22:46, спустя 1 час 22 минуты 19 секунд


    Не суть зачем, это отдельная история.
    Это как раз таже самая история. Исходя из задачи и надо выбирать формат, а не абстрактно.

    Например, если требуется максимальная производительность, то выгодней хранить в виде иерархии массивов.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 июля 2010 г. 23:31, спустя 44 минуты 35 секунд

    Например, если требуется максимальная производительность, то выгодней хранить в виде иерархии массивов.

    в сериализованном виде
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 6:20, спустя 6 часов 49 минут 22 секунды

    "Sections may not be nested" легко объодится. например именуешь секции в точечной нотации

    [alfa.beta.gama]
    name=value

    смысл понятен? я разворачивал такие ini в иерархический массив
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 7:22, спустя 1 час 1 минуту 53 секунды

    я разворачивал такие ini в иерархический массив

    а я даже сворачивал :)

    ; Automatically generated file. Please use admin panel for updating this file
    ; Generated at: 2010/07/15-02:51:50
    ; Generated by: DudeCMS Bussiness

    [module.db]
    host = "localhost"
    username = "root"
    password = "qwerty"
    database = "101su"
    pconnect = 0
    debug = 1

    [module.mail]
    engine = "smtp"
    from = "[email protected]"
    fromname = "alexandr shurigin"
    4c3e23669b52e = ""

    [module.mail.smtp]
    host = "ssl://smtp.gmail.com:465"
    port = ""
    keepalive = 1
    auth = 1
    Спустя 18 сек.
    ини ахуенен.
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 7:25, спустя 2 минуты 53 секунды

    DudeCMS Bussiness — вау!

    адский дуд засветил свои пароли, быстрее копируйте!
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 7:26, спустя 1 минуту 5 секунд

    DudeCMS Bussiness — вау!

    надо же както обзывать костыль на октором людям делаешь костыли :)

    ага, пароли светанул :)
    Сапожник без сапог
  • Коля Дубр

    Сообщения: 45 Репутация: N Группа: Адекваты

    Spritz 27 июля 2010 г. 17:59, спустя 10 часов 32 минуты 50 секунд

    всем спасибо за участие!

    Абырвалг,
    у ямла синтаксис позволяет много чего делать или не делать (например, лишних скобок и кавычек не ставить).

    получается что-то в этом духе:


    [
    {
    "layouts":[
    {"name":".top","area":"doc.body"}
    ],
    "rules":[
    {
    "test":"@code = 'g'",
    "modules":[
    {"sig":"foo.bar@code:{@code}"}
    ]
    }
    ],
    "modules":[
    {
    "sig":"booze.bar@entity_id:{@id}",
    "area":"doc.body.top"
    }
    ]
    }
    ]


    INI с секциями через точку - хорошо, когда есть именование секций. Здесь же сложно придумать для правил разумные имена.

    Окей, распишу задачу чуть подробнее. Правила предназначены для привязки модулей к страницам. Для каждого правила описываем условия (в виде xpath, который адресуется к "контексту" - особому XML представлению инфы о странице и о текущей сессии). Если правило сработало - подрубаем из него модули и обрабатываем вложенные правила. При этом для вложенных правил контекстом для xpath-запросов будет служить то, что вернуло выражение из @match родительского правила. Короче, сатанинская такая тема :) Но удобно.

    Приоритеты такие:
    1. Легкость чтения глазами. Читать это хозяйство приходится регулярно.
    2. Скорость написания руками. Править тоже случается.
    3. Расширяемость. Мне часто снятся эротические сны на тему "чего бы туда еще добавить". Например, возможность сохранения результатов xpath-запроса в переменной. Или конструкция if-else.
    4. Скорость чтения компом практически пофик, потому что оно парсится не каждый раз, а хранится как раз в виде сериалайзнутых объектов.

    Короче - главное, чтоб было легко читать и писать.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 18:16, спустя 17 минут 13 секунд

    Коля Дубр, увидев твою схему мне показалось что самый разумный вариант наверное yaml все-таки… как-раз легкость чтения дастся отсутствиев идиотического количества скобочек как в жсон данных и неплохом отделении блоков пробелами (привет змея :D )

    ну и структура вроде как не говорит о обязательности использования xpath с виду и атрибутов для нодов, так что хмл особо не нужен с виду

    а задача непростая по крайней мере в голову вбить и проанализиоровать описание задачи - получается каша, пока сам это не "потрогаешь")
    Сапожник без сапог
  • Коля Дубр

    Сообщения: 45 Репутация: N Группа: Адекваты

    Spritz 27 июля 2010 г. 18:28, спустя 12 минут 16 секунд

    ок, ямл. а скажи, ты сам делал бы примерно такую же структуру, как я показал с джейсоном? ну то есть для каждого тега из xml заводить свойство (типа были вложенные теги layout, заводим свойство "layouts" и в него набиваем конструкции). или можно как-то проще?

    задача слегка мозголомная. а если ты или еще кто врубится подробнее, так начнется холивор, что я все делаю неправильно и что "активный шаблон рулит". я об этом рад бы поспорить, но не сейчас и не в этой ветке :) почему и не хотел описывать прикладную задачу.
    Спустя 256 сек.
    Да, xpath все-таки нужен, но это не влияет на задачу. Для простоты можно считать, что там не xpath, а колбеки или регекспы или еще пофик что. В этом смысле привязки к XML как к формату описания правил нет, т.к. на сами правила эти xpath-запросы не выполняются (хм…. крепко задумался, может зря? :)))

    вообще же правила не обязательно хранятся большой простыней, а могут собираться по кускам.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 19:02, спустя 33 минуты 27 секунд

    ух бля,ю фак мой моск)

    покажи как ты это используешь?

    а если ты или еще кто врубится подробнее, так начнется холивор, что я все делаю неправильно и что "активный шаблон рулит".

    ага))

    наскоько я понимаю задачу. тебе надо иметь возможность описать некую сущность, унаследовать ее(я прав, или ошибся?), уметь привязать к какому то узла (абстрактной модели данных/url возможно) ну и читать это все не меняя очки раз в неделю и не посещая окулиста
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 19:12, спустя 10 минут 25 секунд

    купил пива и семечек, слежу за развитием.
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!