[Moscow.pm] Решил опубликовать модуль.
Mons Anderson
inthrax на gmail.com
Пт Июл 17 02:00:51 PDT 2009
Замечения:
1. модуль "прагматичен", а прагмы пишутся в lc
2. хочу задать вопрос:
почему-бы не сделать в своем проекте модуль My::Constants, в котором
определить все константы через use constant, и экспортировать их как обычно.
3. my %flags в корне пакета - потенциальные проблемы. сделай our.
4. У sub FLAGS::SET дай прототип (@)
5. также посмотри на:
* http://search.cpan.org/dist/ctflags/
* http://search.cpan.org/dist/constant-def/
А вообще интересно, можно будет поюзать.
Думаю правда что прагму flags могут и не пропустить, она мождет быть
зарезервирована. Я бы предложил заюзать второй уровень в constant::
если кто будет искать что-то, связанное с константами, он будет искать
constant::*
как насчет constant::global? или constant::static?
или вообще constant::our ;)
О! Еще мысль
я подозреваю проблемы, связанные с тем, что DEBUG будет один на всех, что не
очень хорошо.
предусмотри неймспейсы.
т.е. по дефолту юзается корневой неймспейс, но можно определить
дополнительный.
типа так:
use FLAGS::SET DEBUG => 1; # default DEBUG
use FLAGS::SET::NS Namespace => { DEBUG => 0 }; # Namespace.DEBUG
usage:
use FLAGS 'DEBUG';
use FLAGS::NS Namespace => [qw(DEBUG)];
On Thursday 16 July 2009 20:23:54 Denis Evdokimov wrote:
> Предпосылки:
> Основной плюс констант в том, что они подставляется на этапе "компиляции".
> В добавок ко всему, все условия содержащие только константы выкидываются.
> Так
> if(1)
> {
> print "text";
> }
> преобразуется в
> print "text";
>
> А
> if(0)
> {
> print "text";
> }
> просто выбросится.
>
>
> В подтверждение этих слов:
>
> use Benchmark qw(:all);
>
> use constant DEBUG => 0;
> our $DEBUG_global = 0;
> my $DEBUG_local = 0;
> my $test = {
> constant => sub {
> for ( 0 .. 10000 )
> {
> if (DEBUG)
> {
> warn "DEBUG";
> }
> }
> },
> global => sub {
> for ( 0 .. 10000 )
> {
> if ($DEBUG_global)
> {
> warn "DEBUG";
> }
> }
> },
> local => sub {
> for ( 0 .. 10000 )
> {
> if ($DEBUG_local)
> {
> warn "DEBUG";
> }
> }
> },
> };
>
> timethese(-10, $test);
>
>
>
> Зная об этом поведении я пользовался следующим хаком
> В начале программы писал
> use constant DEBUG => 0;
> а в подключаемых модулях писал
> if(main::DEBUG)
> {
>
> }
> Но...
> 1. Это не красиво
> 2. Обязывает прописывать все константы
>
>
> Вот я и решил избавиться от этих проблем.
> Предположительное название модуля FLAGS.
> Исходники и пример использования в приложении.
> Всё очень сумбурно, так что жду вопросы и комментарии.
--
Vladimir Perepelitsa aka Mons Anderson
<inthrax на gmail.com> / #99779956
Подробная информация о списке рассылки Moscow-pm