Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > tie OOP


Автор: gcc 26.2.2009, 22:06
можете подсказать зачем использовать в OOP tie?

в книге "рецепты для профессионалов 3 издание" про это не написано было, точнее для бд примеры... но не понятно где именно преимущество...

вот нашел это не плохое
http://search.cpan.org/~milan/OOP-1.01/lib/OOP.pm

мне понравился пример с хэш-хеши-функций

про tie я не нашел http://www.google.com/search?hl=uk&q=oop+tie+perl&btnG=%D0%9F%D0%BE%D1%88%D1%83%D0%BA&meta=


Автор: gcc 3.3.2009, 00:44
можно подсказку? ключевые слова?

Автор: sir_nuf_nuf 3.3.2009, 00:51
вообщем почти что нафиг не нужны.
tie - это расширения, что бы можно было решать более сложные задачи, не выходя за рамки обычно синтаксиса.


Автор: gcc 3.3.2009, 01:04
может быть оно еще быстро работает? обращается к переменным? в книге было написнао что хэши медленно работают чем массивы в ООП...

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

есть переменная $tie, что произойдет если ее "привязать"?

Автор: sir_nuf_nuf 3.3.2009, 02:47
gcc, просто прочитайте про tie в кэмел-буке.
быстрее точно не будет.
А по поводу того, что доступ к хэшу не самый быстрый.. ну вы сначала упритесь в это ограничение а потом оптимизируйте. сэкономите время

Автор: gcc 3.3.2009, 12:53
Цитата(sir_nuf_nuf @ 3.3.2009,  02:47)
gcc, просто прочитайте про tie в кэмел-буке.

что это такое?

sir_nuf_nuf,  в книге "Рецепты для профессионалов" 2 и 3 издание, есть примеры рабоыт с базой данных в файле, и там не написано какой формат файла (не понятно зачем вообще это), то есть просто про БД файл... про применения в ООП ни где нету

в интернете я не нашел про это ничего...

Цитата(sir_nuf_nuf @ 3.3.2009,  02:47)
ну вы сначала упритесь в это ограничение а потом оптимизируйте. сэкономите время

спасибо, понял, знаю... мне скорость не нужна

Автор: sir_nuf_nuf 3.3.2009, 16:03
Вообще странная мода учить Perl по примерам, хотя вы не первый кто ей следует.

Tie - это возможность расширить возможности стандартных конструкций языка (%@*$)
своим кодом (который обычно предствален в виде объектов, но это не имеет значения)

ООП - это идеология согласно которой любой интерфес представляет собой набор Классов.
Т.е. доступ ко всему происходит по средством создания объектов и вызова методов.

В ООП вообще ничего не говорится про внутрениие структуры языка, соответвенно и про tie.


Другой вопрос - это реализация ООП в Perl - собственно говоря она сводится к 3 вещам:
1) объект - это blessed reference
2) при объектном вызове (->) эта ссылка передается в процедуру первым аргументом
3) ну и наследование.

Сами объекты вы можете реализовывать как вам угодно. Но поскольку вам дана полная свобода выбора
как хранить данные и как к ним обращаться, то вы можете использовать что угодно, хоть например tie.

Автор: gcc 3.3.2009, 19:36
sir_nuf_nuf, спасибо...

а примеры можно с tie? я не вижу приемущества...

Автор: gcc 4.3.2009, 15:29
вот например есть

Код

    package NewHash;
    require Tie::Hash;

    @ISA = (Tie::Hash);

    sub DELETE { ... }        # Provides needed method
    sub CLEAR { ... }        # Overrides inherited method


    package NewStdHash;
    require Tie::Hash;

    @ISA = (Tie::StdHash);

    # All methods provided by default, define only those needing overrides
    # Accessors access the storage in %{$_[0]};
    # TIEHANDLE should return a reference to the actual storage
    sub DELETE { ... }

    package NewExtraHash;
    require Tie::Hash;

    @ISA = (Tie::ExtraHash);

    # All methods provided by default, define only those needing overrides
    # Accessors access the storage in %{$_[0][0]};
    # TIEHANDLE should return an array reference with the first element being
    # the reference to the actual storage 
    sub DELETE { 
      $_[0][1]->('del', $_[0][0], $_[1]); # Call the report writer
      delete $_[0][0]->{$_[1]};          #  $_[0]->SUPER::DELETE($_[1]) }


    package main;

    tie %new_hash, 'NewHash';
    tie %new_std_hash, 'NewStdHash';
    tie %new_extra_hash, 'NewExtraHash',
    sub {warn "Doing \U$_[1]\E of $_[2].\n"};  


Код


  package ReportHash;
  our @ISA = 'Tie::StdHash';

  sub TIEHASH  {
    my $storage = bless {}, shift;
    warn "New ReportHash created, stored in $storage.\n";
    $storage
  }
  sub STORE    {
    warn "Storing data with key $_[1] at $_[0].\n";
    $_[0]{$_[1]} = $_[2]
  }



Код

  package ReportHash;
  our @ISA = 'Tie::StdHash';

  sub TIEHASH  {
    my $storage = bless {}, shift;
    warn "New ReportHash created, stored in $storage.\n";
    [$storage, @_]
  }
  sub STORE    {
    warn "Storing data with key $_[1] at $_[0].\n";
    $_[0][0]{$_[1]} = $_[2]
  }  


что такое $_[0][0]{$_[1]} = $_[2] ?
  

в чем разница если я сделаю так, например:
Код

$self->[0]->[0]->{hash0}->{hash1} ='page1';
$self->[0]->[0]->{hash0}->{hash1} = sub {};

$self->[0]->[1]->{hash0}->{hash1} ='page2';
$self->[0]->[1]->{hash0}->{hash1} = sub {};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)