Jika 'eksplisit lebih baik daripada implisit', mengapa tidak ada pengubah akses eksplisit di Python: Publik, Terlindungi, Pribadi, dll.?
Saya tahu bahwa idenya adalah programmer harus tahu apa yang harus dilakukan melalui petunjuk - tidak perlu menggunakan 'brute force'. Tetapi 'Enkapsulasi' atau 'penyembunyian informasi' IMO tidak hanya untuk mengusir orang, ini adalah masalah organisasi dan struktur: lapisan pengembangan Anda harus memiliki lingkup dan batas yang jelas dan dibatasi sendiri, seperti halnya sistem fisik.
Dapatkah seseorang tolong bantu saya di sini dengan penjelasan yang kuat tentang mengapa pembatasan akses tersirat daripada eksplisit dalam Python, sebuah bahasa yang tampaknya dekat dengan sempurna?
Sunting: Sejauh ini saya telah melihat 3 jawaban yang diajukan, dan saya menyadari bahwa ada 2 bagian dari pertanyaan saya:
Mengapa tidak ada kata kunci, misalnya
private def myFunc(): dostuff....
bukannya IMO garis bawah jelek dan sulit untuk mengetik. Tapi itu bukan poin penting.
Lebih penting:
Mengapa pengubah akses ini hanya 'rekomendasi' atau petunjuk dan tidak ditegakkan. Akan sulit untuk mengubahnya nanti? Sangat mudah untuk mengubah 'dilindungi' menjadi 'publik' - dan jika Anda memiliki rantai pewarisan yang berbelit-belit yang menyulitkan, Anda memiliki desain yang buruk - desain Anda harus disempurnakan daripada mengandalkan fitur bahasa yang membuatnya mudah untuk ditulis kode terstruktur dengan buruk.
Ketika pengubah akses diberlakukan, kode Anda secara otomatis akan dikotak-kotakkan - Anda TAHU bahwa segmen-segmen tertentu berada di luar jangkauan sehingga Anda tidak perlu menghadapinya kecuali jika dan ketika diperlukan. Dan, jika desain Anda tidak bagus dan Anda menemukan diri Anda terus-menerus memindahkan barang ke dalam dan keluar dari lingkup yang berbeda, bahasa tersebut dapat membantu Anda untuk membersihkan tindakan Anda.
Seperti saya mencintai Python, saya menemukan poin ke-2 ini menjadi kekurangan serius. Dan saya belum melihat jawaban yang bagus untuk ini.
sumber
private def whatever
adalah, ituclass x: def whatever(self): pass
adalah jalan pintas untukclass x: pass; x.whatever = lambda self: pass
, jadi pada dasarnya, Anda akan memerlukan modifikator pribadi untuk penugasanJawaban:
"Eksplisit lebih baik daripada implisit" hanyalah salah satu pepatah dalam filosofi desain Python. "Sederhana lebih baik daripada kompleks" juga ada di sana. Dan, meskipun tidak ada dalam Zen Python, "Kita semua menyetujui orang dewasa di sini" adalah hal lain.
Aturan kedua itu mungkin yang paling penting di sini. Ketika saya mendesain sebuah kelas, saya punya ide tentang bagaimana itu akan digunakan. Tapi saya tidak bisa memprediksi semua kegunaan yang mungkin. Ini mungkin bahwa beberapa penggunaan masa depan kode saya membutuhkan akses ke variabel Aku sudah memikirkan sebagai pribadi. Mengapa saya harus membuatnya sulit - atau bahkan tidak mungkin - untuk mengakses ini, jika seorang programmer masa depan (atau bahkan masa depan saya) membutuhkannya? Hal terbaik yang harus dilakukan adalah menandai mereka dengan peringatan - seperti dicatat Joonas, satu awalan garis bawah adalah standar - bahwa mereka internal, dan mungkin berubah; tetapi melarang akses sama sekali sepertinya tidak perlu.
sumber
Saya menduga alasan utama untuk pengubah akses yang hilang adalah Kesederhanaan
Seperti yang Anda katakan, ini bukan tentang mengusir orang, ini tentang organisasi, jadi poin utama 'pribadi' adalah, bahwa ia mengirim pesan ke pengguna api Anda 'tolong jangan menulis kode yang tergantung pada ini'.
Sepele untuk mengatakan 'dengan konvensi, _x atau __x tidak boleh digunakan di luar kelas', tetapi dalam model objek dinamis python, bahkan akan sulit untuk menghasilkan notasi.
bagaimana cara mencatat aksesibilitas?
Saya kira, ini adalah trade off. Jika Anda benar-benar tidak bisa hidup dengan itu, saya akan menyarankan ruby, yang memiliki tingkat abstraksi dan dinamika yang serupa, tetapi memiliki model objek, yang memungkinkan untuk modifikasi akses.
sumber
__x__
adalah 'sihir', (yaitu metode yang dipanggil untuk memungkinkan integrasi bahasa seperti kelebihan operator, iterabilitas, dll.). Konvensi tersebut adalah_x
.__init__
bersifat insidental. Contoh ini menetapkan beberapa properti objek, yang tidak diketahui pada waktu kompilasi, jadi pengubah akses eksplisit tidak akan membantu Anda.Konvensi Python adalah menggunakan awalan garis bawah untuk anggota yang dilindungi / pribadi.
Konvensi ini, jika diikuti, secara efektif sama dengan pengubah akses, kecuali 1) Anda akan melihat langsung dari anggota ini nama apakah itu umum atau tidak, dan 2) Anda dapat mematahkan "enkapsulasi" jika Anda benar-benar ingin (ini bisa dibenarkan dalam pengujian misalnya; dalam beberapa bahasa lain Anda harus menggunakan refleksi == lebih banyak kode).
Pada akhirnya ini adalah masalah selera, tetapi jika Anda dapat melakukan hal yang sama (dengan sedikit lebih banyak fleksibilitas) tanpa kata kunci khusus, bahasanya akan lebih kecil dan kode akan lebih ringkas, yang umumnya merupakan hal yang baik.
sumber