Библиотеки @-кода

Тема в разделе "Lotus - Программирование", создана пользователем nvyush, 3 фев 2010.

  1. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Здравствуйте все!
    Может баян, но мне нигде не попадалось.

    Иногда возникает необходимость/желание написать свою @-функцию и повторно её использовать. Вспомнил про @Eval и шаредные поля. В скрытое шаредное cfd-поле пишем, например, такую "функцию":
    Код (Text):
    "_res := {Hi mr/mrs } + _person + {!}; _res;"
    В нужное видимое поле пишем:
    Код (Text):
    @Eval("_person := " + @username + "; " + <имя_шаред_поля>);
    Собако-функции могут быть довольно большими, копипастить и потом дорабатывать их довольно муторно, а добавить шаредное поле на форму дело нескольких секунд. Оформить вызов через @Eval также не трудно.
    Можно объединять поля функций на подформах — получится целая собако-библиотека :welcome:.
    Понятное дело, что это применимо только к формам, но уже что-то.
    Прошу знатоков указать на грабли подобной реализации.

    Причина редактирования — ошибка в коде
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    nvy
    1) не дай боже твоя собако-библиотека будет ниже находится чем вычисляемое поле :welcome:
    2) если возникнет где-то ошибка в формулах ДО необходимого вычисляемого поля то все дальнейшие вычисления прерываются
     
  3. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    nvy, классное решение! Только в Shared Field формула скомпилена уже, не знаю, будет ли @Eval со скомпиленым кодом работать... думаю, что нет. Да и если код не скомпилен, то как он будет работать в скрытом дизайне?..
    И ещё во 2-м коде меня нечётное количество кавычек слегка напрягло :)

    P.S. Давно хотел, но вот созрел - сейчас забросил на IdeaJam: New design element for code "Open segment". Больших надежд не питаю, больше для очистки совести, но... поглядим! :)
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    че-то я не понял, ты там спросил или ответил? надо учить инглиш... ))
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    На том сайте люди забрасывают идеи, там есть спецы из IBM, которые просматривают и кое-что (что не противоречит стратегии развития продуктов) они делают. Но делают очень мало. Касательно нотусёвых UI вообще бесполезно просить - не обратят даже внимания, т.к., думаю, что они все силы переложили на XPages и формы скоро (когда будет полная поддержка XPages клиентом Notes) загнутся сами собой.

    Если тыкнуть там на мой ник, то можно посмотреть перечень всех моих идей; голосуйте - а вдруг! :)

    По этой идее, вкратце, - новый элемент дизайна, который бы содержал код в некомпилированном виде и этот код бы не скрывался при скрытии дизайна, т.е. чтобы можно было бы работать с ним как с текстом + новую @-формулу, которая по имени элемента дизайна возвращала бы текст @-формулы. Использовать это дело во всех местах, где можно пользоваться @-формулами, в т.ч. и из Evaluate.
    C помощью этого можно было бы реализовать собственные @-формулы (раз IBM не хочет этого делать).

    Инглиш у мну тоже хромает :) Гугл.транслэйт, кстати, очень хорошо переводит на английский, а вот с английского - ужас! Приходится, правда, корректировать, главное, использовать простые фразы и не использовать причастных и деепричастных оборотов, а то он выдаёт такой результат, что страшно становится))) Как раз таком образом язык и подучиваю ;)
     
  6. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0

    1. Надо аккуратно с @Return в своей @-подфункции, т.к. она не даст шанса выполниться другим функциям и доработать вызывающей, что может быть важно.

    2. Внутри @-подфункции нельзя использовать переменные, использованные в вызывающей @-функции
    Код (Text):
    @MySub{
    x:=1;
    x:=x+param1;
    }

    x:=2;
    param1:=1;
    @MySub;
    REM {здесь х=3 вместо ожидаемых x=2}

    3. Свою @-подфункцию лучше бы в @Do завернуть.
    Например, подстановка суммы двух @-подфункций
    Код (Text):
    @if(MySub1+MySub2; op1; op2)
    развернётся не в
    Код (Text):
    @if(mysub1_body;mysub1_res+mysub2_body;mysub2_res; op1; op2)
    , а в осмысленный
    Код (Text):
    @if(@Do(mysub1_body;mysub1_res)+@Do(mysub2_body;mysub2_res); op1; op2)
     
  7. K-Fire

    K-Fire Гость

    А подскажите пожалуйста, в чем смыслъ, так сказать, использования формулъ? :) Их дебагить нельзя, код длиной больше 4-5 строчек обычно нечитабельный и тому подобные траблы.
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    K-Fire,
    с ходу 2 примера:
    1. Функция нашего округления (для вьюх).
    2. Функция подключения к БД (для аутлайнов: формулы для вставки фреймсетов, страниц, вьюх).
    эти функции используются множество раз, мы просто их копипастим, т.к. нормальной возможности повторно использовать код у нас нет :)
    Вносить изменения - запаришься искать все места, где этот код есть...
     
  9. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Смысл в повторном использовании кода. Я пришёл к этому из-за необходимости использовать в разных местах преобразование числа в строку прописью (мелькал код здесь на форуме). Столкнулся сам ещё с одной граблей. Длинную строку в формулу поля можно запихнуть только конкатенацией, т.е. если код функции длинный, приходится писать не "код", а "кусок кода 1" + "кусок кода 2" ....
    Насчёт дебага — есть @Prompt, @StatusBar.


    Добавлено:
    Ага, уже наступил на эти грабли.
    Это да, но делать вложенные вызовы таким образом — это уже перебор. Предполагалось, что функция будет вызываться для преобразования значений к-либо полей и будет фактически только @Eval.
    Можно в @Do, можно в @If или в цикл в зависимости от задачи
     
Загрузка...

Поделиться этой страницей