Si je n'ajoute pas de privé avant foo
, loadBar
et text
, je pense qu'ils sont publics par défaut.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
Y a-t-il un cas d'utilisation lorsqu'ils sont public
dans le composant?
Pour des raisons d'encapsulation / sécurité, dois-je toujours ajouter private
pour chacun d'entre eux comme ci-dessous?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Merci
typescript
angular
Hongbo Miao
la source
la source
Réponses:
Il y a beaucoup à dire en réponse à cette question, ce sont les premières pensées qui me sont venues à l'esprit:
Tout d'abord, gardez à l'esprit qu'il
private
ne s'agit que d'une construction au moment de la compilation - elle ne peut pas être appliquée à l'exécution (voir ici et ici pour une discussion pertinente). En tant que tel, veuillez vous désabuser de toute notion d'private
être utile de quelque manière que ce soit à des fins de sécurité. Ce n'est tout simplement pas ce dont il s'agit.Il s'agit d'encapsulation, et lorsque vous avez un champ ou une méthode sur votre composant que vous souhaitez encapsuler, en indiquant clairement qu'il ne doit pas être consulté de nulle part ailleurs, alors vous devez absolument le faire
private
: c'est à cela queprivate
sert: Cela signale votre intention de ne pas toucher à tout ce que vous avez mis en dehors de la classe.Il en va de même pour
public
: il s'agit également d'une construction uniquement à la compilation, de sorte que le fait que les membres de la classe soientpublic
par défaut, bien que true, n'a aucune signification au moment de l'exécution. Mais lorsque vous avez un membre que vous avez explicitement l'intention d'exposer au monde extérieur dans le cadre de l'API de votre classe, vous devez absolument le fairepublic
pour signaler cette intention: c'est à cela quepublic
sert.Tout cela est applicable à Typescript en général. Dans Angular en particulier, il existe des cas d'utilisation définitivement valides pour avoir des membres publics sur des classes de composants: par exemple, lors de l'implémentation du modèle conteneur / composant (alias smart / dumb ), avec des enfants "stupides" injectant des parents "intelligents" via l'injection de constructeur, il est extrêmement important de communiquer votre intention sur ce que les membres du parent devraient et ne devraient pas être touchés par les enfants: Sinon, ne soyez pas surpris lorsque vous surprenez ces enfants stupides qui s'amusent dans l'armoire à alcool de leurs parents.
Alors, ma réponse à votre question:
est un non catégorique . Vous ne devriez pas toujours ajouter
private
parce que, ce faisant, vous allez à l'encontre de l'objectif du mot-clé, car il ne signale plus aucune intention si vous le mettez partout: vous pourriez aussi bien ne le mettre nulle part.la source
@drewmoore fournit une bonne réponse en ce sens que privé / public se résume à l'intention. Mais il y a quelques autres éléments à prendre en compte lors de l'utilisation de valeurs privées injectées:
@Import() private foo
, ouconstructor(private foo) {}
, et utilisez uniquementfoo
dans votre modèlela source