"Pribadi" dan "publik" dalam komponen Angular

120

Jika saya tidak menambahkan pribadi sebelum foo, loadBardan 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 publicdalam komponen?

Untuk alasan enkapsulasi / keamanan, haruskah saya selalu menambahkan privatesemuanya seperti di bawah ini?

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

Terima kasih

Hongbo Miao
sumber
Sederhananya, fungsi Private hanya dapat digunakan di komponen. Tidak mungkin untuk mengakses fungsi privat dari komponen lain. Misalkan dalam layanan, Jika suatu fungsi mendeklarasikan sebagai Pribadi maka itu tidak dapat diakses dari komponen lain.
Kevin

Jawaban:

202

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 privateini 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 pun privateyang 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 apa privatebagi: 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 secara publicdefault, 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 membuatnya publicuntuk menandakan maksud ini: Untuk itulah public.

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:

haruskah saya selalu menambahkan pribadi untuk semuanya seperti di bawah ini?

adalah tegas tidak ada . Anda tidak boleh selalu menambahkan privatekarena 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.

menggambar lebih banyak
sumber
5
Terima kasih untuk penjelasannya. Tapi mungkin saya salah: Saya mengerti bahwa sebagian besar properti waktu dan metode harus privat (= "hanya untuk penggunaan komponen ini"). Jadi jawabannya harus "YA secara default, selama pria itu tidak perlu mengekspos properti / metode ke luar". Tidak ? Mengapa menyimpulkan penjelasan Anda dengan menjawab "tidak" (yang terdengar seperti "tidak pernah")?
M'sieur Toph '21
1
Saya tutorial sudut merah 2, dan saya tidak tahu kapan saya harus menggunakan publik. Ada banyak varian untuk komunikasi komponen: angular.io/docs/ts/latest/cookbook/… Mungkin kita harus menggunakan publik hanya untuk properti dan metode yang ditentukan melalui Input Output. Tapi saya tidak yakin.
Ruslan Borovok
Saya biasanya harus menggunakan 'public' ketika saya mendeklarasikan properti di konstruktor yang tidak digunakan di dalam kelas, tetapi digunakan di luar (yaitu di dalam template atau komponen lain).
tuliomarchetto
18

@drewmoore memberikan jawaban yang bagus dalam intisari privat / publik itu. Namun ada beberapa hal lagi yang perlu dipertimbangkan saat menggunakan nilai privat yang diinjeksi:

Jika kita ingin mengeluarkan TypeScript sebagai output dari proses kompilasi AoT, kita harus memastikan bahwa kita hanya mengakses kolom publik di template komponen kita **

Lucas
sumber
re poin pertama Anda: Kesalahan tersebut tidak ada hubungannya dengan anggota menjadi pribadi atau publik, mereka hanya menunjukkan bahwa salah satu tidak digunakan. Dua poin kedua Anda akan valid jika pertanyaannya adalah tentang mereferensikan anggota pribadi di templat , tetapi sebenarnya tidak. Lihat di sini untuk pertanyaan yaitu
menggambar lebih
@drewmoore, Anda benar, dan saya mengerti bahwa mereka menunjukkan bahwa mereka tidak digunakan. Namun, variabel publik dapat digunakan secara eksternal sehingga akan tidak pernah memicu peringatan itu. Mengenai pertanyaan itu sendiri "Apakah ada kasus penggunaan ketika mereka publik dalam komponen?", Saya percaya poin kedua dan ketiga saya setidaknya menunjukkan kasus penggunaan ketika mereka publik , khususnya, ketika Anda ingin menggunakannya dalam template (seperti yang ditunjukkan dalam teks kutipan).
Lucas