Kode seperti:
public Thing[] getThings(){
return things;
}
Tidak masuk akal, karena metode akses Anda tidak melakukan apa-apa selain secara langsung mengembalikan struktur data internal. Anda mungkin juga menyatakan Thing[] things
demikian public
. Gagasan di balik metode akses adalah untuk membuat antarmuka yang mengisolasi klien dari perubahan internal dan mencegah mereka dari memanipulasi struktur data aktual kecuali dengan cara diam-diam yang diizinkan oleh antarmuka. Ketika Anda mengetahui ketika semua kode klien Anda rusak, metode akses Anda tidak melakukan itu - itu hanya kode yang terbuang. Saya pikir banyak programmer cenderung menulis kode seperti itu karena mereka belajar di suatu tempat bahwa semuanya perlu dienkapsulasi dengan metode akses - tapi itu untuk alasan yang saya jelaskan. Melakukannya hanya untuk "mengikuti formulir" ketika metode akses tidak melayani tujuan apa pun hanyalah kebisingan.
Saya pasti akan merekomendasikan solusi yang Anda usulkan, yang mencapai beberapa tujuan enkapsulasi yang paling penting: Memberi klien antarmuka yang kuat dan bijaksana yang mengisolasi mereka dari detail implementasi internal kelas Anda, dan tidak memungkinkan mereka menyentuh struktur data internal berharap dengan cara yang Anda memutuskan sesuai - "hukum hak istimewa yang paling tidak diperlukan". Jika Anda melihat kerangka kerja OOP besar yang populer, seperti CLR, STL, VCL, pola yang Anda usulkan tersebar luas, untuk alasan itulah.
Haruskah kamu selalu melakukan itu? Belum tentu. Misalnya, jika Anda memiliki kelas pembantu atau teman yang pada dasarnya merupakan komponen dari kelas pekerja utama Anda dan tidak "menghadap ke depan", itu tidak perlu - ini adalah kerja keras yang akan menambahkan banyak kode yang tidak perlu. Dan dalam hal ini, saya tidak akan menggunakan metode akses sama sekali - tidak masuk akal, seperti yang dijelaskan. Cukup nyatakan struktur data dengan cara yang hanya mencakup kelas utama yang menggunakannya - sebagian besar bahasa mendukung cara melakukan itu - friend
, atau mendeklarasikannya dalam file yang sama dengan kelas pekerja utama, dll.
Satu-satunya downside yang bisa saya lihat dalam proposal Anda adalah bahwa itu lebih sulit untuk dikodekan (dan sekarang Anda harus melakukan pengkodean ulang kelas konsumen Anda - tetapi Anda tetap harus melakukan itu.) Tapi itu bukan kelemahan sebenarnya. - Anda perlu melakukannya dengan benar, dan terkadang itu membutuhkan lebih banyak pekerjaan.
Salah satu hal yang membuat programmer baik adalah mereka tahu kapan kerja ekstra itu layak, dan kapan tidak. Dalam jangka panjang menempatkan ekstra sekarang akan membuahkan hasil dengan dividen besar di masa depan - jika tidak pada proyek ini, maka pada yang lain. Belajarlah kode dengan cara yang benar dan gunakan kepala Anda tentang hal itu, bukan hanya secara robotik mengikuti formulir yang ditentukan.
Perhatikan bahwa koleksi yang lebih kompleks daripada array mungkin memerlukan kelas penutup untuk mengimplementasikan lebih dari tiga metode hanya untuk mengakses struktur data internal.
Jika Anda mengekspos seluruh struktur data melalui kelas yang berisi, IMO Anda harus memikirkan mengapa kelas itu dienkapsulasi sama sekali, jika itu bukan hanya untuk menyediakan antarmuka yang lebih aman - "kelas pembungkus". Anda mengatakan kelas yang mengandung tidak ada untuk tujuan itu - jadi mungkin ada sesuatu yang tidak beres tentang desain Anda. Pertimbangkan untuk memecah kelas-kelas Anda menjadi modul-modul yang lebih bijaksana dan meletakannya.
Kelas harus memiliki satu tujuan yang jelas dan rahasia, dan menyediakan antarmuka untuk mendukung fungsi itu - tidak lebih. Anda mungkin mencoba untuk menggabungkan hal-hal yang bukan milik bersama. Ketika Anda melakukan itu, segala sesuatu akan rusak setiap kali Anda harus menerapkan perubahan. Semakin kecil dan bijaksana kelas Anda, semakin mudah untuk mengubah keadaan: Pikirkan LEGO.
get(index)
,add()
,size()
,remove(index)
, danremove(Object)
. Menggunakan teknik yang diusulkan, kelas yang berisi ArrayList ini harus memiliki lima metode publik hanya untuk mendelegasikan ke koleksi batin. Dan tujuan kelas ini dalam program ini kemungkinan besar tidak merangkum ArrayList ini, tetapi melakukan sesuatu yang lain. ArrayList hanyalah detail. [...]