왜 루비의 attr_accessor, attr_reader 및 attr_writer를 사용합니까?
Ruby는 다음과 같은 키를 사용하여 인스턴스 변수를 공유하는 편리하고 편리한 방법을 가지고 있습니다.
attr_accessor :var
attr_reader :var
attr_writer :var
내가 왜 선택하겠어요?attr_reader
또는attr_writer
간단히 말하자면.attr_accessor
(내가 의심하는) 성능과 비슷한 것이 있습니까?이유가 있는 것 같아요, 그렇지 않았다면 그런 열쇠를 만들지 못했을 거예요.
당신은 다른 접근자들을 사용하여 당신의 코드를 읽는 다른 사람에게 당신의 의도를 전달하고, 그들의 공개 API가 어떻게 호출되든 간에 올바르게 작동하는 클래스를 더 쉽게 작성할 수 있습니다.
class Person
attr_accessor :age
...
end
여기서, 저는 제가 나이를 읽고 쓸 수 있다는 것을 알 수 있습니다.
class Person
attr_reader :age
...
end
여기서, 저는 제가 단지 나이를 읽을 수 있다는 것을 알 수 있습니다.이 클래스의 생성자에 의해 설정되고 이후에도 일정하게 유지된다고 상상해 보십시오.나이에 대한 돌연변이(작성자)가 있고 한 번 설정된 나이가 변하지 않는다고 가정하여 클래스가 작성된 경우, 해당 돌연변이를 호출하는 코드에서 버그가 발생할 수 있습니다.
하지만 이면에서 무슨 일이 일어나고 있을까요?
다음을 작성하는 경우:
attr_writer :age
이는 다음으로 변환됩니다.
def age=(value)
@age = value
end
다음을 작성하는 경우:
attr_reader :age
이는 다음으로 변환됩니다.
def age
@age
end
다음을 작성하는 경우:
attr_accessor :age
이는 다음으로 변환됩니다.
def age=(value)
@age = value
end
def age
@age
end
이에 대해 생각해 볼 수 있는 또 다른 방법은 다음과 같습니다.특성이 없는 경우...도우미들, 그리고 액세서리를 직접 작성해야 했습니다, 당신은 당신의 학급이 필요로 하는 것보다 더 많은 액세서리를 작성할 것입니까?예를 들어, 나이를 읽기만 하면 된다면, 그것을 쓸 수 있는 방법도 쓸 수 있습니까?
위의 모든 답변이 정답입니다.attr_reader
그리고.attr_writer
간단한 방법을 수동으로 입력하는 것보다 쓰기가 더 편리합니다.그 외에도 방법 정의를 직접 작성하는 것보다 훨씬 더 나은 성능을 제공합니다.자세한 내용은 Aaron Patterson의 이 강연(PDF) 이후 슬라이드 152를 참조하십시오.
접근자는 변수에 대한 액세스를 제한하지만 내용은 제한하지 않는다는 점을 이해하는 것이 중요합니다.루비에서는 다른 OO 언어와 마찬가지로 모든 변수가 인스턴스에 대한 포인터입니다.예를 들어 해시에 대한 속성이 있고 "읽기 전용"으로 설정한 경우에는 항상 해당 내용을 변경할 수 있지만 포인터의 내용은 변경할 수 없습니다.이것을 보십시오.
> class A
> attr_reader :a
> def initialize
> @a = {a:1, b:2}
> end
> end
=> :initialize
> a = A.new
=> #<A:0x007ffc5a10fe88 @a={:a=>1, :b=>2}>
> a.a
=> {:a=>1, :b=>2}
> a.a.delete(:b)
=> 2
> a.a
=> {:a=>1}
> a.a = {}
NoMethodError: undefined method `a=' for #<A:0x007ffc5a10fe88 @a={:a=>1}>
from (irb):34
from /usr/local/bin/irb:11:in `<main>'
보시다시피 해시 @a에서 키/값 쌍을 삭제할 수 있습니다. 새 키를 추가하고 값을 변경하며 ecceta를 사용할 수 있습니다.그러나 읽기 전용 인스턴스 변수이므로 새 개체를 가리킬 수 없습니다.
개체의 모든 특성이 클래스 외부에서 직접 설정되는 것은 아닙니다.모든 인스턴스(instance) 변수에 대한 작성기가 있다는 것은 일반적으로 약한 캡슐화의 신호이며 클래스 간에 너무 많은 커플링이 발생하고 있다는 경고입니다.
실질적인 예로 다음을 들 수 있습니다.저는 당신이 컨테이너 안에 물건을 넣는 디자인 프로그램을 만들었습니다.그 물건은attr_reader :container
그러나 물품의 용기가 변경되어야 하는 유일한 시간은 새로운 용기에 배치되는 시간이기 때문에 작성자를 제안하는 것은 말이 되지 않았습니다. 또한 위치 정보가 필요합니다.
클래스 외부에서 인스턴스(instance) 변수에 항상 액세스할 수 있는 것은 아닙니다.인스턴스(instance) 변수에 대한 읽기 액세스를 허용하는 것이 타당한 경우가 많지만, 해당 변수에 대한 쓰기는 그렇지 않을 수 있습니다(예: 읽기 전용 소스에서 데이터를 검색하는 모델).반대로 원하는 경우도 있지만, 제 머리 속에서 생각나지 않는 경우는 없습니다.
언급URL : https://stackoverflow.com/questions/5046831/why-use-rubys-attr-accessor-attr-reader-and-attr-writer
'programing' 카테고리의 다른 글
PyInstaller로 데이터 파일 번들(--파일 하나) (0) | 2023.06.06 |
---|---|
ispmanager mysql 설정이 비어 있습니다.편집 버튼이 비활성화되었습니다((). (0) | 2023.06.06 |
이름별 데이터 프레임 열 삭제 (0) | 2023.06.06 |
iOS iPhone X, iPhone 6 plus, iPhone 6, iPhone 5, iPhone 4를 매크로로 감지하는 방법? (0) | 2023.06.06 |
"pip install -e"의 사용 사례는 무엇입니까? (0) | 2023.06.06 |