Anda tidak dapat menulis kode yang baik tanpa getter.
Alasan mengapa bukan karena getter tidak merusak enkapsulasi, mereka melakukannya. Bukan karena getter tidak menggoda orang untuk tidak mengikuti OOP yang akan membuat mereka menggunakan metode dengan data yang mereka tindak lanjuti. Mereka melakukannya. Tidak, Anda perlu getter karena batasan.
Ide-ide enkapsulasi dan menjaga metode bersama-sama dengan data yang mereka lakukan tidak berfungsi ketika Anda mengalami batas yang membuat Anda tidak bisa memindahkan metode dan memaksa Anda untuk memindahkan data.
Sangat sederhana. Jika Anda menggunakan getter ketika tidak ada batas Anda akhirnya tidak memiliki objek nyata. Semuanya mulai cenderung prosedural. Yang bekerja sebaik yang pernah dilakukannya.
OOP sejati bukanlah sesuatu yang bisa Anda sebarkan ke mana-mana. Itu hanya bekerja dalam batas-batas itu.
Batas-batas itu tidak tipis. Mereka memiliki kode di dalamnya. Kode itu tidak boleh OOP. Itu juga tidak bisa berfungsi. Tidak ada kode ini yang dicabut dari cita-cita kita sehingga dapat menghadapi kenyataan pahit.
Michael Fetters menyebut kode ini fascia setelah jaringan ikat putih yang menyatukan bagian-bagian jeruk.
Ini adalah cara yang bagus untuk memikirkannya. Ini menjelaskan mengapa tidak masalah memiliki kedua jenis kode dalam basis kode yang sama. Tanpa perspektif ini banyak programmer baru yang berpegang teguh pada cita-cita mereka, maka hati mereka hancur dan menyerah pada cita-cita ini ketika mereka mencapai batas pertama mereka.
Cita-cita hanya bekerja di tempat yang seharusnya. Jangan menyerah pada mereka hanya karena mereka tidak bekerja di mana-mana. Gunakan mereka di tempat mereka bekerja. Tempat itu adalah bagian berair yang dilindungi fasia.
Contoh sederhana dari batas adalah koleksi. Ini menyimpan sesuatu dan tidak tahu apa itu. Bagaimana mungkin seorang perancang koleksi dapat memindahkan fungsionalitas perilaku objek yang dipegang ke dalam koleksi ketika mereka tidak tahu apa yang akan dipegangnya? Kamu tidak bisa Anda menghadapi batas. Itulah sebabnya koleksi memiliki getter.
Sekarang jika Anda tahu, Anda bisa memindahkan perilaku itu, dan menghindari keadaan bergerak. Ketika Anda tahu, Anda harus melakukannya. Anda tidak selalu tahu.
Beberapa orang menyebut ini pragmatis. Dan itu. Tapi senang mengetahui mengapa kita harus pragmatis.
Anda telah menyatakan bahwa Anda tidak ingin mendengar argumen semantik dan tampaknya menganjurkan menempatkan "pengambil yang masuk akal" di mana-mana. Anda meminta ide ini ditantang. Saya pikir saya bisa menunjukkan ide memiliki masalah dengan cara Anda membingkainya. Tetapi saya pikir saya tahu dari mana Anda berasal karena saya pernah ke sana.
Jika Anda ingin getter di mana-mana lihatlah Python. Tidak ada kata kunci pribadi. Namun Python melakukan OOP dengan baik. Bagaimana? Mereka menggunakan trik semantik. Mereka menyebut segala sesuatu yang dimaksudkan untuk menjadi pribadi dengan garis bawah terkemuka. Anda bahkan diizinkan membaca darinya asalkan Anda bertanggung jawab untuk melakukannya. "Kita semua orang dewasa di sini", kata mereka.
Jadi apa perbedaan antara itu dan menempatkan getter pada semua yang ada di Java atau C #? Maaf tapi ini semantik. Konvensi Piton menggarisbawahi dengan jelas memberi sinyal kepada Anda bahwa Anda mencari-cari di balik pintu satu-satunya karyawan. Tampar getter pada semuanya dan Anda kehilangan sinyal itu. Dengan refleksi Anda bisa menanggalkan privasi dan tetap tidak kehilangan sinyal semantik. Tidak ada argumen struktural untuk dibuat di sini.
Jadi yang tersisa adalah tugas menentukan di mana harus menggantung tanda "hanya karyawan". Apa yang harus dianggap pribadi? Anda menyebutnya "getter yang masuk akal". Seperti yang telah saya katakan, pembenaran terbaik bagi seorang pengambil adalah batas yang memaksa kita menjauh dari cita-cita kita. Itu seharusnya tidak menghasilkan getter dalam segala hal. Ketika itu menghasilkan pengambil, Anda harus mempertimbangkan untuk memindahkan perilaku lebih jauh ke dalam bit yang berair di mana Anda dapat melindunginya.
Pemisahan ini telah memunculkan beberapa istilah. Objek Transfer Data atau DTO, tidak memiliki perilaku. Satu-satunya metode adalah getter dan kadang setter, kadang konstruktor. Nama ini sangat disayangkan karena itu bukan objek yang benar sama sekali. Getter dan setter hanya kode debugging yang memberi Anda tempat untuk mengatur breakpoint. Jika bukan karena kebutuhan itu, mereka hanya akan menjadi tumpukan bidang publik. Di C ++ kami biasa menyebutnya struct. Satu-satunya perbedaan yang mereka miliki dari kelas C ++ adalah mereka default ke publik.
DTO bagus karena Anda dapat melemparkannya ke dinding batas dan menjaga metode Anda lainnya dengan aman di objek perilaku berair yang bagus. Objek sejati. Tanpa getter untuk melanggar enkapsulasi itu. Objek perilaku saya dapat memakan DTO dengan menggunakannya sebagai Objek Parameter . Kadang-kadang saya harus membuat salinan defensif untuk mencegah keadaan yang dapat diubah bersama . Saya tidak menyebarkan DTO yang bisa berubah di dalam bagian berair di dalam batas. Saya merangkum mereka. Saya menyembunyikannya. Dan ketika saya akhirnya menemukan batas baru, saya memutar DTO baru dan melemparkannya ke dinding sehingga menjadikannya masalah orang lain.
Tetapi Anda ingin memberikan getter yang mengekspresikan identitas. Nah selamat Anda telah menemukan batas. Entitas memiliki identitas yang melampaui referensi mereka. Artinya, di luar alamat memori mereka. Jadi itu harus disimpan di suatu tempat. Dan sesuatu harus bisa merujuk hal ini dengan identitasnya. Seorang pengambil yang mengungkapkan identitas adalah sangat masuk akal. Setumpuk kode yang menggunakan pengambil itu untuk membuat keputusan yang bisa dibuat sendiri oleh Entitas.
Pada akhirnya bukan keberadaan getter yang salah. Mereka jauh lebih baik daripada bidang publik. Apa yang buruk adalah ketika mereka digunakan untuk berpura-pura Anda Berorientasi Objek ketika Anda tidak. Surat kabar baik. Berorientasi pada Obyek itu baik. Getters bukan Berorientasi Objek. Gunakan getter untuk mengukir tempat yang aman untuk menjadi Berorientasi Objek.