13 октября 2015 г., 22:18 пользователь vividsnow <[email protected]> написал: > 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 })
да, если функция сериализации знает какие поля будут числами, а какие - нет > > по этой теме на 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: [email protected] <mailto:[email protected]> >> skype: olga_smirnova89 >> mail-agent: [email protected] >> ISQ: 232733122 >> >> mail.ru <http://mail.ru> >> >> > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
