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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП на Perl'e? покажите.. 
:(
    Опции темы
Kurt
Дата 23.2.2005, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Народ, а не мог бы кто-нибудь простыми словами рассказать, как организована работа с классами на Perl? Мне сейчас нужно написать веб-приложение, я в сомнении, PHP иль Perl. В последнее время стал неравнодушен к Perl'у, ну нравится мне он. smile Но я привык организовывать работу с БД через аксессоры. Вот и думаю теперь - если с ООП тут все ОК - буду юзать Perl, иначе - PHP.
Если не трудно, покажите, пожалуйста, пример.
Допустим, класс с конструктором и каким-нибудь одним методом типа getHelloWorldString(). Ну и плюс код, к-й создает объект такого класса.

Пробовал поиск по форуму или FAQ - без результатно.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
korob2001
Дата 23.2.2005, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



ОК. Давай напишем класс HelloUser
Код

package HelloUser;

sub new {
   my $check = shift;
   my $class = ref( $check ) || $check;
   my $self = { };
   bless( $self, $class );
   return $self;
}

# Создаём метод add_user, на он нужен как открытый
sub add_user {
   my $self  = shift;
   my $name = shift || "Anonim";
   my $col = shift || 1;
   $self->{ name } = $name;
   $self->{ col } = $col;
}

# Создаём метод get_hello, он тоже должен быть открытым
sub get_hello {
   my $self = shift;
   $self->{ hello } = "Hello, " . $self->{ name } . "!";
   # Вследующей строке происходит вызов закрытого метода,
   # собственно он делает всю работу
   my @strings = _name_pp( $self );
   return( @strings );
}

# Создаём закрытый метод _name_pp
sub _name_pp {
   my $self = shift;
   my @hello = ();
   for ( my $i = 1; $i <= $self->{ col }; $i++ ) {
         push( @hello, $self->{ hello } );
   }
 return( @hello );
}

1;

Сохрани код класса в файл HelloUser.pm Имя файла должно совпадать с именем пакета с точностью до регистра.
Можно было бы конечно упростить всё, но цель этого кода показать что есть класс, а не ввести в заблуждение. Так же здесь был, специально, создан закрытый метод _name_pp, который нельзя вызваьть из вне, да бы показать наглядно инкапсуляцию в Perl.

Теперь давай попробуем создать создать файл hello.pl, в котором можно будет посмотреть на интерфейс нашего класса. Внимание оба файла сохраняй в один каталог. Вот код:
Код

#!/usr/bin/perl -w
use strict;
# Указываем что в текущем каталоге может располагаться модуль или класс
use lib qw( . );
# Подключаем наш класс
use HelloUser;
# Создаём объект
my $hello = new HelloUser;
# Вводим информацию ( имя, кол-во )
$hello->add_user('Denis', 10);
# Выводим в STDOUT результат
print join("\n", $hello->get_hello);

Тепь попробуй поэксперементировать с методом add_user, попробуй передать другие свойства или не предать их вообще.
Можно было бы показать более наглядный пример, потому как в этом коротком примере не рассмотренны такие концепции как наследование, перегрузка операторов и т.д. Но эта тема довольно сложная и объяснить её в двух словах не получится. Потому могу посоветовать тебе несколько книг, где эта тема хорошо описана.

1. Программирование на Perl ( Лари Уолл, Том Кристиансен, Джон Орвант ).
2. Perl Библиотека программиста ( Том Кристиансен, Натан Торкингтон ).
3. Perl Специальный справочник ( Стивен Холзнер ).

Третья книга у меня есть как в оригинале, так и в формате .doc, на русском языке, если нужно, могу выслать.

Удачи.

ЗЫ: Если возникнут вопросы, пиши сюда.

Это сообщение отредактировал(а) korob2001 - 23.2.2005, 04:58


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kurt
Дата 23.2.2005, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Код

sub new {
   my $check = shift;
   my $class = ref( $check ) || $check;
   my $self = { };
   bless( $self, $class );
   return $self;
}

Не мог бы ты прокомментировать эти строки? Что такое shift? Для чего тут ref? Что такое bless?

Цитата
3. Perl Специальный справочник ( Стивен Холзнер ).

Может, лучше зальешь на FTP-сервер? smile


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
korob2001
Дата 23.2.2005, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Код

sub new {
1       my $check = shift;
2       my $class = ref( $check ) || $check;
3       my $self = { };
4       bless( $self, $class );
5       return $self;
}

Это конструктор. Для наглядности я пронумеровал строки.

1. Здесь мы с пощью shift извлекаем первый параметр из массива @_, через который в подпрогрмму передаются параметры. На самом деле можно было бы написать эту строку так:
my $check = shift( @_ );
или так
my $check = $_[0];
новсеже последний пример отличается от тех, где используется shift тем, что когда мы извлекаем нулевой элемент с почощью shift, то массив из из которого мы извлекли этот элемент, уменьшается. Другими словами мы как бы вырезали нулевой элемент и сохранили его в переменную. Способ извлечения параметров с помощью индекса $_[0], поросто копирует значение нулевого элемента массива @_ .

2. В этой строке мы узнаём каким способом юзер создал объект, например можно создать объект так:
my $hello = new HelloUser;
а можно и так:
my $hello = HelloUser->new();
Допустим если у тебя в программе есть подпрограмма с именем new, то первый способ не создаст объекта, а будет просто вызванна подпрограмма new в текущем пространстве имён, вот тут на на помощь приходит второй способ. Для того, что бы отличить как же всё-таки был создан обект, мы и используем функцию ref(), которая возвращает истинну в том случае если переданный ей параметр является ссылкой, возвращаемое значение зависит от типа того, на что указывает ссылка. (если переданный параметр освящен в пакет, то ref() возвращает имя этого пакета в качестве истенного значения), в противном случае ЛОЖЬ. Т.е. мы присваиваем переменной $class имя класса если она является ссылкой (второй способ создания объекта), в противном случае мы присваиваем ей имя класса ( первый способ создания объекта). Мы как бы предусмотрели то, что юзер может создать объект двумя способами:
a.) Косвенный.
б.) Стрелочный.

Что бы было более понятно, покажу более длинный, но более понятный код:
Код

my $class;
if ( ref( $check ) ) {
    $class = ref( $check );
} else {
    $class = $check;
}

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

3. Создаём анонимный хеш, собственно в нём и хранится вся информация. Изначально он пустой.

4. Эта строка действительно интересна. Здесь происходит посвящение ( blessed ), другими словами мы посвящаем данный экземпляр класса или метода в объект, т.е. мы как бы даём Perl команду - воспроинимать анонимный хеш $self, как объект класса $class.

5. Возвращаем уже сконструированный объект.

Цитата

Может, лучше зальешь на FTP-сервер?

На какой????

Это сообщение отредактировал(а) korob2001 - 23.2.2005, 04:19


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kurt
Дата 23.2.2005, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Цитата
На какой????


смотри тут smile

Внешне все понятно. Будем эксперементировать. Спасибо за помощь.
Но, похоже, я еще не раз вернусь к этому топику. smile
Добавлено @ 04:22
Кстати, неплохая тема для FAQ. smile


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
korob2001
Дата 23.2.2005, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Заливаю в каталог
eBook/korob2001/
Через минут 20 будет там, сильно слабая скорость у FTP'шника.
Цитата

Но, похоже, я еще не раз вернусь к этому топику.

Всегда пожалуйста. ;)))))

Это сообщение отредактировал(а) korob2001 - 23.2.2005, 04:50


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 23.2.2005, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Может тебе через ICQ кинуть??? Поотму как постоянно обрывается соединение.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Phoinix
Дата 25.2.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



korob2001

ммм... да... еще можно поподробнее смысл пременных $check и $class в процедуре new модуля...
особенно с учетом того, что мы возвращаем только $self, причем в то самую переменную которую ты пытаешься "прикрутить" к $class

???
PM WWW ICQ   Вверх
korob2001
Дата 25.2.2005, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Начну с конца, наверное так будет более понятнее.
Для bless можно передать как 1 так и 2 параметра, второй параметр не обязателен, он необходим только в том случае если нам нужно посвятить $self к определённому пакету, если не указан второй параметр, то используется текущий пакет.

Теперь о переменной $self, в ней мы создаём анонимный хеш, т.е. структуру, он пуст, хотя это и не обязательно, как и сам анонимный хеш, вместо него может быть ссылка на любой тип данных будь то ссылка на массив, на скаляр, подпрограмму и т.д.

Переменные для данного конструктора, в принципе, не обязательны. На основе того что я уже описал, уже можно сделать рабочий конструктор, который вернёт ссылку на объект. Вот пример:
Код

package HelloUser;
sub new {
     my $self = { };
     return( bless( $self, "HelloUser") );
}


Теперь перейдём к переменной $check, в неё сохраняем имя пакета, который передается в качестве параметра. Но так как в в качестве параметра может быть объект, а может и имя класса, нам нужно объкт преобразовать в имя класса, так как для bless второй париметр должен быть именем класса.

вобщем строку:
Код

my $class = ref( $check ) || $check;

можно описать так:
Присвоить перенной $class имя каласса из объекта $check если $check является объектом, в противном случае присвоить просто имя класса если $check не является объектом.

Можно было бы, конечно и не использовать переменную $class, $check, $self а просто сделать такой конструктор:
Код

package HelloUser;
sub new {
   return bless( { }, ref( $_[0] )||$_[0] );
}

Это тот же конструктор, только в сокращённой форме, но пояснить его не знаю, удалось у меня или нет. Если не понял дай знать, буду пробовать ещё.

Это сообщение отредактировал(а) korob2001 - 25.2.2005, 21:10


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


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

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


 




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


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

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