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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объектно Ориентированное Программирование, Обсуждение ООП в Perl 
:(
    Опции темы
everyone
Дата 24.5.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



в этом вопросе я теоретик, и давно не пишу на Perl. Но судят по той странице

смысл tie в том, что  с помощью стандартных методов EXISTS, FIRSTKEY, NEXTKEY... мы создаём расширенный хэш, который ведёт себя так, как мы его запрограммируем.

Хэш очень удобная и интуитивно понятная структура. Вы работаете с ним, а обращения к нему латентно делают сколько угодно сложные действия. Вот, по-моему, и всё колдовство.

При разработке это, возможно, неудобно и громоздко, но при многократном использовании алгоритма можно сэкономить много времени в написании кода и понимании детального механизма того, что мы делаем(оно отпадает, ведь вы просто работаете с хэшем, а это урок номер один, или два... или, может быть, три). Реализация нам не важна, так что это похоже на разновидность инкапсуляции

преимущества всегда относительны
--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
mvsgt
Дата 3.6.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(gcc @  24.5.2009,  02:53 Найти цитируемый пост)
2) а как сделать Child::SUPER::SUPER::SUPER::m1 ? 


Никак. В перле нет суперклассов.

Или use Moose - там как раз всё хорошо с этим.
PM MAIL   Вверх
DaemonSuw
Дата 3.6.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



mvsgt, да вот мне интересно кто нибудь его использует? даже топик создал http://forum.vingrad.ru/forum/topic-259920.html ... 3 человека насчиталось =) кто юзает

Это сообщение отредактировал(а) DaemonSuw - 3.6.2009, 16:11
PM MAIL ICQ   Вверх
gcc
Дата 3.6.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



гугло бот вот выдал не много

http://simon-cozens.org/programmer/articles/rubyisms.pod

это если есть Wibble::Simple:: do_it  и нужно перейти в    Wibble:: do_it  ?
Цитата


Now this is pretty clever, but it has a slight untidyness problem. Suppose we have a class Wibble::Simple which inherits from class Wibble; with our current use of super we'd see a call stack like this:

     Wibble::Simple::do_it
        SUPER::super
           Wibble::do_it

Whereas we'd prefer to see this:

     Wibble::Simple::do_it
        Wibble::do_it

Now there is a way to make SUPER::super morph itself into the appropriate method: the goto &subroutine technique. Since UNIVERSAL::super - when we've written it - will return a subroutine reference, we merely need to set our @_ to be what we'd like the superclass to see, and then goto the reference:

     sub super () { 
         my $caller= (caller(1))[3];
         $caller =~ s/.*:://;

         @_ = DB::uplevel_args();
         my $self = $_[0];
         my $supermethod = $self->UNIVERSAL::super($caller);
         goto &$supermethod;
     }

Right, we're done! Well, apart from the little matter of that UNIVERSAL::super method. But this isn't too much of a problem; all we need to do to work out an object's super-method is to think what Perl would do. And what Perl does is ask each member of that object's class's @ISA array if it can perform the method. We can do this with the can method, which returns a code reference if the class can perform the given method - precisely what we want!


http://www.oreillynet.com/onlamp/blog/2006...ing_day_19.html
Цитата

I also added a test_extends() method that inherits from the version in the node tests. While I was doing that, I noticed an error about a missing SUPER() function in the test class. I had made an error when installing SUPER::SUPER() in the nodeball class. Fixing that made several tests pass and revealed that actually 25 of my 334 tests failed. There are many fewer test exceptions caught now though, so these results are more sensible.



http://search.cpan.org/~chromatic/SUPER-1.16/lib/SUPER.pm

Цитата

It's even worse in that the normal Perl redispatch mechanism only dispatches to the parent of the class containing the method at compile time. That doesn't work very well for mixins and roles.

This module provides nicer equivalents, along with the universal method super to determine a class' own superclass. This allows you to do things such as:

    goto &{$_[0]->super('my_method')};


super()

    This function calls the super method of the currently-executing method, no matter where the super method is in the hierarchy.

    This takes no arguments; it passes the same arguments passed to the currently-executing method.

    The module exports this function by default.

    Note: you must have the appropriate package declaration in place for this to work. That is, you must have compiled the method in which you use this function in the package from which you want to use it. Them's the breaks with Perl 5.


Beware: if you do weird things with code generation, be sure to name your anonymous subroutines. See Perl Hacks #57.

Using super doesn't let you pass alternate arguments to your superclass's method. If you want to pass different arguments, use SUPER instead. D'oh.

This module does a small amount of Deep Magic to find the arguments of method calling super() itself. This may confuse tools such as Devel::Cover.

In your own code, if you do complicated things with proxy objects and the like, define __get_parents() to return a list of all parents of the object to which you really want to dispatch.


а по последней ссыле что это за super, что-то не понятно, то же самое?



Это сообщение отредактировал(а) gcc - 3.6.2009, 16:45
PM WWW ICQ Skype GTalk Jabber   Вверх
mvsgt
Дата 3.6.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



gcc, непонятно что Вы написали про гугл.
PM MAIL   Вверх
gcc
Дата 3.6.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



гугл не много нашел... мало информации про это
PM WWW ICQ Skype GTalk Jabber   Вверх
klem4
Дата 3.6.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

2) а как сделать Child::SUPER::SUPER::SUPER::m1 ? 


Цитата

Никак. В перле нет суперклассов.


В дурдоме можно все:

Код

#!/usr/bin/perl 
use strict;

package A;
  sub new    { bless { 'name' => 'A' } => shift };
  sub say    { print ref $_[0], " says: ", $_[0]->{name}, "\n" }; # virtual 
  sub whoami { "whoami? A\n" }
1;

package B;
our @ISA = qw[A];
  sub new { bless { 'name' => 'B' } => shift };
  sub whoami { "B\n" }
1;

package C;
our @ISA = qw[B];
  sub new { bless { 'name' => 'C' } => shift };

  sub whoami {
    my $self = shift;
    my $base = $ISA[0];
    eval "\$$base\::ISA[0]->whoami";
  }
1;

  my @obj  = ( new A, new B, new C );

  for ( @obj ) {
    $_->say;
    print $_->whoami, "\n";
  }



При желании можно реализовать метод, вызывающий определенные метод у i-го родительского класса вверх по дереву.
PM MAIL   Вверх
mvsgt
Дата 3.6.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(gcc @  3.6.2009,  17:23 Найти цитируемый пост)
гугл не много нашел... мало информации про это 

Гугл не нашёл, потому что в перле (в чистом) в принципе нет классов, а значит и суперклассов нет. Наследования нет -> значит не может быть и родительского класса. use Moose и похожие модули, они эмулируют классы.

Добавлено через 1 минуту и 48 секунд
klem4
в перле нет классов и нет наследования smile его можно только эмулировать. @ISA - это не средство породить подкласс, это только путь поиска отсутствующих в модуле функций.
PM MAIL   Вверх
ginnie
Дата 3.6.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



mvsgt, если в Perl нет классов, почему я их могу использовать? Если нет наследования, почему я могу вызвать родительский метод?


Цитата(mvsgt @  3.6.2009,  17:59 Найти цитируемый пост)
@ISA - это не средство породить подкласс, это только путь поиска отсутствующих в модуле функций

Т.е. в других языках наследование как-то принципиально иначе реализовано?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
mvsgt
Дата 3.6.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ginnie @  3.6.2009,  18:22 Найти цитируемый пост)
mvsgt, если в Perl нет классов, почему я их могу использовать? Если нет наследования, почему я могу вызвать родительский метод?


Родительских методов тоже нет! Есть правила поиска методов, но назвать какой-либо класс родительским нельзя, разве что при соблюдении каких-то соглашений.

Цитата(ginnie @  3.6.2009,  18:22 Найти цитируемый пост)
Т.е. в других языках наследование как-то принципиально иначе реализовано? 


Конечно иначе. Особенно если учесть, что в Перле наследование вообще никак не реализовано. НИКАК!

Вы, например, можете взять да и поменять "наследование" на лету. Попробуйте такой фокус провернуть в Java или С++.

Код

#!perl -w
use strict;

package A;
sub new{my $class = shift; my $self={package=>'A',}; bless $self,$class;}
sub say{warn  'Method from package ' . __PACKAGE__ . ', class ' . $_[0]->{package};}

package B;
sub new{my $class = shift; my $self={package=>'B',}; bless $self,$class;}
sub say{warn  'Method from package ' . __PACKAGE__ . ', class ' . $_[0]->{package};}


package C;
use base qw(A);
sub new{my $class = shift; my $self={package=>'C',}; bless $self,$class;}


package main;

my $a = new A;
my $b = new B;
my $c = new C;

$a->say();
$b->say();
$c->say();
@C::ISA=('B'); # резко поменяли наследование!
$c->say();

$c->say();
A::say($c); # Или так нашли "суперкласс"
$c->A::say(); # Или так нашли "суперкласс"
@C::ISA=(); # вообще убили 'наследование'
$c->say();





Это сообщение отредактировал(а) mvsgt - 3.6.2009, 19:10
PM MAIL   Вверх
ginnie
Дата 3.6.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



mvsgt, почему $self->SUPER::method() не вызов родительского метода?

Зачем смешивать механизмы и их реализацию, тем более указывать как недостаток возможность изменять работу механизмов?

Не хочу ввязываться в спор. Если для Вас в Perl нет ООП, классов, наследования - значит так оно и есть. К счастью, многие успешно пользуются этими, отсутствующими в Perl, элементами. Да, пусть они работают не так, как в других языках, но это не повод ими пренебрегать.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 3.6.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С терминологической точки зрения mvsgt пожалуй все-таки прав.
В языках типа С++ или Java такие вещи реализованы на уровне примитивов, а в Perl чистая эмуляция. В голову сразу приходит такая параллель для сравнения: Moose, там вроде как появляется система контроля типов данных. Но нельзя ведь сказать, что перл теперь перестал быть нетипизированным языком. При желании этот контроль можно обойти.

Цитата

Родительских методов тоже нет! Есть правила поиска методов, но назвать какой-либо класс родительским нельзя, разве что при соблюдении каких-то соглашений.

А вот здесь несогласен. MRO - общее понятие для всех ООП языков, оно никак не связано с тем, можно ли называть класс родительским или нет.


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


Бывалый
*


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

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



Цитата(ginnie @  3.6.2009,  19:32 Найти цитируемый пост)
Да, пусть они работают не так, как в других языках, но это не повод ими пренебрегать. 


Ну разумеется не повод. Просто ими пользуются не так, как в других языках. Например, SUPER используется в <10% модулей CPAN , о чём-то это говорит. 

OOP в перле - и больше, и меньше чем в других языках, это скорее не законченная реализация, а конструктор, и это надо понимать.
PM MAIL   Вверх
KSURi
Дата 3.6.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Но, кстати, с помощью эмуляции ООП в Perl можно добиться практически всего, что могут языки типа С++ и Java. Так что может и не так важно ;)


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


Бывалый
*


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

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



Цитата(KSURi @  3.6.2009,  22:02 Найти цитируемый пост)
Но, кстати, с помощью эмуляции ООП в Perl можно добиться практически всего, что могут языки типа С++ и Java. Так что может и не так важно ;) 


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


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

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


 




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


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

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