Jika saya tidak menambahkan pribadi sebelum foo
, loadBar
dan text
, saya percaya mereka adalah public secara default.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
Apakah ada kasus penggunaan saat mereka berada public
dalam komponen?
Untuk alasan enkapsulasi / keamanan, haruskah saya selalu menambahkan private
semuanya seperti di bawah ini?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Terima kasih
typescript
angular
Hongbo Miao
sumber
sumber
Jawaban:
Ada banyak hal yang bisa dikatakan untuk menjawab pertanyaan ini, berikut adalah pemikiran pertama yang muncul di benak saya:
Pertama dan terpenting, perlu diingat bahwa
private
ini hanya konstruksi waktu kompilasi - tidak dapat diterapkan pada waktu proses (lihat di sini dan di sini untuk diskusi yang relevan). Karena itu, harap lepaskan diri Anda dari gagasan apa punprivate
yang berguna dengan cara apa pun untuk tujuan keamanan. Bukan itu masalahnya.Ini adalah tentang enkapsulasi, dan ketika Anda memiliki lapangan atau metode pada komponen Anda bahwa Anda ingin merangkum di dalamnya, sehingga jelas bahwa itu tidak boleh diakses dari tempat lain, maka Anda harus benar-benar membuatnya
private
: Itu ini apaprivate
bagi: Ini menandakan niat Anda bahwa apa pun yang Anda kenakan tidak boleh disentuh dari luar kelas.Hal yang sama berlaku untuk
public
: Ini juga merupakan konstruksi hanya waktu kompilasi, jadi fakta bahwa anggota kelas secarapublic
default, sementara true, memiliki arti nol tepat pada waktu proses. Tetapi ketika Anda memiliki anggota yang secara eksplisit ingin Anda tunjukkan ke dunia luar sebagai bagian dari API kelas Anda, Anda harus benar-benar membuatnyapublic
untuk menandakan maksud ini: Untuk itulahpublic
.Ini semua berlaku untuk Ketikan pada umumnya. Khususnya di Angular, pasti ada kasus penggunaan yang valid untuk memiliki anggota publik di kelas komponen: Misalnya, saat menerapkan pola container / komponen (alias pintar / bodoh ), dengan anak-anak "bodoh" yang menyuntikkan orang tua "pintar" melalui injeksi konstruktor, sangat penting untuk mengkomunikasikan maksud Anda tentang anggota orang tua yang seharusnya dan tidak boleh disentuh oleh anak-anak: Jika tidak, jangan kaget ketika Anda melihat anak-anak bodoh itu bermain-main di lemari minuman orang tua mereka.
Jadi, jawaban saya untuk pertanyaan Anda:
adalah tegas tidak ada . Anda tidak boleh selalu menambahkan
private
karena dengan melakukan itu Anda akan menggagalkan tujuan kata kunci, karena kata kunci tidak lagi menandakan maksud apa pun jika Anda meletakkannya di mana-mana: Anda sebaiknya tidak meletakkannya di mana pun.sumber
@drewmoore memberikan jawaban yang bagus dalam intisari privat / publik itu. Namun ada beberapa hal lagi yang perlu dipertimbangkan saat menggunakan nilai privat yang diinjeksi:
@Import() private foo
, atauconstructor(private foo) {}
, dan hanya digunakanfoo
di template Andasumber