Jeśli nie dodać prywatny przed foo
, loadBar
i text
uważ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 public
w komponencie?
Czy ze względów bezpieczeństwa / hermetyzacji powinienem zawsze dodawać private
je wszystkie, jak poniżej?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Dzięki
typescript
angular
Hongbo Miao
źródło
źródło
Odpowiedzi:
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
private
jest 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 koncepcjiprivate
uż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, coprivate
jest 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ąpublic
domyś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ędniepublic
zasygnalizować ten zamiar: po topublic
jest.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:
jest stanowczym nie . Nie powinieneś zawsze dodawać,
private
ponieważ 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ć.źródło
@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:
@Import() private foo
lubconstructor(private foo) {}
i używaj tylkofoo
w swoim szablonieźródło