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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иерархия объектов + доступ к БД, правильно спроектировать наследование 
:(
    Опции темы
TP@MB@Y
Дата 2.7.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть объект описанный в модуле DB.pm:


Код

package DB;

use strict;
use warnings;

use DBI;

...

sub connect {
    my ($class, %p) = @_;

    my $dbh = DBI->connect("dbi:mysql:".DB_NAME, DB_USER, DB_PASS);
    my $self = {
        dbh => $dbh
    };

    return bless($self, $class);
}

sub exec_sql {
    my ($self, $sql, @params) = @_;

    my $sth = $self->{dbh}->prepare($sql);
    $sth->execute(@params);

...

    foreach (my $row = $sth->fetchrow_hashref) {
        push(@result, $row);
    }

    $sth->finish;

    return \@result;
}


Также есть другие объекты, методы, которых реализуются с помощью SQL-запросов.
Допустим один из них:

Код

package SOME_OBJECT;

use strict;
use warnings;

sub new {
    my ($class, %p) = @_;

    my $self = {};
    return bless($self, $class);
}



# Хочется чтобы можно было делать так
#
sub some_method {
    my ($self, @some_params) = @_;
    my $result = $self->exec_sql(
        qq| SELECT * FROM ... |,
        @some_params
    );

    return $result;
}



Непосредственно в скрипте хочется писать так:
Код

use SOME_OBJECT;

my $obj = SOME_OBJECT->new;
$obj->some_method(...);




Я так подозреваю что можно использовать use base('DB'); 
Но никак не могу сообразить как более изящно это сделать
PM   Вверх
afiskon
Дата 2.7.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Ну да, use base ИмяРодительскогоКласса; Подробнее про ООП в Perl можно прочитать, извиняюсь за самопиар, тут: http://eax.me/perl5-oop/
PM MAIL WWW   Вверх
TP@MB@Y
Дата 2.7.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



afiskon, спасибо, ваша статья мне реально помогла smile

Меня только волнует одна вещь: если создается сразу несколько объектов-наследников DB.pm, то соединений с БД тоже будет несколько? как это в плане производительности? 
PM   Вверх
afiskon
Дата 3.7.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Цитата

Меня только волнует одна вещь: если создается сразу несколько объектов-наследников DB.pm, то соединений с БД тоже будет несколько?

Зависит от вашей реализации. Можете хранить в каждом объекте указатель на один dbh, тогда соединение будет одно. Только я не знаю, является ли DBI потокобезопасным и вообще позволяет ли параллельно выполнять два запроса. Впрочем, если у вас не многопоточное приложение, вас это не должно волновать.
PM MAIL WWW   Вверх
vivu
Дата 3.7.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(TP@MB@Y @  2.7.2011,  22:17 Найти цитируемый пост)
Меня только волнует одна вещь: если создается сразу несколько объектов-наследников DB.pm, то соединений с БД тоже будет несколько? как это в плане производительности?  


Используйте паттерн проектирования "Одиночка"

http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%...0.BD.D0.B0_Perl
PM MAIL   Вверх
TP@MB@Y
Дата 3.7.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(afiskon @ 3.7.2011,  10:17)
Цитата

Меня только волнует одна вещь: если создается сразу несколько объектов-наследников DB.pm, то соединений с БД тоже будет несколько?

...Можете хранить в каждом объекте указатель на один dbh, тогда соединение будет одно...

имено так и хотелось бы сделать. все запросы будут происходить последовательно. 
нужно что то типа статической переменной класса. как это в перловом объекте реализуется?
PM   Вверх
Pilat66
Дата 9.8.2011, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(afiskon @ 2.7.2011,  11:16)
Ну да, use base ИмяРодительскогоКласса; Подробнее про ООП в Perl можно прочитать, извиняюсь за самопиар, тут: http://eax.me/perl5-oop/

Всё же лучше читать официальную документацию, а не свободное её изложение с добавлением бессмысленных украшений типа скобок.

Насчёт надстроек над DBI: в DBI есть почти всё что нужно, надо только прочитать документацию. Например, конструкция ниже записывается в одну строчку ( $dbh->selectall_arrayref($sql, { Slice => {} }) ). $sth->finish;  лишнее, если мы всё равно все данные выбираем. 

Код

foreach (my $row = $sth->fetchrow_hashref) {
        push(@result, $row);
    } 
    $sth->finish;
    return \@result;


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


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

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


 




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


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

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