🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #52128

Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami

#52128
From: Jarosław Lubczyński
Date: Wed, 05 Jan 2011 21:12
149 lines
6143 bytes
W dniu 2011-01-05 12:46, Ireneusz Pluta pisze:
> On 4 Sty, 23:34, Jarosław Lubczyński<gu...@who.com.pl>  wrote:
>> W dniu 2011-01-04 17:27, Ireneusz Pluta pisze:
>>
>>> On 4 Sty, 13:57, Jaros aw Lubczy ski<gu...@who.com.pl>    wrote:
>>>> Dodatkowo na wlinkowanej przez Ciebie stronie
>>>> wspomniano Moose, o kt rym wcze niej czyta em, e jest pakietem
>>>> znakomitym, chocia nieco ci kim.
>>> maszyna mo e nie mie lekko, ale Ty dostaniesz skrzyde . Spr buj sam i
>>> oce .
>>
>> Oceni em. A w a ciwie Benchmark oceni :). Z trzech testowanych przeze
>> mnie pakiet w implementuj cych InsideOut Objects (Moose, Class::Std,
>> Object::InsideOut)
>
> Moose nie jest inside out, tylko blesowanym haszem:
>
> #v+
> perl -MMoose -MData::Dumper -le 'package Foo; use Moose; use
> Data::Dumper; has raz =>  (is =>  "rw"); my $o = __PACKAGE__->new( raz
> =>  "dwa"); print Dumper [ $o->raz, $o->{raz}, $o ];'
> $VAR1 = [
>            'dwa',
>            'dwa',
>            bless( {
>                     'raz' =>  'dwa'
>                   }, 'Foo' )
>          ];
> #v-

Dzięki, faktycznie nie sprawdziłem tego.

>
> Ale jeżeli zależy Ci na insajdautowości, możesz użyć
> MooseX::InsideOut.

Spodobała mi się ta technika, nie powiem :). Moose / Mouse też. Ale 
przykładu podanego przez kol. Michała Jankowskiego nie daje się 
bezpośrednio zaadaptować:

package My::ClassA;
{
     use Moose;

     has data => (is => 'rw', isa => 'Int', required => '1');
     has para => (is => 'rw', isa => 'Int', required => '1');

     no Moose;
}

package My::ClassB;
{
     use Moose;

     has data => (is => 'rw', isa => 'Int', required => '1');
     has parb => (is => 'rw', isa => 'Str', required => '1');

     no Moose;
}

package My::ClassC;
{
     use Moose;
     extends qw( My::ClassA My::ClassB);

     has info => (is => 'rw', isa => 'Str', required => '1');

     no Moose;
}

package main;

$obj = My::ClassC->new # BŁĄD!
(
     {
         'info' => 'help',
         'My::ClassA' => { data => 11},
         'My::ClassB' => { data => 31},
         'para' => 4342,
         'parb' => 'ma kota',
     }
);

print $obj->My::ClassA::data(), "\n";
print $obj->My::ClassB::data(), "\n";
print $obj->para(), "\n";
print $obj->parb(), "\n";
print $obj->info(), "\n";

__END__

Przy wywołaniu My::ClassC->new dostaję błąd:

Attribute (data) is required at
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line 
603
Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x9a2347c)',
'HASH(0x9a324ec)') called at
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line 
576
....

Zamiana use Moose na use MooseX::InsideOut nic nie daje.
Gdzie jest błąd? Jak powinno wyglądać wywołanie? Znowu jakoś nie mogę 
znaleźć rozwiązania w Sieci...


>
>> Moose zachowuje si znakomicie je eli chodzi od
>> szybko akcesor w (nawet z kontrol typ w nie jest le), natomiast
>> zdecydowanie szybciej od pozosta ych konstruuje obiekty. Co chyba
>> przes dza spraw . Zw aszcza, e sk adnia Moose'a jest naprawd bardzo,
>> bardzo :). Aha, nie testowa em jeszcze wielokrotnego dziedziczenia.
>
> Skoro już tak systematycznie zabierasz się za temat, to może dołącz do
> testów jeszcze Mouse? ->  http://search.cpan.org/~gfuji/Mouse-0.88/lib/Mouse.pm


Jak napisałem, testy Mouse'a już wcześniej zdążyłem przeprowadzić, 
wypadły rewelacyjnie, teraz dołączyłem MooseX::InsideOut. Najlepiej 
wychodzi Mouse, najgorzej MooseX::InsideOut oraz Object::InsideOut i 
Class::Std. Wygląda, że hermetyzacja przez obiekty odwrócone jest 
baardzo kosztowna. Ale dlaczego? Niespecjalnie mogę zrozumieć. 
Konstrukcja jest przecież tyleż efektowna co prosta.

Mouse z kontrolą typów jest w teście mieszanym ( konstruktor + 
destruktor + 10x wywołanie obu akcesorów dla pola) jest niemal 20x 
(dwadzieścia razy) szybszy od MooseX::InsideOut. Masakra... Spróbuję 
jeszcze jednego rozwiązania zanim podejmę ostateczną decyzję, który 
pakiet wybrać.

Przy okazji. Użycie Mouse generuje ostrzeżenie:

Prototype mismatch: sub Mouse::Util::get_linear_isa ($;$) vs none at 
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Mouse/Util.pm 
line 178.

W Sieci nie znalazłem niczego co pozwoliłoby pozbyć się tego komunikatu. 
Co mogę z tym zrobić?


-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Technical Details
Message-ID: <ig2mrl$2cl$1@inews.gazeta.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <ie9uh2$qfj$1@opal.futuro.pl> <kjzr5dheupb.fsf@ccfs1.fuw.edu.pl> <iedin2$bbc$2@inews.gazeta.pl> <kjzmxo5con2.fsf@ccfs1.fuw.edu.pl> <ifanvr$iut$1@inews.gazeta.pl> <kjzipyf7xpf.fsf@ccfs1.fuw.edu.pl> <ifcg1j$a6r$1@inews.gazeta.pl> <72ddf779-ba30-44e8-bf4d-132def818429@fu15g2000vbb.googlegroups.com> <ifv5fs$4ir$1@opal.futuro.pl> <7af449a1-136b-46b1-a3bf-7fc25fc1b8cd@w18g2000vbe.googlegroups.com> <ig07a6$18l$1@inews.gazeta.pl> <8dc8aba4-2abe-42db-82b5-366ba34a9d8d@l7g2000vbv.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Jarosław Lubczyński <guess@who.com.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: Wielokrotne dziedziczenie z jawnym
 wywołaniem konstruktorów klas bazowych z parametrami
Date: Wed, 05 Jan 2011 22:12:03 +0100
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 150
Message-ID: <ig2mrl$2cl$1@inews.gazeta.pl>
References: <ie9uh2$qfj$1@opal.futuro.pl> <kjzr5dheupb.fsf@ccfs1.fuw.edu.pl> <iedin2$bbc$2@inews.gazeta.pl> <kjzmxo5con2.fsf@ccfs1.fuw.edu.pl> <ifanvr$iut$1@inews.gazeta.pl> <kjzipyf7xpf.fsf@ccfs1.fuw.edu.pl> <ifcg1j$a6r$1@inews.gazeta.pl> <72ddf779-ba30-44e8-bf4d-132def818429@fu15g2000vbb.googlegroups.com> <ifv5fs$4ir$1@opal.futuro.pl> <7af449a1-136b-46b1-a3bf-7fc25fc1b8cd@w18g2000vbe.googlegroups.com> <ig07a6$18l$1@inews.gazeta.pl> <8dc8aba4-2abe-42db-82b5-366ba34a9d8d@l7g2000vbv.googlegroups.com>
NNTP-Posting-Host: apn-95-41-63-1.dynamic.gprs.plus.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1294261942 2453 95.41.63.1 (5 Jan 2011 21:12:22 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Wed, 5 Jan 2011 21:12:22 +0000 (UTC)
X-User: eljot_007
In-Reply-To: <8dc8aba4-2abe-42db-82b5-366ba34a9d8d@l7g2000vbv.googlegroups.com>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit