The Wayback Machine - https://web.archive.org/web/20060201064123/http://d.hatena.ne.jp:80/naoya/20051012/1129115986
Hatena::Diarytri ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯ ¤Ï¤Æ¤Ê¥Õ¥©¥È¥é¥¤¥Õ
    
¤Ï¤Æ¤Ê
 ï¿½è¤¦ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½  �ǿ������� �桼������Ͽ �������� �إ��

naoya¤Î¤Ï¤Æ¤Ê¥À¥¤¥¢¥ê¡¼

�ϤƤʤΤ��ȡ����ѤΤ��ȡ������֤Τ��ȡ������ν������

October 12, 2005

�� ��ե���󥹤ν۴Ļ��Ȥˤ�����꡼���� Scalar::Util::weaken �Dz�褹��

Perl �Υ��١������쥯�����(GC)�μ����ˤϥ�ե���󥹥������������GC�����Ѥ���Ƥ��ޤ�����ե���󥹥�����ȤȤ����Τϡ�����ǡ�����¤�䥪�֥������Ȥ����ä��ݡ������򻲾Ȥ����ե���󥹤ο��������Ǵ������ơ����ο��� 0 �ˤʤä�����꤫����Τ��˴�����Ȥ������ȤߤǤ���(Java��Ruby�ʤɤ�¾�����GC�����ˤĤ��Ƥ� 'Perl��Java��Ruby �ˤ����� GC ���르�ꥺ��' �������)

��ե���󥹥�����ȼ�GC�ϡ����Ȥߤ�����ץ��ʬ����䤹�����������ȿ�̡���߻��Ȥ������ǻ��Ȥ��ڤ뤳�Ȥ��Ǥ����˥��֥������Ȥ��������줺����̥���꡼�������������礬����Ȥ�����������äƤ��ޤ���

���Υ���꡼���ϥХå�������ץȤ� CGI �Τ褦�ˡ����٤μ¹Ԥ� Perl �Υץ��������Τ�Τ���λ����ץ������ǤϤ��ޤ�����ˤʤ�ޤ��󤬡��ǡ����ץ�����ࡢ���뤤�� mod_perl �� FastCGI �Τ褦�� Perl �Υץ��������³�������Ƥ���褦�ʴĶ��Ǥϥǡ����Υץ������� httpd �����֤ȶ�������³�����ꤹ�븽�ݤ�ȯ������Τ����Ǥ���(Apache �� RequestPerChild �����ꤹ��Ȥ�����ο�����ȤϤǤ��ޤ�����) �ޤ����ǥ��ȥ饯��(DESTROY)��ɬ���ƤФ�뤳�Ȥ���Ԥ��Ʋ����ü�ʥ����å���������Ƥ����(���⤽�⤽�����ä���������ΤϹ��ޤ����ʤ��Ǥ���)�ˤ��ܤ˰��ä���⤷�ޤ���

���Υ��������������������֤�ʤ�����ˤ�޲򤷤Ƥߤޤ���

��ޤ��ä����꤬�ʤ����λ��ȴط����ݤ��Τ����֥������Ȥ��������ե���󥹤������Ǥ���A �Ͽޤ˼����Ƥ��ʤ��̤Υ��֥������Ȥ��黲�Ȥ���Ƥ���Ȥ��ޤ���

�ƥ��֥������ȤϤ��줾��1�ĤΥ��֥������Ȥ��黲�Ȥ���Ƥ���Τǡ������˼������٤ƤΥ��֥������ȤΥ�ե���󥹥�����Ȥ�1�ˤʤ�ޤ��������Ǥ��Ȥ��� B ����ʬ�Υ������פγ��˽Ф��Ȥ��ǡ�A �� B �Υ�ե���󥹤��ʤ��ʤä��Ȥ��ޤ�������ȡ�B �Υ�ե���󥹥�����Ȥ� 0 �ˤʤꡢB �ϲ�������ޤ���

�⤷���ޤγ����� A ����Ƥ����ե���󥹤��ʤ��ʤä��Ȥ���ȡ��ޤ� A �Υ�ե���󥹥�����Ȥ� 0 �ˤʤ� A ����������ޤ������ΤȤ� A �� C �ؤΥ�ե���󥹤���äƤ��ޤ�����A ���Ȥ�¾���黲�Ȥ���Ƥ��ʤ��ΤǤ����ޤ��ʤ��˲�������ޤ�������ȡ�A �� C �Υ�ե���󥹤��ڤ�뤿�ᡢC �⼫ưŪ�˲�������ޤ���̵�������٤ƤΥ��֥������Ȥ���������ޤ�����

��������ޤ� A �� C ����߻��Ȥ��Ƥ���ޤǤ���A �Υ�ե���󥹥�����Ȥ� 2������ʳ��� 1 �ˤʤ�ޤ���

����ޤγ����� A ����Ƥ����ե���󥹤��ʤ��ʤä��Ȥ����ǡ�ABC ���ѺѤߤʤΤDz�������Ƥۤ����ΤǤ�����A �Υ�ե���󥹥�����Ȥ� 1 ���ä� 2 ���� 1 �ˤʤ�����ǡ��ޤ���C ���黲�Ȥ���Ƥ��뤻���ǥ�ե���󥹥�����Ȥ��ĤäƤ��뤿�ᡢ��������ޤ�������Ū�� A - C �֤Υ�ե���󥹤��ڤäƤ��ɬ�פ��ФƤ��ޤ�������˵��Ť����˼�ư�Dz��������������� GC �򤢤Ƥˤ��Ƥ���ȥ���꡼����������ޤ���

�虜�Ȥ餷���Ǥ����������ɤˤ���Ȱʲ��Τ褦�ʾ�礬���ƤϤޤ�ޤ���

package Object::A;
use strict;

sub new {
    my $class = shift;
    my $self = {};
    $self->{object_array} = [];
    return bless $self, $class;
}

sub create_b {
    my $self = shift;
    my $b = Object::B->new($self);
    push @{$self->{object_array}}, $b;
    return $b;
}

...

package Object::B;
use strict;

sub new {
    my $class = shift;
    my $self = {};
    $self->{object_a} = shift;
    return bless $self, $class;
}

...

Object::A �� Object::B �δ����� (�㤨�� Prototype �ѥ������ Factory Method �ѥ�����������������󥹥��󥹤�Ф��Ƥ�������פ��⤫�٤�Ȥ�������) ���ä��Ȥ��ޤ���Object::B ���������Ȥ��� Object::A �ˤ����ͤ롢�Ȥ������͡������� Object::B �� Object::A �Υץ��ѥƥ���᥽�åɤ˥�������������������������Τǡ�Object::A �Υ��󥹥��󥹤򥳥󥹥ȥ饯���Ǽ�����äƤ���...�Ȥ�����ΤǤ���

���ΤȤ� Object::A ���󥹥��󥹤ϥꥹ�Ȥ�𤷤� Object::B ���󥹥��󥹤ؤΥ�ե���󥹤���Ĥ��Ȥˤʤꡢ������ Object::B ���󥹥��󥹤� Object::A ���󥹥��󥹤Υ�ե���󥹤���Ĥ��Ȥˤʤ�ޤ�����߻��Ȥ��Ǥ������äƤ��ޤ��ޤ�����

�Ȥ����̤Υ��饹��

{
    my $a = Object::A->new;
    my $b = $a->create_b;
    ...
}

�Ȥ��������ɤ�񤤤��Ȥ����̾�ʤ餳�Υ֥��å���ۤ������ $a �� $b �ϥ������פγ��˽Ф�Τ�¨�¤˲��������Ȥ����Ǥ�������ˤ�ä���߻��Ȥ�����Τǻ�ǰ�ʤ��餽���Ϥ����ޤ���Perl �ץ�������λ���ޤǻ����ۤ��ˤʤ�ޤ���������Ȳ��������뤿��ˤϤɤ����� $b->{object_a} ���뤤�� $a->{object_array} �򥯥ꥢ���Ƥ��ɬ�פ�����ޤ���

���Τɤ����ǡ��Ȥ����Τ��ʼԤǡ�

  • �⤷ A �� B �ò¥¤¥ó¥¹¥ï¿½ï¿½ó¥¹²ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½Æ¤Ó½Ð¤ï¿½ï¿½ï¿½(���饤�����)�Υ����ɤǤ��ˤϡ�Object::A �� Object::B ����μ������ΤäƤ��Ƴ�Ĥ����ľ�ܤ����äƤ��ɬ�פ�����(̵�� OO Ū�ˤ����Ƥʤ�)
  • A �� B �Υ᥽�åɤΤɤ����Ǥ���硢�ɤΥ᥽�åɤ��Ǹ�˸ƤФ�뤫���Ȥ����Τ�������ΤäƤ���ɬ�פ����롣Template Method �ѥ�����ʤɤ�ȤäƤ�����ʳ�����̯�ʴ���
  • A �� B �� close() �Ȥ������᥽�åɤ��Ѱդ��ơ���߻��Ȥò¥¯¥ê¥¢ï¿½ï¿½ï¿½ë¤¿ï¿½ï¿½Î¥ï¿½ï¿½ó¥¿¥Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤Ó½Ð¤ï¿½ï¿½ï¿½ï¿½Ë¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ê¡¢ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½Ç¸ï¿½Ë¸Æ¤ï¿½Ç¤Í¡ï¿½ï¿½ß¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¡ï¿½ï¿½È¤ï¿½

�Ȥ��������ˤʤäƤ��ޤ�������äȷ��ʴ����Ǥ���

�¤Ϥ��礦�ɺ������ϤƤʤΥ����ɤ���ˤ�����߻��Ȥʥ����å���ȯ�����Ƥ��ޤ��������н����ͤ���ɬ�פ�����ޤ����������� id:hideoki �˶����Ƥ��ä��Τ� Yet Another ���ĥ٥����ʲ����ˡ�Ȥ��Ƥ� Weakened reference �Ǥ�����ե���󥹥�����Ȥ� 0 �ˤʤ�ʤ����Ȥ������ʤ顢��߻��Ȥ�ȯ�������ե���󥹤��Ф��ƥ�����ȥ��åפ򤷤ʤ���Ф������Ȥ���������

�ޤǤ����Ȥ������������Υ�ե���󥹤���A ���Ф����ե���󥹥�����Ȥ򥢥åפ����ʤ��ּ夤��ե���󥹡פǤ���а��ֺǽ�����Ʊ�ͤλ��ȴط��ˤʤ뤿�ᡢ���٤ƤΥ��֥������Ȥ�����ʤ���������ޤ���

���� Weakened reference ����ˤ� Scalar::Util �� weaken �᥽�åɤ�Ȥ��� ok �Ǥ���Scalar::Util �� Perl ��ɸ��⥸�塼��ʤΤǤ������Ѥ������ʤ��麣���Ϥ���Ƥ��λȤ������Τ�ޤ�����

�����Ǥ��ȡ����Ȥ���

package Object::B;
use strict;
use Scalar::Util;

sub new {
    my $class = shift;
    my $self = {};
    $self->{object_a} = shift;
    Scalar::Util::weaken($self->{object_a});
    return bless $self, $class;
}

...

�Ȥ��ơ�B �� A �Υ�ե���󥹤���Ƥ��� ok���Ȥʤ�ޤ���

���⤽�⤳�����ä���߻��Ȥ�ɬ�פ��ʤ��ΤǤ���к��ʤ��Ȥ����Τ��٥����Ǥ��������Ť��ʤ������ˤǤ��Ƥ������褯����ޤ��������Ȥ�ȿ��ޤ�������ե�������󥰤ν��Ҥʤ󤫤�Ƥ�Ǥ��Ƥ⡢$self �Ϥ��ˤ�ꥳ���ɤ����ˤ�����ʤ󤫤�ФƤ��ޤ����������������Ȥ򤷤Ƥ��뤦���ˤ��Ĥδ֤ˤ����Ȥ����Τ⤢��Ǥ��礦�������Ȥ��Ƥ� Scalar::Util::weaken �Ȥ����Τ�Ф��Ƥ�����»�Ϥʤ������Ǥ���

��­�Ǥ�����Ǥ�դΥ��֥������ȤΥ�ե���󥹥�����Ȥ������Ĥ��Ȥ����Τ򥳡������Ĵ�٤�ˤ� Devel::Peek �� Devel::Leak ��Ȥä�Ĵ�٤뤳�Ȥ��Ǥ��ޤ���

�����ࡢ��ñ�������ΤĤ�꤬�ʤ󤫤����֤�Ĺ������ˤʤäƤ��ޤä���

# takefumi �إܥ��⡢Scalar::Util�Τ�ޤ���Ǥ��������줳�졢���줬��ꤿ���ä������Ǥ���

�ޤȥ����ɤ򤢤碌�뤿�ᡢObject::B��Object::C�Ȥ��뤫���ޤ��Ѥ���Ȥ褤�ΤǤϤʤ����Ȼפ��ޤ������� (2005/10/17 11:46)

#