2009-05-22 6 views
14

자백 : 나는 단지 비공개공개 나의 방법에 대한 가시성을 사용합니다!Rails에서 보호 된 가시성을 사용하고 있습니까?

나는 이것이 나쁜 것 같다. 그러나 Rails에서는 문제가되지 않는 것 같습니다.

레일스에서 ​​사용하지 않는 큰 실수가있는 사람이 누구입니까 가시성을 보호합니까?

답변

9

업데이트 - true explanation of protected/private in Ruby에 링크 된 아래 댓글을 참조하십시오. 그것은 실제로 자바 시대에 남겨진 깊은 자리 잡은 편견이었습니다. 내 대답에 남은 유일한 부분은 동작이 아닌 컨트롤러 메서드가 public이 아니어야합니다 (또는 적어도 경로가 해당 메서드를 보호해야 함).

단일 테이블 상속은 protected이 모델 계층에서 유용 할 때 완벽한 예제입니다. 이는 상속의 가장 일반적인 용도 중 하나이기 때문입니다. 그들은 다른 컨트롤러에 액세스 할 수 없을 것입니다 private 인 경우에, 그러나 경우 public 레일 행위로 취급하므로 - 컨트롤러 계층에서

ApplicationController에 정의 된 헬퍼 메소드는 protected로 표시되어야한다.

개인적으로 필자는 레일 애플리케이션 에서조차 많은 친구들과 동료들보다 계급 상속을 많이 사용하고 있음을 발견했습니다. 내가 자주 사용하기 때문에 (그리고 자바 일에서 나오기 때문에), 나는 도우미 메서드를 사용하여 누구나 (보통 나 자신) 클래스를 확장하고자하는 사람에게 자유를주기 위해 protected을 선호한다. 나는 그것을 private으로 표시한다. :)

+0

그것은 많은 의미가 있습니다. (STI가 어떤 것인지 확실하지 않음). –

+3

"ApplicationController에 정의 된 도우미 메소드는 protected로 표시되어야합니다. 다른 사람이 개인용이면 다른 컨트롤러가 액세스 할 수 없습니다."- fyi, 올바르지 않습니다. http://pastie.org/842898에서 예를 참조하십시오. 루비의 보호 된/개인은 상속이 아니라 '자기'와 수신자에 관한 것입니다. "Java와 같은 언어와 달리 상속은 Ruby에서 메소드 가시성을 결정하는 데 절대적으로 사용되지 않습니다." - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

고마워요, 요르단. 네가 옳아. 나는 작은 메모를 추가했습니다. –

0

나는 SingleTableInheritance이

Person 클래스 < AR : 기본 클래스 교사 < 사람 CALSS 학생 < 사람

내가 학생 및 교사에 대한 일반적인 개인 방법을 구현하기 위해 보호 방법을 사용 :

class Person < AR::base 
    def self.find(*args) 
    reject_leaves(super(*args)) 
    end 
protected 
    def self.reject_leaves(target) #like a private in Teacher and Student 
    case target 
     when Array target.select{|t| reject_leaves(t)} 
     when Person (target.leave_date < Date.today ? target : nil) 
     else target 
    end 
    end 
end 

면책 조항 :이 기능을 구현하는 행위와 같은 플러그인이 있습니다. 저는 여기에 당신에게 사건을 보여주기 위해 사용하지만 좀 더 복잡한 풍경이 있습니다.

+0

fyi 위의 예제가 올바르게 작동하지 않습니다. 문제없이 'Person.reject_leaves (...)'를 호출 할 수 있습니다. 루비의 'public/protected/private'은 키워드가 아니며 'self'의 상태를 수정하는 'self'에 대한 메소드 호출입니다. 당신이'자기를 def '할 때 당신이'self'를 바꾸기 때문에. reject_leaves' 당신은 더 이상'protected' 상태를 설정하지 않습니다. 당신이 원하는 것을 얻으려면 두 번째 예제 ('Prot2')와 같은 것이 필요합니다 : http://pastie.org/842952 –