Oop Perl5中的OO范式和封装实例变量
我需要一种在Perl中生成真正封装的变量的方法,而不使用任何框架(如Moose),这样您就只能通过getter和setter访问实例变量。应该有私有实例变量 子例程和方法都不是问题,因为您可以定义它们,以便仅通过实例和引用使用它们。但是变量总是可以通过包名访问,比如类变量Oop Perl5中的OO范式和封装实例变量,oop,variables,instance,perl,Oop,Variables,Instance,Perl,我需要一种在Perl中生成真正封装的变量的方法,而不使用任何框架(如Moose),这样您就只能通过getter和setter访问实例变量。应该有私有实例变量 子例程和方法都不是问题,因为您可以定义它们,以便仅通过实例和引用使用它们。但是变量总是可以通过包名访问,比如类变量 有什么方法可以防止这种情况发生吗?要实现真正的私有变量,您应该使用闭包: { my $x; sub get { return $x; } sub set {
有什么方法可以防止这种情况发生吗?要实现真正的私有变量,您应该使用闭包:
{
my $x;
sub get {
return $x;
}
sub set {
$x = shift;
}
}
set( 3 );
print get(); # prints 3
print $x; # ERROR
# Example with objects
package Class;
sub new {
bless {}, 'Class';
}
{
my $storage = {};
sub get {
$self = shift;
return $storage->{ "$self" };
}
sub set {
$self = shift;
$storage->{ "$self" } = shift;
}
}
package main;
print Class::x; #ERROR
$z = Class::new();
$z->set( 3 );
$y = Class::new();
$y->set( 5 );
print $y->get(); # 5
print $z->get(); # 3
$x
是块的本地代码。只有set
和get
可以访问它。“$self”类似于“Class=HASH(0x1cf9160)”。因为每个对象在内存中都有自己的地址,“$self”永远不会冲突
但实际上,在另一种情况下,您不需要这样做,因为这将是车轮上的一根棍子要执行真正的私有变量,您应该使用闭包:
{
my $x;
sub get {
return $x;
}
sub set {
$x = shift;
}
}
set( 3 );
print get(); # prints 3
print $x; # ERROR
# Example with objects
package Class;
sub new {
bless {}, 'Class';
}
{
my $storage = {};
sub get {
$self = shift;
return $storage->{ "$self" };
}
sub set {
$self = shift;
$storage->{ "$self" } = shift;
}
}
package main;
print Class::x; #ERROR
$z = Class::new();
$z->set( 3 );
$y = Class::new();
$y->set( 5 );
print $y->get(); # 5
print $z->get(); # 3
$x
是块的本地代码。只有set
和get
可以访问它。“$self”类似于“Class=HASH(0x1cf9160)”。因为每个对象在内存中都有自己的地址,“$self”永远不会冲突
但实际上,在另一种情况下,您不需要这样做,这将成为车轮上的一根棍子听起来您试图阻止人们通过访问器以外的方式访问实例变量;是这样吗 Perl是一种面向有礼貌的人的语言,你阻止程序员做你不想让他们做的事情的方法就是要求他们不要做。是的,有黑客,这里最明显的一个就是将每个对象都作为一个闭包(),但是几乎总是有办法绕过它们,所以你无法阻止这个决意无礼的黑客 其中之一就是这个,这很好地解释了我的观点 Perl并不迷恋强制隐私。它宁愿你不去它的客厅,因为你没有被邀请,而不是因为它有一把猎枪
听起来你试图阻止人们访问实例变量,而不是通过访问器;是这样吗 Perl是一种面向有礼貌的人的语言,你阻止程序员做你不想让他们做的事情的方法就是要求他们不要做。是的,有黑客,这里最明显的一个就是将每个对象都作为一个闭包(),但是几乎总是有办法绕过它们,所以你无法阻止这个决意无礼的黑客 其中之一就是这个,这很好地解释了我的观点 Perl并不迷恋强制隐私。它宁愿你不去它的客厅,因为你没有被邀请,而不是因为它有一把猎枪
人们试图用由内而外的物体来达到这种目的。很好地解释了这一点:
- 2002年,荷兰Perl黑客Abigail首次提出了Inside-out对象
- 2002年春天——阿姆斯特丹下午一点第一次提到
- 2002年6月28日–YAPC NA“两种面向对象的替代方法”
- 2002年7月1日——第一次提到帕尔蒙克斯
- 最近,随着Damian Conway的Perl最佳实践的发布,作为推荐的最佳实践而受到关注(臭名昭著?)
- 尽管它们有好处,但它们带来了巨大的复杂性,并没有受到普遍欢迎
Object::InsideOut
模块提供了此技术的全面实现,您可以在野外看到它或其他InsideOut模块
人们试图用由内而外的物体来达到这种目的。很好地解释了这一点:
- 2002年,荷兰Perl黑客Abigail首次提出了Inside-out对象
- 2002年春天——阿姆斯特丹下午一点第一次提到
- 2002年6月28日–YAPC NA“两种面向对象的替代方法”
- 2002年7月1日——第一次提到帕尔蒙克斯
- 最近,随着Damian Conway的Perl最佳实践的发布,作为推荐的最佳实践而受到关注(臭名昭著?)
- 尽管它们有好处,但它们带来了巨大的复杂性,并没有受到普遍欢迎
Object::InsideOut
模块提供了该技术的全面实现,您可以在