2014-04-18 2 views
0

나는 무스를 처음 접했고, 모범 사례를 따르려고 노력해왔다. 우리가 할 수있을 때 수업을 불변으로 만들려고 노력해야한다는 것을 이해합니다. 내 질문은, 개체 건설 후, 우리는 setter를 사용하여 공용 속성의 값을 변경할 수 있으며 여전히 클래스를 변경할 수 있습니까?무스를 사용하여 변경 불가능한 클래스의 속성 값 변경하기

+1

는 불변이 아니라 * 만드는 인스턴스는 불변 * * * 표시 클래스를 만든다. 하지만 인스턴스를 불변으로 만드는 것을 (속성을 읽기 전용으로 만들어서) 추가하는 것이 일반적으로 좋은 생각입니다. 가변 인스턴스로 인해 거리에서 작업이 발생할 수 있습니다 (코드의 두 부분에서 동일한 객체에 대한 참조가있는 경우 하나는 객체를 변경할 수 있고 다른 객체는 변경 사항을 볼 수 있습니다). 그러면 디버그하기가 더 어려워지는 코드로 이어질 수 있습니다 . 가변 인스턴스가 필요한 경우도 있지만 가능하면 코드를 피하도록 디자인해야합니다. – tobyink

답변

1

예. 클래스가 불변 인 경우, 이는 클래스에 새로운 속성이나 새로운 메소드를 추가 할 수 없다는 것을 의미합니다. 이것은 무스 시스템이 깔끔한 최적화를 수행 할 수있게합니다.

클래스의 인스턴스는 여전히 돌연변이 될 수 있습니다. 인스턴스가 변경 가능하지 않게하려면 모든 속성이 읽기 전용이어야합니다 (is => 'ro').

예 : 다음

package MyClass; 
use Moose; 

has attr => (is => 'rw'); # this attribute is read-write 

__PACKAGE__->meta->make_immutable; 
# after this, no new attributes can be added 

: make_immutable` 대답,`__PACKAGE __-> 메타>의 @ 아몬 당으로

my $instance = MyClass->new(attr => "foo"); 

say $instance->attr; # foo 
$instance->attr("bar"); # here, we change the instance, but not the class 
say $instance->attr; # bar 
+0

삭제 해 주셔서 감사합니다! –