Wenn ich nicht hinzufügen , privat vor foo
, loadBar
und text
ich glaube , sie sind öffentlich standardmäßig.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
Gibt es einen Anwendungsfall, wenn sie sich public
in der Komponente befinden?
Sollte ich aus Gründen der Kapselung / Sicherheit immer private
für alle wie unten hinzufügen ?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Vielen Dank
typescript
angular
Hongbo Miao
quelle
quelle
Antworten:
Als Antwort auf diese Frage gibt es viel zu sagen. Dies sind die ersten Gedanken, die mir in den Sinn kamen:
Denken Sie in erster Linie daran, dass dies
private
nur ein Konstrukt zur Kompilierungszeit ist - es kann zur Laufzeit nicht erzwungen werden (siehe hier und hier für relevante Diskussionen). Bitte entbinden Sie sich daher von jeglichen Vorstellungenprivate
, aus Sicherheitsgründen in irgendeiner Weise nützlich zu sein. Darum geht es einfach nicht.Es ist etwa Verkapselung, und wenn Sie ein Feld oder eine Methode auf Ihrer Komponente haben , dass Sie darin einzukapseln wollen, so dass es klar , dass es nicht von anderswo zugegriffen werden soll, dann sollte man unbedingt machen
private
: Das ist , wasprivate
ist für: Es signalisiert Ihre Absicht, dass alles, was Sie angezogen haben, nicht von außerhalb der Klasse berührt werden sollte.Das Gleiche gilt für
public
: Es handelt sich ebenfalls um ein Konstrukt nur zur Kompilierungszeit. Die Tatsache, dass Klassenmitgliederpublic
standardmäßig true sind, hat zur Laufzeit genau null Bedeutung. Wenn Sie jedoch ein Mitglied haben, das Sie ausdrücklich als Teil der API Ihrer Klasse der Außenwelt aussetzen möchten, sollten Sie es unbedingt schaffenpublic
, diese Absicht zu signalisieren: Dafürpublic
ist es da.Dies gilt alles für Typescript im Allgemeinen. Insbesondere in Angular gibt es definitiv gültige Anwendungsfälle für öffentliche Mitglieder in Komponentenklassen: Zum Beispiel bei der Implementierung des Container- / Komponentenmusters (auch bekannt als smart / dumm ), bei dem "dumme" Kinder "intelligente" Eltern über die Konstruktorinjektion injizieren, Es ist äußerst wichtig, dass Sie Ihre Absicht darüber mitteilen, welche Mitglieder der Eltern von den Kindern berührt werden sollen und welche nicht: Seien Sie ansonsten nicht überrascht, wenn Sie diese dummen Kinder im Schnapsschrank ihrer Eltern herumalbern sehen.
Also meine Antwort auf Ihre Frage:
ist ein nachdrückliches Nein . Sie sollten nicht immer hinzufügen,
private
weil Sie damit den Zweck des Schlüsselworts zunichte machen, da es keine Absicht mehr signalisiert, wenn Sie es überall platzieren: Sie können es genauso gut nirgendwo platzieren.quelle
@drewmoore bietet eine gute Antwort, da privat / öffentlich auf Absicht hinausläuft. Bei der Verwendung injizierter privater Werte sind jedoch noch einige weitere Punkte zu beachten:
@Import() private foo
oder verwendenconstructor(private foo) {}
und nurfoo
in Ihrer Vorlage verwendenquelle