Angular 구성 요소의 "private"및 "public"


120

내가 추가하지 않으면 개인을 하기 전에 foo, loadBar그리고 text, 나는 그들이 믿고 대중 기본적으로.

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

public구성 요소에 있을 때 사용 사례가 있습니까?

캡슐화 / 보안상의 이유로 항상 private아래와 같이 모두 추가해야 합니까?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

감사


간단히 말해 Private 함수는 구성 요소에서만 사용할 수 있습니다. 다른 구성 요소에서 개인 기능에 액세스 할 수 없습니다. 서비스에서 함수가 Private으로 선언되면 다른 구성 요소에서 액세스 할 수 없다고 가정합니다.
Kevin

답변:


202

이 질문에 대한 답변으로 할 말이 많이 있는데, 이것이 내 마음에 떠오른 첫 번째 생각입니다.

무엇보다 먼저 private컴파일 타임 구조 일 뿐이며 런타임에 적용 할 수 없습니다 ( 관련 논의는 여기여기 를 참조 하세요 ). 따라서 private보안 목적으로 어떤 식 으로든 유용하다는 생각을 버리십시오 . 그것은 단순히 그것이 무엇에 관한 것이 아닙니다.

그것은 이다 캡슐화에 대해, 당신이 당신의 구성 요소에 필드 나 메소드가있을 때 당신이 그것을 다른 곳에서 액세스 할 수 없습니다 것을 취소하고, 거기에 캡슐화 할 것인지, 당신은 절대적으로 그것을 확인해야합니다 private: 그것은 무엇의 private입니다 : 무엇을 입었 든 수업 외부에서 건드리지 말아야한다는 의도를 나타냅니다.

똑같습니다 public: 이것도 컴파일 시간 전용 구조이므로 클래스 멤버가 public기본적으로 true이지만 런타임에 정확히 0의 의미를 갖습니다. 그러나 클래스 API의 일부로 외부 세계에 명시 적으로 노출하려는 멤버가있는 public경우이 의도를 알리기 위해 절대적으로 만들어야합니다 . 이것이 바로 그 이유 public입니다.

이것은 일반적으로 Typescript에 모두 적용됩니다. 특히 Angular에는 구성 요소 클래스에 공용 멤버를 사용하는 데 유효한 사용 사례가 있습니다. 예를 들어 컨테이너 / 구성 요소 (일명 smart / dumb ) 패턴을 구현할 때 "dumb"자식이 생성자 주입을 통해 "스마트"부모를 주입하는 경우, 부모의 구성원이 자녀가 만져서는 안되는 것과 접촉해서는 안되는 것에 대한 의도를 전달하는 것이 매우 중요합니다. 그렇지 않으면 부모의 술 캐비닛에서 장난을 치는 멍청한 아이를 잡을 때 놀라지 마십시오.

그래서, 귀하의 질문에 대한 나의 대답 :

항상 아래와 같이 모두 비공개로 추가해야합니까?

단호한 아니오 입니다. 키워드의 목적을 무너 뜨리기 때문에 항상 추가 해서는 안됩니다 private. 키워드를 어디에나두면 더 이상 의도를 나타내지 않기 때문입니다. 어디에도 두지 않는 것이 좋습니다.


5
설명 해주셔서 감사합니다. 하지만 아마도 내가 틀렸을 수도 있습니다. 대부분의 시간 속성과 메서드가 비공개 (= "이 구성 요소 전용") 여야한다는 것을 이해합니다. 따라서 대답은 "그 사람이 속성 / 메소드를 외부에 노출 할 필요가없는 한 기본적으로 예"여야합니다. 아니 ? 왜 "아니오"( "절대"처럼 들림)로 답하여 설명을 마무리합니까?
M'sieur Toph '

1
나는 빨간 각도 2 튜토리얼을 공개하고 언제 공개 해야하는지 알지 못했습니다. 컴포넌트 통신에는 많은 변형이 있습니다. angular.io/docs/ts/latest/cookbook/… 아마도 우리는 입력 출력을 통해 정의 된 속성과 메서드에 대해서만 public을 사용해야합니다. 하지만 잘 모르겠습니다.
Ruslan Borovok

클래스 내부에서 사용되지 않지만 외부 (즉, 템플릿 또는 다른 구성 요소 내부)에서 사용되는 생성자에서 속성을 선언 할 때 일반적으로 'public'을 사용해야합니다.
tuliomarchetto

18

@drewmoore는 개인 / 공개가 의도로 요약된다는 점에서 좋은 답변을 제공합니다. 그러나 주입 된 개인 값을 사용할 때 고려해야 할 몇 가지 사항이 더 있습니다.

TypeScript를 AoT 컴파일 프로세스의 출력으로 내보내려면 구성 요소 템플릿의 공용 필드에만 액세스해야합니다 **


첫 번째 요점 : 이러한 오류는 회원이 비공개 또는 공개 인 것과는 아무 관련이 없으며 단순히 사용되지 않음을 나타냅니다. 질문이 템플릿에서 비공개 멤버 참조하는 것에 관한 것이면 두 번째 두 포인트는 유효 하지만 그렇지 않습니다. 하는 질문 여기를 참조하십시오
무어 그린

@drewmoore, 당신이 맞으며 사용되지 않는다는 것을 이해합니다. 그러나 공개 변수는 외부에서 사용될 수 있으므로 경고를 트리거 하지 않습니다 . "컴포넌트에 공개 된 경우 사용 사례가 있습니까?"라는 질문 자체에 대해서는 두 번째와 세 번째 요점 이 공개 일 때, 특히 템플릿에서 사용하려는 경우에 사용 사례 를 적어도 나타냅니다 . (인용 된 텍스트에 표시된대로).
Lucas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.