Pertanyaan tentang kapan menggunakan privat dan kapan menggunakan protected di kelas membuat saya berpikir. (Saya akan memperluas pertanyaan ini juga ke kelas dan metode akhir, karena terkait. Saya pemrograman di Jawa, tapi saya pikir ini relevan untuk setiap bahasa OOP)
Aturan praktis yang baik adalah: jadikan segala sesuatu senyaman mungkin.
- Jadikan semua kelas final kecuali jika Anda perlu subklas segera.
- Buat semua metode menjadi final kecuali Anda perlu membuat subkelas dan menimpanya segera.
- Buat semua parameter metode final kecuali Anda perlu mengubahnya di dalam tubuh metode, yang agak canggung sebagian besar kali.
Ini cukup mudah dan jelas, tetapi bagaimana jika saya kebanyakan menulis perpustakaan (Open Source on GitHub) alih-alih aplikasi?
Saya bisa menyebutkan banyak perpustakaan dan situasi, di mana
- Perpustakaan diperluas dengan cara yang tidak pernah dipikirkan pengembang
- Ini harus dilakukan dengan "magic loader kelas" dan peretasan lainnya karena kendala visibilitas
- Perpustakaan digunakan dengan cara yang tidak dibuat untuknya dan fungsi fungsionalitas yang diperlukan "diretas"
- Perpustakaan tidak dapat digunakan karena masalah kecil (bug, fungsionalitas yang hilang, perilaku "salah") yang tidak dapat diubah karena visibilitas berkurang
- Masalah yang tidak dapat diperbaiki mengarah pada solusi besar, jelek dan bermasalah di mana mengesampingkan fungsi sederhana (yang bersifat pribadi atau final) dapat membantu
Dan saya benar-benar mulai memberi nama ini sampai pertanyaannya menjadi terlalu panjang dan saya memutuskan untuk menghapusnya.
Saya suka gagasan tidak memiliki lebih banyak kode daripada yang dibutuhkan, lebih banyak visibilitas daripada yang dibutuhkan, lebih banyak abstraksi daripada yang dibutuhkan. Dan ini mungkin berfungsi saat menulis aplikasi untuk pengguna akhir, di mana kode hanya digunakan oleh mereka yang menulisnya. Tetapi bagaimana ini bisa bertahan jika kode dimaksudkan untuk digunakan oleh pengembang lain, di mana tidak mungkin bahwa pengembang asli memikirkan setiap kasus penggunaan yang mungkin di muka dan perubahan / refaktor sulit / tidak mungkin dibuat?
Karena pustaka sumber terbuka besar bukanlah hal yang baru, apa cara paling umum untuk menangani visibilitas dalam proyek semacam itu dengan bahasa berorientasi objek?