Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторное использование крупных компонент 
:(
    Опции темы
sir_nuf_nuf
Дата 20.10.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Товарищи, есть такой дурацкий вопрос:
Как вы осуществляете повторное использование компонент?

Под компонентой здесь подразумевается некий кусок веб-приложения, состоящий из perl - кода, каких-то структур  в базе, шаблонов (например TT), отдельных скриптов.

Вопрос возник потому, что обычно говорят повторное использование модулей перл. И как это делать знают все.

Я же встретился со случаем когда имеется множество проектов, функционал которых во многом пересекается, например в каждом есть модуль новостей, который умеет:
1) скачивать новости по RSS
2) предоставляет небольшую админку хранимых новостей
3) обрабатывает картинки
4) ну и типичная логика выборки новостей из базы.

Каждый раз когда на новый проект нужно добавить функционал новостей - приходится копировать код, шаблоны и т.п. откуда-то и допиливать.

Как решаете эту проблему вы ?

может кто знает как с этим обстоит дело в catalyst и mason ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
DEER
Дата 20.10.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



по моему точно так же smile


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
gcc
Дата 20.10.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



sir_nuf_nuf, должна быть правильная архитектура (парадигма) прогарммы

такое часто замечал (правда на пхп), если использовать, например, DBIx::Class где все будет очень всего красиво в ООП, и если нужно добавить какие-то таблицы и изменить программу, то надо очень много переписывать - лучше удалить и написано заного

в Catalyst очень хорошо сделано... но на нем можно писать по разному...

Это сообщение отредактировал(а) gcc - 20.10.2009, 11:11
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 20.10.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 2
Всего: 27



Есть более-менее стандартный подход: общий функционал выделяется в модули (тут можно подумать как про модули для некого движка, так и простые перл-пакаджи оформленные, например, в виде mixin'ов). Затем все это дело подключается при необходимости. Пункты 1-4 как раз подходят для этого (кроме, может, 2). Это что касается кода.

Стуктуры данных. Ну тут вроде тоже очевидно: писать скрипт который будет создавать таблицы (или добавить эту часть в скрипт деплоймента).

А вот относительно шаблонов, не знаю, честно говоря. Раньше сам сталкивался, решал тоже копированием файлов.
Сейчас проще, т.к. структура страницы и ее внешний вид описаны в разных местах. Достаточно переключить файл с описанием. Можно конечно попробовать замутить такое и на Mason/TT, но имхо сложно получится.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 27.10.2009, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



sir_nuf_nuf, я навреное вас не правильно понял, когда сделаете  - покажите

ну там есть много вариантов 

http://search.cpan.org/~flora/Catalyst-Run...Type/Chained.pm

Код

  package MyApp::Controller::Greeting;
  use base qw/ Catalyst::Controller /;

  #   this is the beginning of our chain
  sub hello : PathPart('hello') Chained('/') CaptureArgs(1) {
      my ( $self, $c, $integer ) = @_;
      $c->stash->{ message } = "Hello ";
      $c->stash->{ arg_sum } = $integer;
  }

  #   this is our endpoint, because it has no :CaptureArgs
  sub world : PathPart('world') Chained('hello') Args(1) {
      my ( $self, $c, $integer ) = @_;
      $c->stash->{ message } .= "World!";
      $c->stash->{ arg_sum } += $integer;

      $c->response->body( join "<br/>\n" =>
          $c->stash->{ message }, $c->stash->{ arg_sum } );
  }


вот я красиво диспатчизировал:

Код

sub index_pages :Path('/last') : Args(1)  {
    my ( $self, $c, $id) = @_;
    
    $c->stash->{template} = 'photo.tt';

    $c->forward( 'last', [ $id, undef, undef, '1'] );
}

sub last : Local : Args(0) {
    my ( $self, $c, $id ) = @_;
  
    $c->stash->{template} = 'photo_album_privat.tt';  
  
# if ( !$id_un || (!$c->user_exists() || $id_un != $c->user->{user}->{id}) && !$c->check_user_roles('moder_co')   ) {
#      $c->stash( no_user_privat => 1, off_photo => 1, );
#     $c->detach();
#  }
  
  $c->forward( 'index', [ undef, undef, undef, '1'] );    
    
}


sub privat : Local {
    my ( $self, $c, $id_un, $id ) = @_;
  
    $c->stash->{template} = 'photo_album_privat.tt';  
  
 if ( !$id_un || (!$c->user_exists() || $id_un != $c->user->{user}->{id}) && !$c->check_user_roles('moder_co')   ) {
      $c->stash( no_user_privat => 1, off_photo => 1, );
     $c->detach();
  }
  
  $c->forward( 'index', [$id, '1', $id_un] );    
    
}


sub index_pages :Path('/photo') : Args(1)  {
    my ( $self, $c, $id, $privat, $id_un ) = @_;
    
    $c->stash->{template} = 'photo.tt';

    $c->forward( 'index', [$id] );
}


sub index :Path : Args(0)  {
    my ( $self, $c, $id, $privat, $id_un, $last  ) = @_;

    $c->stash->{template} = 'photo.tt';




PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 27.10.2009, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17




кстати, я тоже хотел спросить

вот например у меня есть модуль для комментариев, расчитано чтобы ставить комментарии в темах,
НО если я хочу сделать этот модуль почти похожим еще как минимум для 5 элементов (кроме тем), например комментарии в: фото, видео, приватные, групыы, и блоги....

т.е. один и тот код нужно использовать минимум 7 раз даже один и тот же КОД и более-менее сложный (перебор и т.д.)

как лучше написать? старатся писать все в кучу? или писать один и тот же большой код 10 раз?
кто как бы тут сделал?

ну вот:

Код

package MyApp::Controller::comment;

use strict;
use warnings;
use parent 'Catalyst::Controller';
use HTML::Entities::Numbered;

use SQL::Abstract;

use POSIX qw(ceil floor);

=head1 NAME

MyApp::Controller::comment - Catalyst Controller

=head1 DESCRIPTION

Catalyst Controller.

=head1 METHODS

=cut

=head2 index

=cut

sub index : Path : Args(0) {
    my ( $self, $c ) = @_;

    $c->response->body('Matched MyApp::Controller::comment in comment.');
}

sub add : Local : Args(0) {
    my ( $self, $c, $edit ) = @_;

    $c->stash->{template} = 'edit_comment.tt';

    my $method = $edit ? 'stash' : 'flash';

    $c->request->params->{id_co_comment} ||= '';
    $c->request->params->{text_cm}       ||= '';
    $c->request->params->{move_id_co}    ||= '';
    $c->request->params->{id_cm}         ||= '';
    $c->request->params->{hiden_g_cm}    ||= '';

    if ( !$c->user_exists() ) {

        $c->$method->{error_no_user} = 1;
        $c->response->redirect(
            $c->uri_for(
                '/view_content/' . $c->request->params->{id_co_comment}
            )
        ) if ( !$edit );
        $c->detach();

    }

    if ( !$c->request->params->{id_co_comment} ) {
        $c->$method->{error_no_id_co_comment} = 1;
        $c->response->redirect(
            $c->uri_for(
                '/view_content/' . $c->request->params->{id_co_comment}
            )
        ) if ( !$edit );
        $c->detach();
    }

    if (
        length( $c->request->params->{text_cm} ) <
        MyApp->config->{length}->{min_text_comment}
        || length( $c->request->params->{text_cm} ) >
        MyApp->config->{length}->{max_text_comment} )
    {

        $c->$method->{no_add_comment_text} = 1;
        $c->response->redirect(
            $c->uri_for(
                '/view_content/' . $c->request->params->{id_co_comment}
            )
        ) if ( !$edit );
        $c->detach();
    }

    my $f = $c->model('ExtraDBI')->new;

    my ($loop_data) =
      $c->forward( 'check_sql_comment', [ $f, $edit, undef, undef ] );

    my $move_id_se;
    if (   $edit
        && $c->request->params->{move_id_co} eq 'on'
        && $c->check_user_roles('moder_co') )
    {

        my $dbh = $c->model('DBI')->dbh;

        my $sth = $dbh->prepare(
            "SELECT id_se
                                        FROM content
                                       WHERE id_co = ?
                                       LIMIT 1"
        );
        $sth->execute( $c->request->params->{id_co_comment} );
        $move_id_se = $sth->fetchrow_hashref();
        $sth->finish();

        $f->no_sql->zero_die( 'no_move_id_se', $move_id_se->{id_se} );

    }

    if ( $f->error_valid ) {

        # to error

        my $out_bad = $f->out_bad;

        foreach ( @{$out_bad} ) {
            $c->$method->{$_} = 1;
        }

        if ($edit) {

            $c->forward( 'edit', [ $c->request->params->{id_cm} ] );
        }
        else {
            $c->$method->{text_cm_current} = $c->request->params->{text_cm};
            $c->response->redirect(
                $c->uri_for(
                    '/view_content/' . $c->request->params->{id_co_comment}
                )
            );

        }
        $c->detach();

    }
    else {

        my $hash;
        my $where;
        my $type_sql;

        $hash->{text_cm} = name2decimal( $c->request->params->{text_cm} );

        if ($edit) {
            $type_sql = 'update';
            if (   $c->request->params->{id_co_comment}
                && $c->check_user_roles('moder_co') )
            {
                $hash->{id_co} = $c->request->params->{id_co_comment};
            }

            if (   $c->request->params->{move_id_co} eq 'on'
                && $c->check_user_roles('moder_co') )
            {

                $hash->{id_se} = $move_id_se->{id_se};
                $hash->{id_co} = $c->request->params->{id_co_comment};
            }

            if ( $c->check_user_roles('moder_co') ) {

                $hash->{hiden_g_cm} =
                  $c->request->params->{hiden_g_cm} eq 'on' ? 1 : 0;
            }

            $where->{id_cm} = $c->request->params->{id_cm};

        }
        else {

            $type_sql = 'insert';

            $hash->{id_co}      = $loop_data->{id_co};
            $hash->{id_se}      = $loop_data->{id_se};
            $hash->{id_un}      = $c->user->{user}->{id};
            $hash->{hiden_g_cm} = '0';
            $hash->{created}    = time;
            $hash->{ip}         = $c->request->address;
            $hash->{forwarded}  = $c->request->header('X-Forwarded-For');
            $hash->{host}       = $c->request->hostname;

        }

        my $sql = SQL::Abstract->new;

        my ( $stmt, @bind ) = $sql->$type_sql( 'comment', $hash, $where );

        my $dbh = $c->model('DBI')->dbh;
        my $sth = $dbh->prepare($stmt);
        $sth->execute(@bind);
        $sth->finish();

        my $lastid = $dbh->{mysql_insertid} unless ($edit);

        if ( $loop_data->{email_sent} && !$edit ) {

            $dbh->do(
                qq{replace INTO sent_comment (id_co,          
                                                     id_un) 
                                       VALUES (?,
                                             ?)},
                undef, $loop_data->{id_co}, $hash->{id_un}
            );

        }

        for ( MyApp->config->{new_comment}->{text_sent_email} ) {
            s/__ID_CO__/$loop_data->{id_co}/g;
            s/__ID_CM__/$lastid/g;
        }

        my $parent = $$;
        my $child  = fork();

        if ( $$ == $parent ) {

            # print "Parent: pid=$$;($parent)\n";

        }
        else {

            eval {

                my $sql_sent = 'SELECT t2.email_address
                                FROM sent_comment AS t1,
                                      users AS t2
                              WHERE t1.id_un = t2.id
                                      AND t1.id_co = ' . $loop_data->{id_co} . '
                                      AND t2.active is null
                                      AND t2.email_sent = 1
                                      ';

                my $sth = $dbh->prepare($sql_sent);
                $sth->execute();

                while ( my $email = $sth->fetchrow_arrayref() ) {

                    $c->forward(
                        qw /MyApp::Controller::registration sent_email/,
                        [
                            MyApp->config->{new_comment}->{from_sent_email},
                            $email->[0],
                            MyApp->config->{new_comment}->{sub_sent_email},
                            MyApp->config->{new_comment}->{text_sent_email}
                        ]
                    );

                }

                $sth->finish();

            };
            if (@!) {
                print "error";

            }

            # kill("TERM", $child);

        }

        waitpid $child, 0;

        #kill(TERM => $child) or warn "Can't kill child, because: $!\n";

        if ( !$edit ) {
            $c->response->redirect(
                $c->uri_for(
                        '/view_content/'
                      . $loop_data->{id_co}
                      . '/end#comment-'
                      . $lastid
                )
            );
        }
        else {

#my $page = sprintf( '%.f', ( ( $where->{id_cm} + 1 / 10 )  )) if ($where->{id_cm} > 10);
            my $page = ceil( $where->{id_cm} / 10 ) if ( $where->{id_cm} > 10 );

            $page = '/' . $page;

            $c->response->redirect(
                $c->uri_for(
                    '/view_content/' . $loop_data->{id_co} . '' . $page
                )
            );
        }

    }

    $c->detach();
}

sub edit_comment : Local : Args(2) {
    my ( $self, $c, @args ) = @_;

    $c->stash->{template} = 'edit_comment.tt';

    if ( $args[0] !~ /^\d+$/ || $args[1] !~ /^\d+$/ || !$c->user_exists() ) {
        $c->stash->{error_id_and_user} = 1;
        $c->detach();
    }

    my $f = $c->model('ExtraDBI')->new;

    my ($loop_data) =
      $c->forward( 'check_sql_comment', [ $f, '1', '1', $args[0], $args[1] ] );

    if ( $f->error_valid ) {

        # to error
        my $out_bad = $f->out_bad;
        foreach ( @{$out_bad} ) {
            $c->stash->{$_} = 1;
        }
        $c->detach();
    }

    if ($loop_data) {

        $c->stash->{text_cm}    = $loop_data->{text_cm};
        $c->stash->{id_co}      = $loop_data->{id_co};
        $c->stash->{hiden_g_cm} = $loop_data->{hiden_g_cm};
        $c->stash->{id_cm}      = $loop_data->{id_cm};

    }

    $c->stash->{moder} = 1 if ( $c->check_user_roles('moder_co') );

    $c->detach();

}

sub edit2 : Local : Args(0) {
    my ( $self, $c ) = @_;

    $c->forward( 'add', ['1'] );

}

sub delete_comment : Local : Args(2) {
    my ( $self, $c, @args ) = @_;

    $c->stash->{template} = 'edit_comment.tt';

    if ( $args[0] =~ /^\d+$/ && $c->user_exists() ) {

        my $sql;

        if ( !$c->check_user_roles('moder_co') ) {
            $sql =
                'AND created > '
              . ( time - 86400 )
              . ' AND id_un = '
              . $c->user->{user}->{id};

        }

        my $dbh = $c->model('DBI')->dbh;

        $dbh->do(
            qq{DELETE FROM comment
                            WHERE id_cm = $args[0] $sql LIMIT 1},
            undef
        );
    }

    if ( $args[0] !~ /^\d+$/ || !$c->user_exists() ) {
        $c->response->redirect( $c->uri_for('/') );
    }
    else {
        $c->response->redirect( $c->uri_for( '/view_content/' . $args[1] ) );

    }
    $c->detach();

}

sub check_sql_comment : Privat {
    my ( $self, $c, $f, $edit, $edit0, $id_cm_sql, $id_co_sql ) = @_;

    # $edit0 - edit select comment

    my $method = $edit ? 'stash' : 'flash';

    my $dbh = $c->model('DBI')->dbh;

    my $sql_comment = 'SELECT t1.id_co,  
                                       t1.id_se,
                                       t1.id_un,
                                       t1.forbi_comm_co,
                                       t1.close_co,
                                       t1.hiden_co,
                                       t1.active_co,
                                       t2.active_se,
                                       t2.close_se,
                                       t2.id_un AS id_un_se,
                                       t3.email_sent
                                       ' . ( $edit0 ? ', t4.text_cm ' : '' ) . '
                                  '
      . ( $edit ? ', t4.id_cm, t4.created, t4.id_un AS id_un_cn' : '' ) . ' 
                                  FROM content AS t1
                          LEFT JOIN section AS t2
                                 ON t1.id_se = t2.id_se
                          LEFT JOIN users AS t3 
                                 ON t1.id_un = t3.id 
                           ' . (
        $edit
        ? '
                           LEFT JOIN comment AS t4 
                                 ON t1.id_co = t4.id_co
                                AND t4.id_cm = ?                           
                           '
        : ''
      )
      . '                                                                                                                                            
                            WHERE t1.id_co = ?
                           LIMIT 1';

    my @sql;
    push @sql, $id_cm_sql ? $id_cm_sql : $c->request->params->{id_cm}
      if ($edit);
    push @sql, $id_co_sql ? $id_co_sql : $c->request->params->{id_co_comment};

    my $sth = $dbh->prepare($sql_comment);
    $sth->execute(@sql);
    my $loop_data = $sth->fetchrow_hashref();
    $sth->finish();

    if ( !$loop_data->{id_co} ) {
        $c->$method->{error_no_id_co} = 1;
        $c->response->redirect(
            $c->uri_for(
                '/view_content/' . $c->request->params->{id_co_comment}
            )
        ) if ( !$edit );
        $c->detach();
    }

    if ($edit) {
        if ( !$loop_data->{id_cm} ) {
            $c->stash->{error_no_cm} = 1;
            $c->detach();
        }
        if ( $loop_data->{id_un_cn} != $c->user->{user}->{id}
            && !$c->check_user_roles('moder_co') )
        {
            $c->stash->{error_no_id_un_cm} = 1;
            $c->detach();
        }

        if ( $loop_data->{created} < time - 86400
            && !$c->check_user_roles('moder_co') )
        {
            $c->stash->{error_no_created} = 1;
            $c->detach();
        }

    }

    if ( !$c->check_user_roles('moder_co') ) {

        $f->bad_fields_type('arrey');
        $f->no_sql->zero_die( 'error_no_forbi_comm_co',
                 $loop_data->{forbi_comm_co} == 1
              && $loop_data->{id_un} != $c->user->{user}->{id} );
        $f->no_sql->zero_die( 'error_no_hiden_co',
                 $loop_data->{hiden_co} == 1
              && $loop_data->{id_un} != $c->user->{user}->{id} );
        $f->no_sql->zero_die( 'error_no_active_co',
                 $loop_data->{active_co} != 1
              && $loop_data->{id_un} != $c->user->{user}->{id} );
        $f->no_sql->zero_die( 'error_no_active_se',
                 $loop_data->{active_se} != 1
              && $loop_data->{id_un_se} != $c->user->{user}->{id} );
        $f->no_sql->zero_die( 'error_no_close_co',
            $loop_data->{close_co} == 1 );

        $f->no_sql->zero_die( 'no_edit_no_un_cn',
            $loop_data->{id_un_cn} != $c->user->{user}->{id} )
          if ($edit);

    }

    $f->no_sql->valid_id( 'error_no_id_co_comment',
        $c->request->params->{id_co_comment} )
      if ( !$edit0 );

    return $loop_data if ($loop_data);
}

=head1 AUTHOR


Dmitriy

email: [email protected]
 

=head1 LICENSE

This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

1;




например, я не давно работал с одной программой где было все в куча нуписано на ORM, и разобратся все сложно 

другими словами: есть 20 модулей которые связываються между собой и все как один модуль!! чтобы изменит например 3-4, то нужно все переписать или многие модули переписать, т.к. получается что нужно все 20 переписать из этого следует: просто все переписать или сделать все в кучу...

======

но вот я как раз читал где-то в списке рассылке, говорилось про недостатки DBIC, в том что все контроллеры должны быть не однородными!! т.е. в DBIC, можно крассиво написать код к 10 контроллерам, и может полуиться, так что нужно будет изменить программу! изменит 2 контроллера, а изменить не получиться, так как остальные 8 работать не будет, потому что они будут взаимосвязывающиеся ( все однородные ) и прейдется все 10 переписывать, вот лучше удалить все и написать заново…




Это сообщение отредактировал(а) gcc - 28.10.2009, 07:55
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 27.10.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Цитата(gcc @  27.10.2009,  08:00 Найти цитируемый пост)
т.е. один и тот код нужно использовать минимум 7 раз


Ага вот где-то здесь проблема и возникла.

Использовать повторно перл - код - не проблема.

Проблема появляется с шаблонами, скриптами, SQL - скриптами, т.е. с тем для чего не применимо ООП.

 А так же когда иногда нужно бывает добавить к этому сквозной функционал - допустим для какой-нть сущности добавить
- колонку в базе
- поле в классе
- чекбокс в шаблонах админки
- изменить логику выборок и т.п.
т.е. изменение мелкое но проходит по всему компоненту.


Пока стараемся максимум логики переносить в перл-код, 
скрипты, SQL - скрипты - генерим "по шаблону", но за счет того что они простые - их легко и поменять при необходимости..

С шаблонами совсем туго.. По ходу будем просто максимально их облегчать и переписывать с нуля при необходимости.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
gcc
Дата 28.10.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



Цитата(gcc @ 27.10.2009,  08:00)
кстати, я тоже хотел спросить

вот например у меня есть модуль для комментариев, расчитано чтобы ставить комментарии в темах,
НО если я хочу сделать этот модуль почти похожим еще как минимум для 5 элементов (кроме тем), например комментарии в: фото, видео, приватные, групыы, и блоги....

т.е. один и тот код нужно использовать минимум 7 раз даже один и тот же КОД и более-менее сложный (перебор и т.д.)

как лучше написать? старатся писать все в кучу? или писать один и тот же большой код 10 раз?
кто как бы тут сделал?

ну вот:

подскажите кто как бы тут сделал? я код привел, может я не правильно модель ООП сделал?

или тут реально все равно?

Это сообщение отредактировал(а) gcc - 28.10.2009, 08:44
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 16.12.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



подскажите как даннй код написал, понятно?

просто я старался писать компактно и красиво и этим не много усложнил логику внешнего вида кода...

или нормально? не трубует рефакторинг?

хотел сделать рефакторинг, но подумал что может не надо,  если еще короче писать - то будет еще больше запутано

код сюда не поместился, я написал его сюда:  http://lissyara.org.ua/view_content/74
PM WWW ICQ Skype GTalk Jabber   Вверх
mvsgt
Дата 19.12.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: нет
Всего: 1



Повторное использование  не всегда оправдано. Причина - постоянно приходится добавлять функционал и заботиться об обратной совместимости.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.