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

Поиск:

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


Создатель
***


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

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



Цитата
Что по мне, то я готов смириться с тем, что "хэш объекта" - вещь, которую "руками не трогать" (на уровне административных мер, как вариант, при работе в команде), а для определения (читай - "описания", которое можно понять даже не запуская программу, прочитав при этом код самого класса, а не "шарашась по всему коду") использовать что-то полегче типа трививального, рекомендованного в стандартной документаци по Perl.

Чем тебе не угодил хэш-массив? Думаю, просто для тебя это что-то новое и не знакомое, на самом деле логически он присутствует в любом языке программирования.
Ну ты же можешь описать класс так:
Код

package Child;
sub new {
    my$self=shift->SUPER::new(
        -properties=>{
            p1=>{
                -default=>1,
                -getter=>'Child::p1' #или \&p1
            },
            p2=>{
                -default=>3,
                -destroyer=>'Child::destroyer' #или \&destroyer
            }
        }
    );
    my$args={@_};
# ..... делаешь с аргументами всякую каку
    +$self
}

sub p1 {
#................
}

sub destroyer {
#...................
}


Это сообщение отредактировал(а) tishaishii - 2.2.2007, 04:17
PM MAIL ICQ Skype   Вверх
tishaishii
Дата 2.2.2007, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Короче, вот тебе тот же пример, но в файлах и с некоторыми комментариями.
Чтобы испытать надо выполнить команду (в командной строке):
Код
user$/usr/bin/perl test.pl


Это сообщение отредактировал(а) tishaishii - 2.2.2007, 04:13

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  Class.zip 1,57 Kb
PM MAIL ICQ Skype   Вверх
tishaishii
Дата 2.2.2007, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Цитата
До вызова AUTOLOAD необходимо определить (присвоить значение) элементу хэша. При отсутствии элемента инициируется исключение (die). И, собственно, понятно, почему. Нечего всякую ерунду для для объекта вызывать! При обычном наследовании еще можно определить (инициировать) значения элементов хэша путем обращения к процедуре инициализации своего суперкласса ($self->SUPER::_init() - как вариант). При множественном наследовании это не прокатит - нужно обходить всех "вручную". 

Тут ты что-то загнул. На заборе "В. Цой" написано, а за ним ничего нет.

Вот тебе пример с AUTOLOAD, чтоб ты поразбирался с "истинным удовольствием".
Код
sub AUTOLOAD {
    print $AUTOLOAD, "\n", scalar caller, "\n", join "\t", caller, "\n", '-' x 40, "\n";
    +shift
}
bless({}, undef)->LJKKkdsfjklsdfk->${\<<'.'};
У попа была собака Чита, он её любил.
Любил и любил.
А потом выпустил кишки, самое трудное в работе - рубить кости.
Кусочки головы закопал отдельно.
И ещё надпись напииисал.
.
+1

И где тут какая-то дребедень, которая там, у тебя в книжке написана? Плохая книжка.

Это сообщение отредактировал(а) tishaishii - 2.2.2007, 05:00
PM MAIL ICQ Skype   Вверх
Zuzu
Дата 2.2.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хэш-таблица*  - это элемент языка программирования, являющийся особенностью реализации на конкретном языке программирования. Где написано, что использовать напрямую Ээлементы реализации" не рекомендуется - да в любой книжке, что посвящена объектно ориентированному программированию, а лучше, объектно-ориентированному проектированию smile  Очень логично, на самом деле. И авторы приводят массу доводов для этого.

Приходит на ум книжка Ф.Брукса "Мифический человеко-месяц", который в качестве правильного метода проектирования рекомендует работать отдельно с сущностью объектов, вне зависимоти от акциденции (реализации на конкретном языке).
И вот, в частности, та, что лежит у меня сейчас на столе ближе всего ко мне smile 

Дж.Рамбо. М.Блахо UML 2.0 Объектно ориентированное моделирование и разработка. 2-е изд. - СПб.: Питер, 2007. -- 544 с. ил.

Про твой пример: (я про AUTOLOAD)

И где здесь класс? Какова его концептуальная сущность? Где его методы? Каков его интерфейс? Вообще интересно, как ты трактуешь понятие "полиморфизм" на своем классе. smile 

Элемент программной реализации, который делает что-то "непонятно как" - это далеко не класс!  Представляешь, ты просишь собаку замяукать (вызвать метод, про который объект, порожденный от класса "собака", просто не знает)! Не знаю как у кого, а моя собака посмотрит при этом на меня, как на идиота. Заставить собаку мяукать - это абсурд, правда? Зачем же тогда так поступать со своими объектами?

А предстваляешь удивленные глаза начинающего программиста, которому этот код будет отдан в поддержку! Как говорит один мой знакомый: "Так объясни мне! Не могут же все быть такими умными как ты!".

Цитата(tishaishii @  2.2.2007,  07:06 Найти цитируемый пост)
И где тут какая-то дребедень, которая там, у тебя в книжке написана? Плохая книжка.


Кстати, про AUTOLOD (и про "начальное определение свойств") написано в Advanced Perl Programming, Cookbook, perldoc 
perltoot - источники для тебя авторитетные? Для меня - да. smile Предпринимается некоторая попытка достичь хотя бы иллюзии инкапсуляции для класса в Perl. smile

---
*  В перле, кстати, не хэш-массив, а именно хэш-таблица. Т.е. элементы хэша хранятся не "друг за другом", а "каждый сам по себе". Или, по-другому, механизм, который определяет способ задания адреса  элемента для массива и адреса элемента для хэша - совершенно различен! Для массиива - последовательное хранение адресов, когда, адрес каждого элемента можно однозначно вычислить по номеру в массиве. Для хэша - некая функция, которая вычисляет адрес элемента по значению ключа. Именно поэтому хэши медленнее работают. Достаточно давно об этом где-то читал. Конкретно где, к сожалению не помню.



Это сообщение отредактировал(а) Zuzu - 2.2.2007, 11:59
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Shaggie
Дата 2.2.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

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



Цитата(Zuzu @  2.2.2007,  09:52 Найти цитируемый пост)
В перле, кстати, не хэш-массив, а именно хэш-таблица. Т.е. элементы хэша хранятся не "друг за другом", а "каждый сам по себе". Или, по-другому, механизм, который определяет способ задания адреса  элемента для массива и адреса элемента для хэша - совершенно различен! Для массиива - последовательное хранение адресов, когда, адрес каждого элемента можно однозначно вычислить по номеру в массиве. Для хэша - некая функция, которая вычисляет адрес элемента по значению ключа. Именно поэтому хэши медленнее работают. Достаточно давно об этом где-то читал. Конкретно где, к сожалению не помню.

Массивы предпочтительнее использовать там, где требуется последовательный перебор значений, хэши - для поиска конкретного значения (с этим они справляются гораздо быстрее)

Согласен с Zuzu. Объектная модель в Перле напоминает постоянно отпадающие при ходьбе костыли.

Перл 6 будет объектно-ориентированным языком. Собственно, из-за проблем с реализацией объектности при сохранении работоспособности более ранних программ мы ждем так долго smile 

А пока я почти не использую объекты в Перл.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Zuzu
Дата 2.2.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Shaggie, я бы не был столь категоричным! Можно их (объекты в Perl) использовать. Естественно с некотрыми допущениями (Попробуй, кстати, это прикольно! Если что - можно обсудить либо в форуме либо в ЛС). Проблема в том, что эти "допущения" несколько нервируют, когда переходишь от проектирования к реализации - просто не получается математически точная реализация модели (математически точная - значит реализация должна делать то, что должна делать и не должна делать, то, что делать не должна - именно так)! Не удержусь, приведу цитату из Дж.Рамбо:

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


А про хэши и массивы - естественно разговор про "примерно однотипные задачи", например, скорость последовательного выбора всех элементов. Хороший пример - реализация свойств (если более более корректно - данных) объекта на в виде "приведенного" (blessed) хэша, а в виде "приведенного" массива, есть в Advanced Perl Programming.

Это сообщение отредактировал(а) Zuzu - 2.2.2007, 10:41
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Shaggie
Дата 2.2.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

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



Цитата(Zuzu @  2.2.2007,  10:31 Найти цитируемый пост)
я бы не был столь категоричным!

А я не категоричен smile Объекты в Перл я не ипользую по той простой причине, что работаю в PHP. Перл - это мое большое увлечение. За пару дней до нового года купил кэмел бук (Programming Perl), просто так, для себя. Прочитал дважды, теперь всю работу в системе оптимизирую с помощью скриптов. Собираюсь бросать PHP, он уже кажется мне ограниченным и надуманным. Но до серьезных проектов не доходило, увы.

Цитата(Shaggie @  2.2.2007,  10:10 Найти цитируемый пост)
Объектная модель в Перле напоминает постоянно отпадающие при ходьбе костыли.

Такой вывод я делаю на основании прочитанного материала в вышеупомянутой книге, комментариев Ларри и содержании сайта perl6.ru
Необходимость насильно закрывать внутренние поля и методы, трудности с export, многозначность @ISA, постоянный контроль обращений к твоему пакету...


Перечитал тему... Я, похоже, и в самом деле чересчур категоричен smile Это от недостатка опыта, прошу извинить.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Zuzu
Дата 2.2.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(tishaishii @  2.2.2007,  05:46 Найти цитируемый пост)
Я не в полне тебя понял, что зазорного-такого в связывании (тем более через tie), когда я передавал структуру супер-классу и что в этом может быть такого нехорошего?


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

Если тебе это реально надо что-то подобное (пример просто в голову не приходит - уж не знаю, в каких случаях это можно применить) - есть нормальные и формализованные решения, описанные, например, в книжке Гаммы  про шаблоны (patterns) проектирования.


Это сообщение отредактировал(а) Zuzu - 2.2.2007, 12:58
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
amg
Дата 2.2.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(Zuzu @  2.2.2007,  09:52 Найти цитируемый пост)
Для массиива - последовательное хранение адресов, когда, адрес каждого элемента можно однозначно вычислить по номеру в массиве. Для хэша - некая функция, которая вычисляет адрес элемента по значению ключа. Именно поэтому хэши медленнее работают.
Я бы сказал, что если пытаться реализовать через массивы задачу, которую можно сделать через хэш, то (значительного) выигрыша по времени не будет (см. тесты).
Код

@a = qw(a b c d e f g h i j);
@b = qw(1 2 3 4 5 6 7 8 9 0);
%h = map { $a[$_]=>$b[$_] } 0..$#a;

#array-for
for ($i=0; $i<=$#a; $i++) {
  $k = $a[$i];    $v = $b[$i];
}

#array-foreach
$i = 0;
foreach (@a) {
  $k = $_;    $v = $b[$i++];
}

#hash-while
while (($kk,$vv) = each %h) {
    $k = $kk;    $v = $vv;
}

#hash-for
foreach (keys %h) {
    $k = $_;    $v = $h{$_};
}
Код

1000000 iterations
array-for:     12.65 s
array-foreach:  7.92 s
hash-for:      10.68 s
hash-while:    13.14 s

А вот в памяти один хэш заметно больше места занимает, чем два массива. Зато достут к элементу хэша по ключу мгновенный вне зависимости от размера хэша.
PM MAIL   Вверх
Nab
Дата 2.2.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Zuzu, я боюсь ты все таки не верно понял, о чем говорит tishaishii smile

Он предложил вполне законченное решение суперкласса, которым вполне можно заменить UNIVERSAL
И при создании любого собственного класса, использовать ту конструкцию что он привел....
не для конкретного екземпляра, а именно для описания поведения класса, объекты создаются как всегда, и внешний интерфейс ничем не измениться, кроме того, что это будут свойства очень похожие к примеру на Delphi...

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

Хотя в другом я с тобой согласен, нету однотипности smile
Если этот тип описания использовали изначально и как базовый класс для всех остальных,  то да, очень елегантное решение, но реальность такова, что его конструкция в действительности немного громоздкая, хотя не лишена некоторых прелестей... 
Я когда познакомился с tie тоже очень загорелся созданием своих типов, которые бы вели себя так, как мне нужно, даже создал регистронезависимый хеш и массив был у меня который при undef элементу удалял его, то есть всегда имел определенные значения, много чего было, но оно както не прижилось, вполне хватает сейчас стандартных возможностей языка...

А в плане свойств недавно сделал такую вещь, у меня в конфигураторе было так
$config->param('fff') - возвращает значение
$config->param('fff, 'new') - возвращает старое значение, присваивает новое 
но вспомнив про левосторонние функции сделал так в определении param
Код

sub param:lvalue {
...
}

все больше не менял ничего
теперь можно вызыыать конфигуратор и так
$config->param('fff) = 'new';
все очень даж приятно выглядит...

конечно остается возможность напрямую обратиться к внутренностям $config, но я считаю что вполне достаточно педальки перед внутренним методом smile Ну а если нужно, то пускай человек лезет, это его проблема... я честно предупредил "НЕ НАДО" smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Zuzu
Дата 5.2.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



amg, если мне память не изменяет, минимальный размер свертки для хэша в перле составляет 8 элементов.  В теории, по технологии создания хэша, адрес в свертке определяется по ключу (есть некоторая функция, которая ставит в соответсвие ключу адрес пары ключ-значение в памяти). Попробуй увеличить размер массива и хэша, например, по 1500 элементов и в качестве ключа хэша использовать что-то типа random(9999) x 5 для ключа, чтобы ключ был слегка подлинее. Подозреваю, что возрастет кол-во коллизий при определению адреса элемента по ключу в хэше.

Кстати, чтобы больше "напрячь" хэш по премени, можно попытаться извлекать элементы из него в порядке вставки (или в случайном порядке), а не в том порядке, который он, хэш, сам возвращает.  Можно случайным образом выбирать несколько элементов  n ключей и n номеров и сравнить время их выбора из массива и хэша. По документации - должно быть до 30% разницы в скорости выбора.

Хотя лично сам такими проблемами не заморачивался. Стараюсь по возможности минимизировать структуры данных в памяти. Там где нужен хэш (в частности для хранения неупорядоченного множества) исползьую хэш, там где важен порядок - массив. Наверно, банальную вещь сказал..

Nab, в приведенном примере (даже если он работает - проверить просто не было времени, а при прочтении, что он работает, для меня лично неочевидно), без переписывании Child, очень затруднено наследование свойств от класса Child (добавлене новых свойств, переопределение текущих свойств, например в классе SmallChild - наследник Child (да простят меня знатоки UML за текстовую, а не визуальную запись!):

Class () <|--- Child (+p2, +p3) <|--- SmallChild(+p2, +p4)

Т.е. в классе SmallChild должно быть три свойства: p2, p3, p4. Скорее всего, достаточно просто решается путем небольшой корректировки кода класса Child.

А вот с множественным неследованием от класса Child возникают серьезные проблемы. Там кода наколбасить придется очень много, чтобы все это работало нормально. Причем именно в конструкторах классах-потомков.

Про lvalue - спасибо, попробую. В каком Perl, это кстати, появилось? 

Это сообщение отредактировал(а) Zuzu - 5.2.2007, 11:01
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
amg
Дата 5.2.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(Zuzu @  5.2.2007,  10:33 Найти цитируемый пост)
Попробуй увеличить размер массива и хэша, например, по 1500 элементов и в качестве ключа хэша использовать что-то типа random(9999) x 5 для ключа, чтобы ключ был слегка подлинее. Подозреваю, что возрастет кол-во коллизий при определению адреса элемента по ключу в хэше.
Действительно, при увеличении длины ключей с 16 до 160 символов доступ к элементам хэша по ключам замедляется (примерно в 2 раза) и становится в 2-3 раза медленне, чем доступ к элементам массива по индексам (который, кстати, практически не замедляется при увеличении размера элементов).

Цитата(Zuzu @  5.2.2007,  10:33 Найти цитируемый пост)
Кстати, чтобы больше "напрячь" хэш по премени, можно попытаться извлекать элементы из него в порядке вставки (или в случайном порядке), а не в том порядке, который он, хэш, сам возвращает.  Можно случайным образом выбирать несколько элементов  n ключей и n номеров и сравнить время их выбора из массива и хэша. По документации - должно быть до 30% разницы в скорости выбора.
Проверил и это. Документация не врет smile Кстати, доступ к случайным элементам массива тоже раза в 2 медленнее, чем по-порядку.

Добавлено @ 15:26 
Цитата(amg @  2.2.2007,  13:07 Найти цитируемый пост)
А вот в памяти один хэш заметно больше места занимает, чем два массива.
Похоже, тут я не прав. Два набора строковых данных, хранящихся в 2-х массивах или в 1-ом хэше, занимают одинаковое кол-во памяти. (Если смотреть по размеру файлов после Storable)


Это сообщение отредактировал(а) amg - 5.2.2007, 16:00
PM MAIL   Вверх
tishaishii
Дата 5.2.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Zuzu, а если сделать такой хэш, который не поместится на все твою оперативку, винты, флэшки, DVDшки  и всё прочее, что тогда делать? А нечего тогда такой хэш делать, реально для этого есть СУБД или искать способы оптимизации или писать в машинных кодах. Что-то это, по-моему, перегиб уже пошёл.

Цитата
даже создал регистронезависимый хеш

А я создал ради прикола или лени с помощью String::Approx  и Text::Soundex класс с AUTLOAD со свойствами и методами, причём имя свойства или метода можно задавать при использовании как угодно, т.к. находится самое похожее по названию из имеющихся, это чтобы для разгильдяев, чтобы в именах методов и свойств можно было ошибаться. Ну это ни куда не годится, просто можно программировать и обезьяне чтобы можно было.

Ну вроде как:
Код

# в декларации Class::method
# а вызов может быть:
$o->MaTtthOd;
$o->meeeetodddd;
$o->m; #без риска нарваться на другой метод, если точно известно, что нет других, начинающихся на 'm'


Это сообщение отредактировал(а) tishaishii - 5.2.2007, 17:51
PM MAIL ICQ Skype   Вверх
Zuzu
Дата 5.2.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(tishaishii @  5.2.2007,  20:39 Найти цитируемый пост)
Zuzu, а если сделать такой хэш, который не поместится на все твою оперативку...


tishaishii, пожалуйста, давай останемся в рамках темы, т.е. обсуждать именно аспекты ООП и его реализации а Перл.

Про tie - то подсказал, спасибо. Может я чего не понимаю. Не сочти за труд, покажи, пожалуйста, как на твоем классе реализовать такую простейшую модель, как та, что изображена на рисунке. Там изображено множественное наследование свойств. Класс Child должен наследовать свойства p1, p2, p3, p4. Если воспользоваться рекомендациями из документации по Перл, решается примерно так:

Код

package Class;

sub new {
my $something = shift;
my $class = ref($something) || $something;
my $data = {};
my $anObj = bless($data, $class);
return $anObj;
}

package Mother;

use base qw/Class/;

sub p1 {
my $self = shift;
$self->{P1} = shift if (@_);
return $self->{P1};
}

sub p2{
my $self = shift;
$self->{P1} = shift if (@_);
return $self->{P1};
}

package Father;

use base qw/Class/;

sub p3{
my $self = shift;
$self->{P3 = shift if (@_);
return $self->{P3};
}

sub p4
my $self = shift;
$self->{P4} = shift if (@_);
return $self->{P4};
}

package Child;
use base qw/Mother Father/;



Извините, если что не так - набивал код прамо в форум.

Это сообщение отредактировал(а) Zuzu - 5.2.2007, 18:26

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  simple.gif 1,47 Kb
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Nab
Дата 5.2.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tishaishii @ 5.2.2007,  17:39)
Цитата
даже создал регистронезависимый хеш

А я создал ради прикола или лени с помощью String::Approx  и Text::Soundex класс с AUTLOAD со свойствами и методами, причём имя свойства или метода можно задавать при использовании как угодно, т.к. находится самое похожее по названию из имеющихся, это чтобы для разгильдяев, чтобы в именах методов и свойств можно было ошибаться. Ну это ни куда не годится, просто можно программировать и обезьяне чтобы можно было.


Ну так и супер.... 
Я такой состряпал для имен модулей, у меня теперь есть:

use_similar 'DATA_Dumper';
подгрузка модуля... на ходу...
аналогична таким
use_similar 'DATA::Dumper';
use_similar 'DataDumper';
....

там несколько режимов совпадения smile
и работает вполне корректно...

Есть более строгий режим, там условия поиска жестче...
Вопрос производительности еще не решен, но заглушки для кеширования поиска по диску сделаны, так что дойдут руки и до него smile

кстати мой конфиг тоже имеет AUTOLOAD и тоже левосторонний smile

так что и 

$config->fff = 'new'; 

тоже катит smile

А вообще это уже не в тему, точно Zuzu заметил smile

Цитата(Zuzu)

Про tie - то подсказал, спасибо. Может я чего не понимаю. Не сочти за труд, покажи, пожалуйста, как на твоем классе реализовать такую простейшую модель, как та, что изображена на рисунке. Там изображено множественное наследование свойств. Класс Child должен наследовать свойства p1, p2, p3, p4. Если воспользоваться рекомендациями из документации по Перл, решается примерно так:

Zuzu, множественное наследование вообще гадость редкостная, в особенности  в связке с AUTOLOAD у родителей smile
Возможно ктото его и использует активно, но я стараюсь держаться от него подальше, хотя и использую несколько маодулей со CPAN в которых оно используется...

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




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


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

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


 




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


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

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