2016-07-16 3 views
-1

'private'메소드가 'protected'메소드로 수행 할 수없는 작업을 수행하는 구체적인 예를 들어 줄 수 있습니까? 즉, 왜 언어 디자이너가 Ruby에 '개인용'메소드를 넣을지 알고 싶습니다.Ruby에서 'private'메소드가 필요한 이유

+0

당신은 그들이 보호되거나 공개 된 것 이상의 기능을 사용하지 않는다고합시다. 사실, 그들은 기능을 제거합니다 - 구체적으로 말하자면, 그들은 정의 된 클래스/모듈 외부에서 메소드를 실행하는 것을 약간 더 어렵게 만듭니다. 다른 메소드에 의해 내부적으로 사용되는 도우미 메소드를 고려하십시오. 라이브러리를 사용하는 누군가는이 도우미 메서드를 직접 호출하지 않을 것입니다. 비공개로 표시 될 수 있으므로 소스 코드를 탐색하는 누군가가이 기능을 인식합니다. 그것은 기능을 추가하지는 않지만 typechecking과 비슷하지만, 개발자가 쉽게 살 수있게합니다. –

+0

내가 찾은 개인 메서드 중 하나는 '전역'메서드 (모든 클래스 외부에서 정의 된 메서드)를 정의하는 데 사용된다는 점입니다. 이러한 메서드는 Object의 private 메서드가되고 수신기가 없어도 호출 될 수 있으므로 더 많은 비 객체 지향 스타일을 모방합니다. . 그러나 이것은 언어 디자인 문제보다 '구문 적 설탕'기능에 더 가깝습니다. –

+0

나는 정말로 이해하지 못한다. 글로벌 범위에서 전역 메소드, 즉'def foo'를 정의하는 경우. 그것의 공개 또는 비공개라면 어떤 차이가 있습니까? 두 경우 모두'foo'를 호출 할 수 있습니다. private 또는 protected가 메소드를 호출하는 것을 결코 완전히 막지는 않는다는 것을 언급 할 가치가 있습니다. 단지'send'가 때때로 사용되도록 요구합니다. –

답변

1

정말 개발 팀과 코드가 어떻게 사용되는지에 따라 다릅니다. Ruby에서 이러한 태그는 종종 하드 및 빠른 규칙보다 많은 제안 사항이며 필요에 따라 privateprotected 메서드를 우회하는 방법이 있지만 코드를 사용하는 사람이이를 호출하는 것이 바람직하지 않음을 알리는 강력한 힌트가 될 수 있습니다.

private은 무언가를 서브 클래스로 만들려고 노력하는 사람들에게 삶을 매우 어렵게 만들 수 있으므로 조심스럽게 사용해야합니다. 보통 protected이면 충분하며, 외부 코드를 해야하는 방법으로 조정하는 데 도움이됩니다.

private이 필요한 경우가 있습니다. 즉, 하위 클래스가 상위 클래스의 작동 방식을 너무 많이 알지 못하도록하려는 경우입니다. 이것은 사람들에게 서브 클래스를 장려하는 라이브러리에서 더 일반적이지만, 사용자가 사용하려고하지 않는 내부 기능 중 일부를 벽으로 막고 싶을 수도 있습니다. 이렇게하면 다른 사람의 코드를 손상시키지 않고 나중에 이러한 메소드를 리펙토링 할 수 있습니다.

좋은 객체 지향 디자인의 원칙 중 하나는 메소드 노출의 양을 제어하는 ​​것입니다. 노출이 너무 많다는 것은 변경 사항을 적용 할 준비가되어 있지 않으면 현재와 미래에 동일하게 작동하도록하기 위해 최선을 다하고 있음을 의미합니다. 노출이 너무 적 으면 쓸모가 없어도 수업을 사용하기 어려울 수 있습니다. 그 균형을 찾는 것은 항상 까다 롭습니다.

그래서 privateprotected이 존재하며, C++, Java, PHP, Python 및 기타 많은 사람들이 이러한 이유를 가지고있는 것과 거의 같습니다. 방법을 사용하는 방법과 위치를 제어 할 수 있습니다.

+0

'private'이 서브 클래스 화하기가 어려운 예제를 줄 수 있습니까? –

+0

@ JörgWMittag 당신이 당신의 방법에 대해 지나치게 보호하고 있고, 당신의 서브 클래스가 유용한 것을하기 위해 이러한'private' 메소드들 중 하나에 접근 할 필요가 있다면, 그것이 문제 일 때입니다. 매우 상황이 좋지만 필요할 때 바로 유리 뒤에 잠겨 있기 때문에 언제 일어날 지 알 수 있습니다. – tadman

+0

수퍼 클래스가 메서드를 서브 클래스에 액세스하는 것을 'private'로 설정하는 것을 방지 할 수있는 방법을 알지 못합니다. 'private'이 서브 클래스에있는 수퍼 클래스의 메소드에 접근하지 못하게하는 예제를 줄 수 있습니까? –

관련 문제