2013-03-30 3 views
0

저는 "Beginning Ruby"이라는 책을 가지고 일하고 있습니다. 캡슐화 할 때까지 모든 것이 잘되어 가고있었습니다. 이 코드가 무엇을하는지 알아낼 수 있습니다. 왜이 방법으로이 방법을 설정했는지 알 수 없습니다.루비 캡슐화

this is the link 페이지에 캡슐화 된 책이 있습니다.

class Person 
    def initialize(name) 
     set_name(name) 
    end 

    def name 
     @first_name + ' ' + @last_name 
    end 

    def set_name(name) 
     first_name, last_name = name.split(/\s+/) 
     set_first_name(first_name) 
     set_last_name(last_name) 
    end 

    def set_first_name(name) 
     @first_name = name 
    end 

    def set_last_name(name) 
     @last_name = name 
    end 
end 

p = Person.new("Fred Bloggs") 
puts p.name 

는 이런 일이 동일한을 달성 할 수 나에게 보인다

class Person 
    def initialize(name) 
     @first_name, @last_name = name.split(/\s+/) 
    end 

    def name 
     @first_name + ' ' + @last_name 
    end 
end 

p = Person.new("Fred Bloggs") 
puts p.name 

왜 자신의 별도의 방법에서 개체 변수를 설정하는 문제를 통해 이동?

+2

과 같이 처리합니다. 캡슐화 작업을하기 때문에. 캡슐화 란 변수를 분리하고 액세스하고 수정하는 안전한 방법을 노출하는 것을 의미합니다. –

+0

to_s 메서드를 재정의하고 name이라는 메서드를 사용하지 않고 해당 개체를 텍스트로만 표현할 수 있습니다. – kainlite

답변

1

Setter 메서드는 이미 존재하는 개체의 상태를 수정하는 데 유용합니다. 귀하의 경우에는 사람의 이름이 "일종의"불변입니다. 사람의 이름은 변경할 수 없으며 새 이름으로 만 새 사람을 만들 수 있습니다. 여기

1

당신은 유사한 설명을 찾을 수 있습니다 - Classes in Ruby Using Getters and Setters

p RUBY_VERSION 

class Person 
    def initialize(name) 
     set_name(name) 
    end 

    def name 
     @first_name + ' ' + @last_name 
    end 

    def set_name(name) 
     first_name, last_name = name.split(/\s+/) 
     set_first_name(first_name) 
     set_last_name(last_name) 
    end 

    def set_first_name(name) 
     @first_name = name 
    end 

    def set_last_name(name) 
     @last_name = name 
    end 
end 

John = Person.new("Fred Bloggs") 
p John.name # now suppose you misrepresented the last name at time of `John` object creation. Then what would you do? 

John.set_last_name "roy" # this setter method would then help you out to update the last name. 

p John.name 

설명 : 어떤 일이 잘못된 정보 당신이있는 경우는, 객체 생성과 같은 그 사람의 시간에 사람 이름을 설정하는 경우 시간 생성시 입력 한 내용은 변경할 수 없습니다. 코드의 두 번째 부분에는 세터가 없으므로

출력 : 그들은 꽤 많이 당신에게 인스턴스 변수에 대한 getter 및 setter의 아주 기본을 가르치는

"2.0.0" 
"Fred Bloggs" 
"Fred roy" 
1

. 인스턴스 변수에 직접 액세스해야하는 코드 작성 방법으로 변수를 변경하려고한다고 가정 해보십시오. 대신 인스턴스 변수에 대한 완전한 액세스 권한을 부여하지 않고 클래스 외부에서 변수를 사용할 수 있도록 해당 변수에 대한 액세스를 허용하는 메소드를 작성합니다.

attr_accessor, attr_readerattr_writer은 인스턴스 변수에 대한 접근자를 동적으로 만드는 매크로와 비슷하다고 가정합니다.

1

사용자 이름과 같은 이름이 있다고 가정합니다. 이 두 가지 메소드가있는 클래스는 사용할 수 없습니다. 원래 클래스에서는 그냥

Person.new("Stephan").set_last_name("de Vries")