클래스를 서브 클래 싱 할 때 가장 먼저하는 일 중 하나는 개인 메소드를 보호하도록 변경하는 것입니다
private
대 protected
방법 에 대한 몇 가지 추론 :
private
메소드는 코드 재사용을 방지합니다. 서브 클래스는 개인용 메소드에서 코드를 사용할 수 없으며이를 다시 구현해야합니다. 또는 원래 개인용 메소드 & c에 의존하는 메소드를 다시 구현해야합니다.
반면에 다른 사람이 자신의 답변에서 제안한 것처럼 타사 하위 클래스도 "외부 세계"로 간주된다는 점에서 클래스가 "외부 세계"에 제공하는 API로 볼 수 없는 방법 private
으로 볼 수 있습니다 이미.
그게 나쁜가요? -나는 그렇게 생각하지 않습니다.
물론 (의사) 공개 API는 원래 프로그래머를 잠그고 해당 인터페이스의 리팩토링을 방해합니다. 그러나 다른 방법으로 보았을 때 프로그래머가 왜 자신의 "구현 세부 사항"을 공개 API만큼 깨끗하고 안정적인 방식으로 디자인하지 않아야합니까? private
"개인"코드를 구성하는 데 실수를 할 수 있도록 사용해야합니까 ? 아무도 알아 채지 못해서 나중에 청소할 수 있다고 생각하십니까? - 아니.
프로그래머는 자신의 "비공개"코드에 대해서도 약간의 생각을 기울여야하며, 처음부터 가능한 많은 코드를 재사용하도록 허용하거나 심지어 촉진하는 방식으로 코드를 구성해야합니다. 그러면 비 개인 부분은 미래에 어떤 두려움만큼 부담이되지 않을 수 있습니다.
필자가 본 많은 (프레임 워크) 코드는 일관성없는 사용을 채택합니다 private
. : protected
비 최종 메서드는 개인 메서드에 위임하는 것 이상을 거의 수행하지 않습니다. protected
비공개 필드에 대한 직접 액세스를 통해서만 계약을 이행 할 수있는 비 최종 방법.
기술적으로는 (컴파일러) 명백하게 할 것이 없지만, 이러한 메소드는 논리적으로 재정의 / 향상 될 수 없습니다.
확장 성과 상속을 원하십니까? 당신의 방법을 만들지 마십시오 private
.
수업의 특정 행동을 바꾸고 싶지 않습니까? 당신의 방법을 확인하십시오 final
.
정의 된 특정 컨텍스트 외부에서 메소드를 호출 할 수 없습니까? 메소드 private
를 작성하거나 다른 protected
랩퍼 메소드를 통해 재사용하기 위해 필요한 잘 정의 된 컨텍스트를 사용 가능하게하는 방법에 대해 생각하십시오 .
그렇기 때문에 나는 private
아껴서 사용하는 것을 옹호합니다 . 그리고 혼동하지하기 private
로 final
. -메소드의 구현이 클래스의 일반 계약에 필수적이므로 대체 / 재정의되어서는 안됩니다 final
!
필드의 경우 private
실제로 나쁘지 않습니다. 적절한 방법을 통해 필드를 합리적으로 "사용"할 수있는 한 ( 그렇지 getXX()
않거나 setXX()
!).