Praktik terbaik untuk menggunakan publik, dilindungi, pribadi?

12

Apakah adil untuk mengatakan bahwa itu adalah praktik yang baik untuk privatemengatur default segala sesuatu di muka ketika mengkodekan sesuatu?

Dan kemudian hanya memutakhirkannya ke protectedjika subclass membutuhkannya, atau publicjika kelas lain membutuhkannya?

AJJ
sumber
2
Jika Anda membuat beberapa API, Anda perlu mengantisipasi fungsionalitas yang mungkin diperlukan seorang penelepon. Dengan demikian, Anda perlu lebih memikirkan pengubah akses Anda. Itu tergantung pada siapa yang menggunakan kode yang Anda tulis.
user2023861
Kemungkinan duplikat dari Do ALL variabel Anda perlu dinyatakan pribadi?
nyamuk

Jawaban:

10

Jawaban singkat: Ya

Jawaban yang lebih panjang:

Ya, tetapi itu tidak harus ditafsirkan sebagai saran untuk memulai dengan menulis kelas Anda dengan segala sesuatu yang pribadi; pendekatan itu menyiratkan desain kelas dengan berfokus pada detail implementasi sebelum Anda memilih antarmuka.

Salah satu aspek paling penting untuk dipertimbangkan ketika merancang kelas adalah bagaimana itu akan digunakan; yang melibatkan pemikiran tentang metode publik Anda sebelum Anda mulai memikirkan detail pribadi / implementasi.

Lebih jauh, pendekatan itu biasanya melewatkan kesempatan untuk bertanya pada diri sendiri, "Bagaimana saya menulis tes unit untuk kelas ini?" - yang merupakan pertanyaan penting untuk ditanyakan meskipun Anda sebenarnya tidak menulis tes unit. (Terkait: "Apa prinsip desain yang mempromosikan kode yang dapat diuji?" )

Jadi, setelah Anda mendefinisikan antarmuka publik, maka itu ide yang baik untuk default sisanya ke pribadi karena sebagian besar dari itu biasanya akan menjadi detail implementasi berpasir yang tidak menjadi perhatian terhadap apa pun di luar kelas.

Ben Cottrell
sumber
Jadi jika saya mencoba untuk meringkas apa yang Anda katakan kembali kepada Anda (untuk melihat apakah saya mengerti), adalah ide yang baik untuk memikirkan antarmuka yang menghadap publik terlebih dahulu (yaitu bagaimana kelas ini sebenarnya digunakan oleh untuk memulai dengan?) dan kemudian membuat semuanya menjadi pribadi?
AJJ
1
@ArukaJ Pendekatan yang baik adalah menulis kode yang akan menggunakan kelas Anda sebelum Anda membangun implementasi. Ini bisa menjadi masalah ayam atau telur sampai Anda mulai menulis tes unit terlebih dahulu.
JimmyJames
1
@ArukaJ Secara luas ya; yang pada awalnya mungkin tampak lebih sulit untuk dilakukan, meskipun seperti yang disebutkan oleh JimmyJames, rasanya jauh lebih intuitif ketika Anda menulis unit test. Ini mungkin melibatkan pola pikir yang sedikit berbeda, tetapi tujuannya adalah untuk berpikir lebih hati-hati tentang apa yang diwakili oleh kelas Anda, dan seperti apa input / output Anda - secara keseluruhan itu hanya cara berpikir "OO" tentang desain; lebih mungkin menghasilkan kelas yang dienkapsulasi dengan rapi dengan kohesi yang tinggi.
Ben Cottrell
Saya ragu menggunakan tes unit untuk merancang kelas Anda, karena tes unit bukan yang akan benar-benar menggunakannya. Namun, mereka jelas lebih baik daripada tidak sama sekali dalam memikirkan bagaimana kelas akan digunakan.
user949300
8

"Dan kemudian hanya memutakhirkannya untuk dilindungi jika subclass membutuhkannya, atau publik jika kelas lain membutuhkannya?"

Itu pendekatan yang salah. Pada saat desain, Anda harus tahu akses publik apa yang ingin Anda berikan. Biasanya Anda memberikan akses publik karena itulah tujuan seluruh kelas Anda. Dan Anda memberikan akses yang dilindungi karena Anda ingin subclass untuk mengakses sesuatu. Dan Anda menggunakan pribadi untuk hal-hal yang bukan urusan orang lain.

Sekarang jika seseorang membutuhkan akses ke hal-hal yang tidak dapat diakses, maka Anda harus berpikir keras tentang kebutuhan itu . Mereka seharusnya tidak memerlukan akses itu, atau desain Anda salah. Mungkin desain Anda adalah salah, dan sesuatu yang tidak umum yang harus publik, sehingga Anda mengubah itu. Tetapi jika desain Anda benar, maka ada sesuatu yang salah dengan kebutuhan tersebut , jadi Anda memperbaikinya alih - alih merusak desain Anda.

gnasher729
sumber
Katakanlah Anda memiliki kelas yang Anda tidak berniat untuk subclass saat ini (dan mungkin tidak perlu) dan metode bahwa jika Anda berada subclass kelas Anda, akan berguna / diperlukan untuk / oleh subclass. Apakah Anda akan membuat metode itu privateatau protected?
lfk
Seharusnya jawaban yang diterima, jadikan semuanya pribadi pada awalnya terdengar seperti saya tidak ingin berpikir / desain.
Niing
1

Kunci untuk memahami aspek pemrograman Berorientasi Objek ini adalah konsep enkapsulasi data . Idenya adalah untuk membuat kelas lebih mudah dipahami dengan menyembunyikan detail implementasinya. Ini disebut penyembunyian data . Dengan demikian, kami hanya ingin mengekspos (mempublikasikan) fungsi-fungsi yang diperlukan untuk menggunakan kelas. Fungsi-fungsi ini adalah antarmuka ke kelas.

Pikirkan antarmuka seperti setir mobil. Anda memutuskan ke arah mana mobil berjalan dengan memutar roda, tetapi di bawah selimut terdapat katup putar, hidrolika, katrol yang mengubah rotasi roda Anda, tetapi Anda tidak perlu menjadi insinyur mekanik untuk mengendarai mobil.

Jadi jawaban untuk pertanyaan Anda adalah ya. Anda ingin menyembunyikan rincian tentang kelas dari kelas lain sebanyak mungkin. Memahami kapan sesuatu harus bersifat publik, pribadi, atau dilindungi mudah dipelajari tetapi sulit untuk dikuasai.

Chris Ghyzel
sumber