„Prywatne” i „publiczne” w komponencie Angular


120

Jeśli nie dodać prywatny przed foo, loadBari textuważam, że są publiczne domyślnie.

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

Czy istnieje przypadek użycia, gdy są one publicw komponencie?

Czy ze względów bezpieczeństwa / hermetyzacji powinienem zawsze dodawać privateje wszystkie, jak poniżej?

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

Dzięki


Aby być prostym, funkcja prywatna może być używana tylko w komponencie. Nie jest możliwy dostęp do funkcji prywatnej z innego komponentu. Załóżmy, że w usłudze, jeśli funkcja jest zadeklarowana jako prywatna, nie można uzyskać do niej dostępu z żadnego innego składnika.
Kevin

Odpowiedzi:


202

W odpowiedzi na to pytanie jest wiele do powiedzenia, oto pierwsze myśli, które przyszły mi do głowy:

Przede wszystkim należy pamiętać, że privatejest to konstrukcja tylko w czasie kompilacji - nie można jej wymusić w czasie wykonywania (patrz tutaj i tutaj, aby zapoznać się z odpowiednią dyskusją). W związku z tym prosimy o pozbycie się wszelkich koncepcji privateużyteczności w jakikolwiek sposób ze względów bezpieczeństwa. Po prostu nie o to chodzi.

To jest o enkapsulacji, a gdy masz pole lub metodę na swojego urządzenia, które chcesz do hermetyzacji w nim, co jasne, że nie powinno być dostępne od nigdzie indziej, to należy bezwzględnie zrobić to private: to, co privatejest dla: Sygnalizuje zamiar, że cokolwiek nałożyłeś, nie powinno być dotykane spoza klasy.

To samo dotyczy public: jest to również konstrukcja przeznaczona tylko do kompilacji, więc fakt, że elementy składowe klasy są publicdomyślnie, podczas gdy są prawdziwe, ma dokładnie zero znaczenia w czasie wykonywania. Ale kiedy masz członka, którego wyraźnie zamierzasz ujawnić światu zewnętrznemu jako część API twojej klasy, powinieneś bezwzględnie publiczasygnalizować ten zamiar: po to publicjest.

To wszystko dotyczy ogólnie maszynopisu. W szczególności w Angulara istnieją zdecydowanie ważne przypadki użycia publicznych członków w klasach komponentów: na przykład podczas implementowania wzorca kontenera / komponentu (inaczej inteligentnego / głupiego ), gdy „głupie” dzieci wstrzykują „inteligentnych” rodziców za pomocą iniekcji konstruktora, niezwykle ważne jest, aby przekazać swoje zamiary dotyczące tego, którzy członkowie rodzica powinni i nie powinni być dotykani przez dzieci: w przeciwnym razie nie zdziw się, gdy przyłapiesz te głupie dzieci na wygłupach w barku swoich rodziców.

A więc moja odpowiedź na twoje pytanie:

czy powinienem zawsze dodawać prywatne dla nich wszystkich, jak poniżej?

jest stanowczym nie . Nie powinieneś zawsze dodawać, privateponieważ robiąc to, pokonujesz cel słowa kluczowego, ponieważ nie sygnalizuje już żadnego zamiaru, jeśli umieścisz go wszędzie: równie dobrze możesz go nigdzie nie umieścić.


5
Dziękuję za wyjaśnienie. Ale może się mylę: rozumiem, że przez większość czasu właściwości i metody muszą być prywatne (= "tylko do użytku tego komponentu"). Więc odpowiedź powinna brzmieć „Domyślnie TAK, o ile facet nie musi wystawiać własności / metody na zewnątrz”. Nie? Po co kończyć wyjaśnienie, odpowiadając „nie” (co brzmi jak „nigdy”)?
M'sieur Toph '21

1
Zrobiłem czerwone tutoriale Angular 2 i nie wiedziałem, kiedy powinienem używać public. Istnieje wiele wariantów komunikacji komponentów: angular.io/docs/ts/latest/cookbook/… Prawdopodobnie powinniśmy używać public tylko dla właściwości i metod zdefiniowanych przez Input Output. Ale nie jestem pewien.
Ruslan Borovok

Zwykle muszę używać „public”, gdy deklaruję właściwość w konstruktorze, która nie jest używana wewnątrz klasy, ale jest używana na zewnątrz (tj. Wewnątrz szablonu lub innego komponentu).
tuliomarchetto

18

@drewmoore zapewnia dobrą odpowiedź, ponieważ prywatne / publiczne sprowadza się do zamiaru. Ale jest jeszcze kilka rzeczy do rozważenia podczas używania wstrzykniętych prywatnych wartości:

Jeśli chcemy emitować TypeScript jako wynik procesu kompilacji AoT, musimy upewnić się, że mamy dostęp tylko do pól publicznych w szablonach naszych komponentów **


Co do pierwszego punktu: te błędy nie mają nic wspólnego z tym, że członek jest prywatny lub publiczny, po prostu wskazują, że jeden z nich nie jest używany. Twoje drugie dwa punkty byłyby ważne, gdyby pytanie dotyczyło odwoływania się do prywatnych członków w szablonach , ale tak nie jest. Zobacz tutaj, aby zadać pytanie
drew moore

@drewmoore, masz rację i rozumiem, że wskazują, że nie są używane. Jednak zmienne publiczne mogą być używane zewnętrznie, więc nigdy nie wywołałoby tego ostrzeżenia. Jeśli chodzi o same pytania „Czy jest jakiś przypadek użycia, gdy są one publiczne w komponencie?”, Uważam, że moje drugie i trzecie punkty przynajmniej wskazują przypadek użycia, gdy są one publiczne , a konkretnie, gdy chcesz ich użyć w szablonie (jak wskazano w cytowanym tekście).
Lucas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.