typescript - „private“ a „public“ v Angular komponente


Ak pred foo, loadBar a text nepridám private, verím, že sú predvolená public.

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

Existuje nejaký prípad použitia, keď sú v komponente public?

Z dôvodu enkapsulácie/bezpečnosti, mal by som vždy pridávať private pre všetky z nich ako nižšie?

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

Odpoveď č. 1

Na túto otázku je toho veľa, čo sa dá povedať, toto sú prvé myšlienky, ktoré mi napadli:

Predovšetkým majte na pamäti, že private je iba konštrukt kompilácie - nedá sa vynútiť počas behu programu (pozrite si tu a tu pre relevantnú diskusiu): Prosím, vyhoďte z hlavy akékoľvek predstavy o tom, že private je akýmkoľvek spôsobom užitočné na účely bezpečnosti. To jednoducho nie je jeho účel.

Ide o zapuzdrenie, a keď máte pole alebo metódu vo vašej komponente, ktorú chcete zapuzdriť, čím jasne ukazujete, že by k nej nemalo byť prístupné odkiaľkoľvek inde, mali by ste ju určite urobiť private: To je účel private: Signalizuje váš úmysel, že čokoľvek, na čo ste ho umiestnili, by nemalo byť prístupné z vonkajšej triedy.

To isté platí aj pre public: Aj ono je konštrukt iba pre čas kompilácie, takže skutočnosť, že členovia triedy sú public predvolene, hoci pravdivá, nemá za behu programu nijaký význam. Ale keď máte člena, ktorého explícitne chcete vystaviť vonkajšiemu svetu ako súčasť API vašej triedy, mali by ste ho rozhodne spraviť public, aby ste signalizovali tento zámer: Na to slúži public.

Toto všetko platí všeobecne pre Typescript. Špecificky v Angulari sú určite platné prípady použitia, keď majú komponentné triedy verejné členy: Napríklad pri implementácii vzoru kontajner/komponent (teda smart/dumb), kde "hlúpe" deti injektujú "chytrých" rodičov cez konštruktor, je mimoriadne dôležité komunikovať svoj zámer ohľadom toho, ktoré členy rodiča by mali a nemali byť dotýkané deťmi: Inak sa nečudujte, keď chytíte tieto hlúpe deti, ako sa hrajú v alkoholovej skrinke svojich rodičov.

Takže moja odpoveď na tvoju otázku:

mal by som vždy pridávať private pre všetky z nich ako nižšie?

je dôrazné nie. Nemali by ste vždy pridávať private, pretože tým porušujete účel kľúčového slova, pretože už to neoznačuje žiadny zámer, ak ho dáte všade: Môžete ho rovnako dobre nedávať nikde.

Odpoveď č. 2

@drewmoore poskytuje dobrú odpoveď, že súkromné/verejné sa znižuje na zámer. Ale existuje niekoľko ďalších vecí, ktoré treba zvážiť pri používaní injektovaných súkromných hodnôt:

  • Obe TypeScript (noUnusedLocals) aj TSLint (no-unused-variable) budú hlásiť chyby, ak použijete @Import() private foo alebo constructor(private foo) {}, a použijete foo iba vo vašej šablóne
  • AOT nebude fungovať:

Ak chceme emitovať TypeScript ako výstup procesu AoT kompilácie, musíme sa uistiť, že v šablónach našich komponentov pristupujeme iba k verejným poliam.

  • Je to považované za anti-vzor

Súvisiace články