новости сообщество форум вики
Erlang по-русски. Форум » Erlang + Web »

Как правильно закодировать?

(8 posts)

  1. Есть сервер сессий, который возвращает {error, _} либо #session{....., opaque = CaptchaCode}
    Есть кусок кода, который проверяет валидность формы регистрации и выдает ok либо текст о?ибки.

        SessionTest = case session:get({captcha, CL}, -1) of
            {error, expired} -> "Verification code expired";
            {error, nosession} -> "Bad verification code";
            #session{opaque = CS} -> ok;   %% тут я по-разному писал...
            _ -> "Unknown error"
        end,
        Test = if
            SessionTest /= ok -> SessionTest;
            CC /= CS -> "Wrong verification code"; %% вот здесь о?ибка компиляции
            LL < 4 -> "Pasword is too short";
            P /= P2 -> "Paswords not match";
           true -> ok
        end,
    

    Эрланг компилирует и говорит "variable 'CS' unsafe in 'case'"
    и указывает на строчку, в которой стоит комментарий про о?ибку.

    Формально, понятно о чем он, и если я {error, expired} -> "Verification code expired";
    переписываю как {error, expired} -> CS = void, "Verification code expired";
    и т.д., то компилер успокаивается.
    Но фактически, проверка SessionTest и так исключает unsafe случай.
    Два вопроса:
    1. Прав ли я?
    2. Как это закодить красив?е?
    2.5. Как это закодить красив?е, чтобы эрланг ску?ал? :-)

    Отправлено 3 года(лет) назад #
  2. Гм... тихо сам с собою я веду беседу :-)
    Подумал, что имеет место сайд-эффект, что не есть гуд. переписал так:

        {CS, SessionTest} = case session:get({captcha, CL}, -1) of
            {error, expired} -> {void, "Verification code expired"};
            {error, nosession} -> {void, "Bad verification code"};
            #session{opaque = CS1} -> {CS1, ok};
            _ -> {void, "Unknown error"}
        end,
    
    Отправлено 3 года(лет) назад #
  3. Наверно луч?е так:

    SessionTest = case session:get({captcha, CL}, -1) of
    {error, expired} -> {error, "Verification code expired"};
    {error, nosession} -> {error, "Bad verification code"};
    #session{opaque = CS} -> {ok, CS};
    _ -> {error, "Unknown error"}
    end,
    Test = case SessionTest of
    {error, Message} -> Message;
    {ok, CS} when CS /= CC -> "Wrong verification code";
    {ok, _} when LL < 4 -> "Pasword is too short";
    {ok, _} when P /= P2 -> "Paswords not match";
    _ -> ok
    end,

    Но всё равно структура мне не очень нравится, много избыточности. Видимо ты мало на функциональных языках программируе?ь, раз такой код получается).

    Отправлено 3 года(лет) назад #
  4. Ну, это не совсем элегантно - а если у меня таких полей с двуступенчатой проверкой несколько (гипотетически)?
    По факту вопрос ре?ился перенесением проверки капчи прямо внутрь первого case:

        SessionTest = case session:get({captcha, CL}, -1) of
            {error, expired} -> \\"Verification code expired\\";
            {error, nosession} -> \\"Bad verification code\\";
            #session{opaque = CS} ->
                if CC /= CS -> \\"Wrong verification code\\";
                    true -> ok
                end;
            _ -> \\"Unknown error\\"
        end,
    

    Все считает сам, возвращат только ok или строку о?ибки.
    ?збыточность получается минимальной. Ну, т.е., можно case завернуть в свою функцию, но это количества строк не поменяет.

    Общая красивость ре?ения, конечно, вызывает вопрос.
    Альтернативно, можно, обрабатывать поля формы в цикле, как proplist, прикладывать к ним всякую унификацию, но простоты от этого тоже не добавится...
    Так что красивость если возникнет - то за счет чисто эрланговских трюков, однако от уровня элегантности примеров "Programming Erlang" Армстронга я пока далек :\

    А что касается функционального програмирования - ну, не очень силен. Хотя, это боль?е фокусы Эрланга, поскольку синтаксис прочих языков к чистому стилю настолько ультимативно не склоняет.

    Отправлено 3 года(лет) назад #
  5. Ну из куска было непонятно, что такой вариант допускается. Тогда так:

    SessionTest = case session:get({captcha, CL}, -1) of
    {error, expired} -> "Verification code expired";
    {error, nosession} -> "Bad verification code";
    #session{opaque = CS} when CC /= CS -> "Wrong verification code";
    #session{} -> ok;
    _ -> "Unknown error"
    end,

    PS В каких тегах ты код пи?е?ь? code /code не катит что-то(.

    Отправлено 3 года(лет) назад #
  6. Во! То что надо! Как и ожидалось, Эрланг рулит. Спасибо :-)

    Код пи?у в обычных "pre", притворив?ись, что пояснения о разре?енных кодах не видел ;-)

    Отправлено 3 года(лет) назад #
  7. Там pre не указано(. У меня написано тока так:
    Разре?енные коды: a blockquote br code em strong ul ol li img.

    Отправлено 3 года(лет) назад #
  8. Ага, не указано. Но если без pre не форматирует, то от чего же не попробовать? ;-)

    Отправлено 3 года(лет) назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.

 
 

так же

Популярные тэги



Currently online

No Members around.

twitter