<HTML><BODY>Я, наверно, последний раз напишу, так как далее бессмысленно, очевидно...<br><br><br>Fri, 16 Jan 2015 10:34:02 +0100 от PEF Secure <pef-secure@yandex.ru>:<br>
<blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">On Friday, January 16, 2015 04:18:39 <a href="/compose?To=Warstone@list.ru">Warstone@list.ru</a> wrote:<br>
> То есть вместо того чтобы использовать Class::XSAccessor который<br>
> оптимизирован по самое не балуйся вы используете eval, тем самым: <br><br>
Аксессоры -- малая часть того, что требуется. Если б только это, я бы обошёлся <br>
Class::Struct.</div></div></div></div></blockquote>На скорость вы принципиально плюете.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> 1) Раздуваете working-set приложения<br><br>
Простите, но что именно раздувается? Я не понял, особенно учитывая мой ответ <br>
на п.4.</div></div></div></div></blockquote>На то, сколько программа будет занимать в памяти после того, как вы все нагенерите. Хотя ладно, это придирка. Могу еще одну рассказать... Вы пользуете DBIx::Connector, который в себе при создании имеет следующее: $self->{pid} = $$; Прощай форк после вашего populate'а. Прощай здравый смысл. Хотя это не ваша вина, но анализировать модули, которые используете - имеет смысл.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> 2) Теряете возможность рантаймого похачить базовый класс или сделать<br>
> инъектирование к наследование, если уж вы не хотите mro::c3 с next::method<br>
> пользовать и таким образом давать возможность пользовать миксины, если<br>
> ОЧЕНЬ надо. <br><br>
Use Case какой? Perl -- язык динамический, в рантайме можно что угодно <br>
сделать.</div></div></div></div></blockquote>Сделать "просто". Если мне не допустим надо сделать аудит в моем варианте я перебиваю базовые методы в Base пакете. В вашем мне надо по всей схеме пройтись. Это для примера.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> 3) Теряете читабельность кода<br><br>
Кода, который пользуется этим модулем? Я приводил примеры, там было, по моему <br>
мнению, наоборот. Если речь про код модуля, то, Вы часто лезете под капот <br>
машины, чтобы проверить красоту устройства двигателя? Кроме того, не такой уж <br>
он нечитабельный, при достаточной подготовке читателя.<br></div></div></div></div></blockquote>Я всегда лезу под капот машины, чтобы понять насколько она быстрая и не будет-ли у меня проблем с этой моделью. Я могу не понимать всего алгоритма работы, но примерное поведение я должен знать. Более того, нету лучше метода узнать что делает модуль, чем посмотреть на его код. И у нас такие все. В резульатте рождается что-то типа вот этого: <a href="http://search.cpan.org/~randir/Class-Accessor-Inherited-XS-0.07/lib/Class/Accessor/Inherited/XS.pm">http://search.cpan.org/~randir/Class-Accessor-Inherited-XS-0.07/lib/Class/Accessor/Inherited/XS.pm</a> (Автор не я, сразу говорю. Он метрах в 10 от меня сидит. Просто у него было время для того, чтобы это сделать).<br>А если мне еще надо и подготовиться... Я лучше подготовлюсь путем неиспользования модуля, особенно если у него есть альтернативы (DBIx::Simple + SQL::Abstract, у которых так-же есть проблемы с форками, кстати).<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> 4) Выигрываете мизерный процент на обращении к хешу.<br><br>
В плане скорости, да, это микрооптимизация, которая глобально может и не <br>
влиять. А в плане расхода памяти это уже заметная разница. Был у меня в <br>
далёком прошлом случай, когда пришлось переделать структуру строки с хеша на <br>
массив, чтобы анализируемые данные стали влезать в память.<br></div></div></div></div></blockquote>Ну куда вы полезли?.. Доступ к хешу в классе. Вы экономите чуть-чуть на кждом созданном классе таким образом, а не объекте.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> И вы считаете это плюсом? Если вы где-то используете кодогеренацию вы что-то<br>
> делаете не так.<br><br>
Это похоже на постулат некоторой веры. Ну и на что же мне _динамический_ язык <br>
тогда?</div></div></div></div></blockquote>А для вас динамический - это только eval? Ну тогда да. Если-же нет, то создание пакета в рантайме без евала - это тоже динамика.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> Вам надо еще? Хорошо... Почему вы в коде где-то пользуете ссылку на CORE, а<br>
> где-то нет? Вы в своем модуле, что defined и exists перебили? Или... Зачем<br>
> это вообще? Причем в части коде есть CORE:: перед ref, в части нету...<br><br>
Если существует таблица, у которой есть поле "ref". Использование выражения <br>
ref $a в коде объекта при наличии аксессора ref() у объекта приведёт к <br>
неоднозначностям. Поэтому, в генерируемом коде постарался везде прописать явно <br>
CORE::.</div></div></div></div></blockquote>Вопрос не почему вы это сделали, а почему вы это сделали не везде. Но тут возможно просто не нашли все, так как текст, а не код... А теста такого вы не набросали, похоже... B::Deparse попользуйте думаю узнаете немного интересного.<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_14214008670000000125_BODY">> Вы проверяете во время setup_row есть-ли у вас уже такой класс, только вот<br>
> вы получаете имя класса и таблицу, а отдаете только имя класса... То есть я<br>
> никоем образом не узнаю, что я 2й раз пытаюсь вызвать генерацию класса, и<br>
> фиг с ним, если на одной и той-же таблице, а если на разных? Где там<br>
> проверка на название таблицы и гроханье с большим ором, если она не такая.<br>
> Где варн, если таблица та-же? Или это тренд такой "Если программист чего-то<br>
> ступил, давайте ему максимально осложним поиск баги"?<br><br>
Я немного не понял проблемы. Проверяется существование класса по таблице <br>
символов, известной интерпретатору. Если класс есть, он используется, если <br>
нет, то генерируется. Генерация происходит один раз для каждой таблицы при <br>
коннекте, который происходит при стартапе приложения. Так же генерация <br>
происходит для динамических запросов, тоже только один раз, второй раз <br>
используется готовый класс.</div></div></div></div></blockquote>Проблема вот в этом: setup_row('table1', 'MySchema::Table'); setup_row('table2', 'MySchema::Table'). На 2-м должен упасть. У вас не падает.<br id="style_14214008670000000125_BODY"></BODY></HTML>