Size: a a a

2020 January 27

EG

Emmanuel Goldstein in Modern::Perl
Andrey Konovalov
Работают-то работают, но как-то не так, как надо для объектов. Я в своё время копал эту проблему довольно подробно.
Ну вот тебе пример, что не так?
источник

AK

Andrey Konovalov in Modern::Perl
Emmanuel Goldstein
Ну вот тебе пример, что не так?
В этом примере нет самого главного - проверки значения
источник

AK

Andrey Konovalov in Modern::Perl
Ради этого вообще сеттеры нужны
источник

AK

Andrey Konovalov in Modern::Perl
Ну и что если мне не нужно присваивать значение, которое абсолютно кривое?
источник

AK

Andrey Konovalov in Modern::Perl
Вместо IP-адреса мне пришёл на вход гумна кусок. Я проверил и решил: ну нафиг такое присваивать-то
источник

AK

Andrey Konovalov in Modern::Perl
$ perl -E 'use Data::Dumper; my $x; sub f :lvalue { print Dumper \@_; $x }; f=1; say $x'
$VAR1 = [];
1
источник

AK

Andrey Konovalov in Modern::Perl
Хотя по-хорошему конечно лучший способ проверки значения - это проверка на принадлежность его к тому или иному классу. Если на вход приехало нечто класса, условно, Value::IP::Address, то мы уже точно знаем: оно там 100 раз проверено, и это реально IP-адрес, а не что-то ещё
источник

EG

Emmanuel Goldstein in Modern::Perl
Значения можно проверять (и приводить к нужному типу) ещё на этапе десериализации
источник

VG

Vadim Goncharov in Modern::Perl
привет, тормоза
источник

EG

Emmanuel Goldstein in Modern::Perl
Тогда в самом классе ты можешь предполагать, что никто не пытается запихнуть в него неверные данные, потому что ты их уже проверил
источник

AK

Andrey Konovalov in Modern::Perl
Emmanuel Goldstein
Тогда в самом классе ты можешь предполагать, что никто не пытается запихнуть в него неверные данные, потому что ты их уже проверил
Ну тут тоже такое себе. Условно - тебе в сеттер приходит IP-адрес 127.0.0.1, а тебе нужен IP внешнего DNS-сервера. По логике-то ты должен послать желающего присвоить не то в пешее эротическое, но с :lvalue точно этого сделать не сможешь. Да и проверка класса аргумента, даже если бы она была для :lvalue, ничего бы не дала: ну да, это IP-адрес, но в данном конкретном случае он вообще не в дугу, нельзя такое присваивать. А на каждый случай из 100500 писать наследуемые от Value::IP::Address классы - ну такое себе
источник

EG

Emmanuel Goldstein in Modern::Perl
Andrey Konovalov
Ну тут тоже такое себе. Условно - тебе в сеттер приходит IP-адрес 127.0.0.1, а тебе нужен IP внешнего DNS-сервера. По логике-то ты должен послать желающего присвоить не то в пешее эротическое, но с :lvalue точно этого сделать не сможешь. Да и проверка класса аргумента, даже если бы она была для :lvalue, ничего бы не дала: ну да, это IP-адрес, но в данном конкретном случае он вообще не в дугу, нельзя такое присваивать. А на каждый случай из 100500 писать наследуемые от Value::IP::Address классы - ну такое себе
Ну подожди, у тебя в сеттер данные приходят не из внешнего мира, а из другого куска кода
источник

EG

Emmanuel Goldstein in Modern::Perl
Вот на границе внешний мир/код и валидируй
источник

VG

Vadim Goncharov in Modern::Perl
+
источник

EG

Emmanuel Goldstein in Modern::Perl
Тем более, что 127.0.0.1 это полностью валидный адрес DNS-сервера
источник

AK

Andrey Konovalov in Modern::Perl
Emmanuel Goldstein
Ну подожди, у тебя в сеттер данные приходят не из внешнего мира, а из другого куска кода
И что? Я, например, пишу весь код как переиспользуемый библиотечный и по дефолту предполагаю, что я не контролирую внешний по отношению к нему код
источник

AK

Andrey Konovalov in Modern::Perl
Собственно, благодаря этому уровень DRY у меня лично очень высокий: весь мой код использует один и тот же скоп библиотек. Которые обычно всё-таки бьют по рукам, если на вход прилетает какая-то чушь.
источник

EG

Emmanuel Goldstein in Modern::Perl
Ты только что привёл прекрасный пример, почему лишние проверки — зло.
источник

EG

Emmanuel Goldstein in Modern::Perl
127.0.0.1 это корректный DNS-сервер. Может, у человека локальный unbound поднят.
источник

EG

Emmanuel Goldstein in Modern::Perl
У тебя на уровне библиотеки далеко не всегда есть понимание, какие значения валидные, а какие нет
источник