Se eu não adicionar privado antes foo
, loadBar
e text
, acredito que eles são públicos por padrão.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
Existe algum caso de uso quando eles estão public
no componente?
Por motivos de encapsulamento / segurança, devo sempre adicionar private
para todos eles como abaixo?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
obrigado
typescript
angular
Hongbo Miao
fonte
fonte
Respostas:
Há muito a dizer em resposta a esta pergunta, estes são os primeiros pensamentos que me vieram à mente:
Em primeiro lugar, tenha em mente que
private
é apenas uma construção de tempo de compilação - ela não pode ser imposta em tempo de execução (veja aqui e aqui uma discussão relevante). Como tal, por favor, desligue-se de quaisquer noções deprivate
ser útil de alguma forma para fins de segurança. Simplesmente não é disso que se trata.Ele é cerca de encapsulamento, e quando você tem um campo ou método na sua componente que você deseja encapsular nela, deixando claro que ele não deve ser acessado a partir de qualquer outro lugar, então você deve absolutamente torná-lo
private
: isso é o queprivate
é para: Sinaliza sua intenção que tudo o que você colocou não deve ser tocado de fora da classe.O mesmo vale para
public
: ele também é uma construção apenas em tempo de compilação, então o fato de que os membros da classe sãopublic
por padrão, embora verdadeiro, tem significado exatamente zero em tempo de execução. Mas quando você tem um membro que pretende explicitamente expor ao mundo externo como parte da API de sua classe, você deve com certeza torná-lopublic
para sinalizar esta intenção: É para isso quepublic
serve.Tudo isso é aplicável ao Typecript em geral. Especificamente em Angular, há casos de uso definitivamente válidos para ter membros públicos em classes de componentes: Por exemplo, ao implementar o contêiner / componente (também conhecido como inteligente / burro padrão de ), com crianças "burras" injetando pais "inteligentes" por meio de injeção de construtor, é extremamente importante comunicar sua intenção sobre o que os membros do pai devem e não devem ser tocados pelos filhos: Do contrário, não se surpreenda quando pegar essas crianças idiotas brincando no armário de bebidas de seus pais.
Então, minha resposta à sua pergunta:
é um enfático não . Você nem sempre deve adicionar
private
porque, ao fazer isso, você anula o propósito da palavra-chave, porque ela não sinaliza mais nenhuma intenção se você colocá-la em qualquer lugar: você pode muito bem não colocá-la em qualquer lugar.fonte
@drewmoore fornece uma boa resposta em que privado / público se resume à intenção. Mas há mais algumas coisas a considerar ao usar valores privados injetados:
@Import() private foo
, ouconstructor(private foo) {}
, e apenas usarfoo
em seu modelofonte