[Moscow.pm] Perl 6

vividsnow vividsnow на gmail.com
Вт Окт 13 12:33:22 PDT 2015


On 10/13/2015 10:20 PM, Victor Efimov wrote:
> 13 октября 2015 г., 22:18 пользователь vividsnow <vividsnow на gmail.com> написал:
>> On 10/13/2015 07:49 PM, Olga Smirnova wrote:
>>> Ни за ни против типизации, просто пример, когда строгая типизация могла бы решить проблему простым способом
>>>
>>> Примерно вот такой кусок кода:
>>>
>>> use JSON qw(to_json);
>>> use Data::Dumper;
>>>
>>> my $numbers = {
>>>     one => 1.5,
>>>     two => 2,
>>> };
>>> my $str = to_json( $numbers );
>>> print $str . "\n\n";
>>>
>>> my $str2 = Dumper($numbers);
>>> my $str3 = to_json( $numbers );
>>>
>>> print $str3 . "\n\n";
>>>
>>> Получаем вот такой вывод:
>>>
>>> {"one":1.5,"two":2}
>>>
>>> {"one":"1.5","two":2}
>>>
>>> Т.е. берем структуру с заведомыми чиселками, которую нужно преобразовать в json, затем применяем к ней какую-нибудь функцию, в данном случае Dumper, и теперь наша дробная
>>> чиселка легким движением руки превращается в строчечку при json-сериализации. Если бы была строгая типизация, то такой проблемы бы не возникло.
>>>
>>> Конкретно у нас это стало проблемой, когда понадобилось посылать внутри json'а сумму в рублях (соответственно, это дробная чиселка), а на принимающей стороне был сервис,
>>> написанный на скале (т.е. со строгой типизацей), валидатор которого ругался на наши "1.5" и говорил, мол это не чиселка.
>>>
>>> Тут, конечно, можно сказать, мол, просто не используйте Dumper (или любую другую функцию, неявно преобразующую тип), но это не панацея, т.к. в любой момент в проект может
>>> прийти новый человек, не знающий про эту фичу, который возьмет да и начнет использовать одну из таких функций перед отправкой и все нахрен поломается.
>>> В нашем случае решением проблемы стал перевод единицы измерения суммы из рублей в копейки и на нашей стороне и на принимающей (благо, принимающий сервис тоже наш), т.е.
>>> избавление от дробных чисел - перед отправкой для суммы всегда делался int и уже неважно было, что делали с этой чиселкой раньше.
>>
>> как вариант в функции-сериализаторе приводить значение к соотв. типу через:
>>
>> to_json({ one => $numbers->{one} +0, two => $numbers->{two} +0 })
> 
> да, если функция сериализации знает какие поля будут числами, а какие - нет

если нужно обобщенное решение, то можно "пробежаться" по структуре и:
$_+=0 if Scalar::Util::looks_like_number($_)

> 
>>
>> по этой теме на CPAN'е есть: https://metacpan.org/pod/JSON::Schema::Fit
>>
>>>
>>> С другой сторону, в пользу не строгой типизации - если бы такой json (с "1.5") пришел в сервис, написанный на перле, то проблемы бы не было - мы бы адекватно распарсили и
>>> 1.5 и "1.5"
>>>
>>>
>>> 13.10.2015 19:08, Victor Efimov пишет:
>>>> твой пример был про программиста, который написал $b='20' с кавычками, а потом решил с переменной $b произвести сложение. это не вменяемый программист, даже по
>>>> реальностям Perl5. он присваивает переменной заведомо строковое значение прямо в исходном коде, зачем-то пишет кавычки, а затем эту же переменную пытается складывать.
>>>> если у тебя какой-то xml парсер - то и приводи примеры xml парсера. я за то чтобы избавиться от абстракций в этом треде, тут и так полно недопонимания. так что лучше
>>>> пример кода обсужать а не на пальцах пытаться что-то объяснить и демагогией заниматься.
>>>
>>> --
>>> С уважением,
>>>
>>> Ольга Смирнова
>>> Perl-программист проекта Деньги@mail.ru
>>> раб.: +7 (495)-725-63-57 (внутр. 2199)
>>> моб.: +7 (926)-959-16-23
>>> e-mail: o.smirnova на corp.mail.ru <mailto:o.smirnova на corp.mail.ru>
>>> skype: olga_smirnova89
>>> mail-agent: o.smirnova на corp.mail.ru
>>> ISQ: 232733122
>>>
>>> mail.ru <http://mail.ru>
>>>
>>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org


Подробная информация о списке рассылки Moscow-pm