Ruby에서 private 메서드를 어디에 둘까요?


95

대부분의 블로그, 자습서 또는 책에는 클래스 / 모듈의 맨 아래에 개인 메서드가 있습니다. 이것이 모범 사례입니까?

필요한 경우 개인 방법이 더 편리하다는 것을 알았습니다. 예를 들면 :

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

이런 식으로 위아래로 계속 스크롤하는 대신 코드를 더 쉽게 읽을 수 있습니다.

이 접근 방식에 심각한 문제가 있습니까? 맨 아래에 개인 메서드를 사용하는 것이 모범 사례가 아닌 다른 것입니까?


실제로 당신의 방식도 나쁘지 않습니다. 나는 또한 그것보다 편리 느낌, 몇 가지 경우에 동일 따라private def my_method...end
r3bo0t

답변:


131

내 관점에서 가장 좋은 방법은 관점에서 비공개로 유지하지 않고 순차적으로 진행하여 메서드를 선언하는 것입니다.

마지막에 다음을 추가하여 모든 메서드를 비공개로 만들 수 있습니다. private :xmethod

예:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

이것이 귀하의 질문을 정당화합니까?


19
수업이 점점 길어짐에 따라 가독성 관점에서 이것은 좋은 생각이라고 생각하지 않습니다.
Alexander Suraphel 2011

2
나는 정말로 당신이 중요성의 순서와 다른 모든 것이 동등 해 보일 때 무엇을 부르는가에 따라 방법을 분류해야한다고 생각합니다. 개인 메서드는 구현 세부 사항이며 독자가 마지막으로 보는 것이므로 파일의 하위에 속해야합니다. 나는 이것이 더 큰 파일에서는 잘 작동하지 않는다는 위의 의견에 동의합니다. 이것은 받아 들여지는 대답이 아니어야합니다.이 페이지에는 훨씬 더 좋은 조언이 있습니다.
Luke Cowell

58

또한 privateRuby 2.1부터 메서드 정의 앞에 추가하는 옵션이 있습니다 .

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

정의를 보면 파일에서 정의 된 위치에 관계없이 메서드가 비공개인지 즉시 알 수 있습니다. (자동 완성하지 않는 경우) 조금 더 입력하고 모든 defs가 잘 정렬 되지는 않습니다 .


5
메서드가 고유 한 이름으로 키를 반환하는 Ruby 2.1에서 사용할 수 있다는 점을 추가해야합니다. bugs.ruby-lang.org/issues/3753
konole

나는 private이 블록으로도 사용될 수 있다고 믿습니다. private begin ... end
edx

의 답을 @devpuppy 참조 여기에 클래스 메소드와 함께이 일에 대한 메모를 위해.
manroe

private이전에 한 번만 추가 해도 ymethod작동합니다. 여러 번 추가 할 필요가 없습니다.
Iulian Onofrei

아래 다른 방법이 있다면 @IulianOnofrei는 zmethod하지 않고를 private,이 방법은 개인 없을 것이다. 따라서 반복해야합니다 (적어도 Ruby 2.3에서는).
tsauerwein

52

다른 사람들이 이미 지적했듯이 규칙은 하나의 private 클래스 아래에 private 메서드를 맨 아래에 두는 것입니다. 그러나 많은 프로그래머가이를 위해 이중 들여 쓰기 (2 대신 공백 4 개) 방법을 사용한다는 사실도 알고 있어야합니다. 그 이유는 종종 텍스트 편집기에 "비공개"가 표시되지 않고 공개 일 수 있다고 가정하기 때문입니다. 그림은 아래를 참조하십시오.

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

이 방법을 사용하면 위아래로 스크롤 할 필요가 없으며 다른 프로그래머가 코드를 더 편안하게 사용할 수 있습니다.


4
12 년에이 댓글을 남겼을 때 정말 분노했습니다. 나는 더 이상 이것을 자주 보지 않으며 호의적으로 떨어졌습니다.
Noah Clark

음부는 내부 포맷 할 수 있습니다 begin..end직후 private. 그런 다음 내부 코드 begin가 (위의 예에서) 의미 적으로 4 개의 공백으로 들여 쓰기 되므로 편집기에서 자동으로 들여 쓰기를 설정할 수 있습니다 .
Petrus Repo

내가 먼저 ... 같은 접근 방식에 따라 public다음private
라훌 고얄에게

1
저는 이것을 본 적이없고 2007 년부터 Ruby로 작업 해 왔습니다. 일반적으로 권장하지 않습니다.
Marnen Laibow-Koser

15

나는 퍼블릭 메소드가 객체의 일종의 인터페이스라고 생각하며, 가장 눈에 띄는 위치, 즉 파일 상단에 배치하는 것이 논리적입니다.


5
예, 일반적으로 파일 상단 근처에 찾을 가능성이 가장 높은 곳에 공개 메소드를 배치하고, 보지 말아야 할 항목은 하단 근처에 묻어 야합니다. 신문 기사가 쓰여진 것처럼 가장 중요한 것부터 시작하세요.
tadman

14

각 방법을 public두거나 private위에 둘 필요가 없습니다 . 나는 보통 모든 개인 메소드를 수업의 맨 아래에 배치합니다. 또한 public기본적으로 메서드가 공개되어 있으므로 명시 적으로 말할 필요가 없습니다 . 예를 들면 :

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end

내 질문을 다시 읽으십시오. 좀 더 구체적으로 수정
ZX12R

1
무엇보다 관습에 가깝습니다. 당신이하고있는 일은 타당하고 그것이 당신에게 더 이해가된다면 그것을 고수해야합니다. 나는 컨벤션이 더 읽기 쉽다는 것을 알지만 아마도 그것이 내가 그것을 쓰는 방법을 배웠기 때문에 익숙해 졌기 때문일 것입니다.
Kyle Decot

메소드를 "공개"로 선언하는 것은 실제로 무엇을 의미합니까?
ZX12R

6

나는 자바 백그라운드에서 왔고 메소드 유형을 보려면 스크롤 해야하는 것이 싫다. 추악함 없이는 메서드별로 메서드 가시성을 지정할 수 없다는 것은 미친 짓이라고 생각합니다. 그래서 나는 #private각 suck 메소드 앞에 주석을 달고 private :....


1
최근 루비는 넣을 수 있습니다 private def method...그것은 더 좋은 가지고
akostadinov

5

각 방법에 대해 공개 또는 비공개를 지정하지 않아도됩니다. 모든 private 메서드를 맨 아래에두면 파일 당 "private"의 단일 인스턴스를 가질 수 있습니다. 맛의 문제인 것 같아요.


5

한 스타일은 함께 이렇게 만 사용하는 것이 그룹 방법이다 privateprotected클래스 당 한 번 기껏. 또 다른 스타일은 메서드 정의 바로 뒤에 가시성을 지정하는 것입니다.

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

Ruby 2.1.0부터는 def메서드 이름을 기호로 반환하므로보다 간소화 된 스타일이 가능합니다.

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(주 우리가 사용하는 private_class_method클래스 메소드 - 그렇지 않으면 우리가 얻을 것 NameError: undefined method때문에 private예상하는 인스턴스 메서드에만 인스턴스 메서드의 가시성에 영향을 원래의 예처럼 매크로로 사용하는 경우에도..)

이 인라인 가시성 스타일이 가장 마음에 듭니다. 원하는대로 메서드를 구성 할 수 있기 때문입니다. 새로운 방법을 잘못된 위치에 추가하고 실수로 비공개로 만들 위험을 줄입니다.

클래스 메서드 구문의 경우 대신 다음과 같이 처리 할 수 ​​있습니다.

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end

이것은 내가 private_class_method전에 호출에 대한 언급을 본 유일한 곳 이며 class << self블록을 사용할 필요가 없도록 블록을 사용하는 것에 대한 마지막 부분은 좋은 팁입니다. 지금까지 내가 선언 (즉, "nornal"클래스의 방법을 몰랐다 def self.foo; end대신 class << self; def foo; end에 의해 영향을받지 않습니다 private지정.
manroe

3

Dennis는 완벽한 답을 가졌습니다. 즉, ruby> = 2.1을 사용할 때 def 앞에 private (또는 protected, public) 접두사를 붙이십시오.

그러나 이제는 다음과 같이 private을 블록으로 사용할 수도 있다고 생각합니다.

private begin
   def foo
   end
   def bar
   end
end

def zip
end

0

나는 일반적으로 내 방법을 다음과 같이 주문합니다.

  1. 건설자
  2. 기타 공개 방법 (알파벳 순서)
  3. private, 한 번만 작성
  4. 알파벳 순서로 된 개인 메서드

저는 편집기에서 "정의로 이동"기능을 사용하여 스크롤링이 많이 필요하지 않습니다. 어떤 경우에도 클래스가 충분히 커서 스크롤링이 문제가되는 경우 여러 클래스로 분할해야합니다.


또한 일반적으로 to_s공개 섹션의 끝 부분에 변환 방법 (예 :)을 배치한다는 점을 언급해야합니다 .
Marnen Laibow-Koser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.