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 ��Ȥä�Ĵ�٤뤳�Ȥ��Ǥ��ޤ���
�����ࡢ��ñ�������ΤĤ�꤬�ʤ󤫤����֤�Ĺ������ˤʤäƤ��ޤä���
- http://d.hatena.ne.jp/notonobuharu/20051012
- http://d.hatena.ne.jp/lethevert/20051013
- http://d.hatena.ne.jp/Itisango/20051013
- http://hatena.g.hatena.ne.jp/hatenamagazine/20051013
- http://d.hatena.ne.jp/m-hiyama/20051014
- http://d.hatena.ne.jp/rna/20051014
- http://beta.g.hatena.ne.jp/yukatti/20051014
- http://d.hatena.ne.jp/Buzzstyle/20051015
- http://d.hatena.ne.jp/yomoyomo/20051017
- http://d.hatena.ne.jp/bakelatta/20051018
- http://d.hatena.ne.jp/Bayside/20051103