Saya baru saja mulai menulis beberapa kelas baru dan terpikir oleh saya bahwa saya menambahkan banyak argumen metode yang tidak sepenuhnya diperlukan. Ini mengikuti kebiasaan untuk menghindari keadaan dalam kelas yang khusus untuk beberapa pemanggilan metode, daripada konfigurasi umum atau dependensi kelas.
Melakukannya berarti bahwa banyak metode yang tidak memiliki argumen berakhir dengan satu, dua atau tiga.
Saya ingin mendengar pendapat Anda tentang apa yang Anda pikirkan tentang tradeoff ini, dan bagaimana Anda memutuskan pendekatan mana yang harus diambil dalam situasi apa?
Karena kode seringkali lebih mudah dipahami daripada bahasa Inggris ketika mendeskripsikan kode, saya membuat sedikit intisari yang memiliki kedua varian di dalamnya: https://gist.github.com/JeroenDeDauw/6525656
sumber
Jawaban:
Karena satu-satunya metode yang terlihat secara eksternal dari contoh Anda adalah
updateTable
, saya pikir boleh saja menggunakan bidang alih-alih parameter metode.Jika ini adalah bagian dari kelas yang lebih umum (mis.
TableTools
), Saya akan memindahkan metode helper yang membutuhkan negara ke kelas batin yang tersembunyi.Contoh kode semu:
Dengan begitu, Anda menghindari bidang yang hanya digunakan oleh satu metode publik. Selain itu, kode ini adalah thread-safe dalam arti bahwa setiap panggilan ke updateTable menggunakan salinan TableUpdater sendiri dan, dengan demikian, variabel instan TableUpdater.
sumber
Menggunakan bidang mengkooptasi kemampuan untuk memiliki multithreading tersedia untuk metode yang menggunakan bidang tersebut.
Menggunakan bidang-bidang seperti itu hanya sedikit lebih baik daripada menggunakan global dari sudut pandang reusability dan maintainability, poin utama di sini adalah bahwa pengaturan yang rumit memerlukan dokumentasi yang cermat dan terkini tentang metode mana yang menggunakan dan / atau mengungkit bidang mana; sesuatu yang tidak perlu Anda lakukan saat menggunakan argumen.
sumber
Dalam kata-kata awam:
Sekali lagi, menurut pendapat saya metode non-kohesif milik kelas utilitas dan bukan ke kelas dengan nama domain.
sumber
Jangan gunakan bidang dalam kasus saat ini! Dua "utas" yang menggunakan objek pada saat yang sama akan saling membingungkan. Mereka tidak harus menjadi nyata, utas terpisah juga (karenanya kutipan). Jika Anda mengatur objek untuk satu tabel, lalu memanggil metode yang menggunakannya untuk tabel lain, lalu mencoba menggunakan pengaturan asli, Anda memiliki masalah. Tetap dengan parameter untuk saat ini.
Apa yang ingin Anda lakukan di sini adalah membuat kelas updater baru yang hanya digunakan dalam satu kasus. Kelas asli dapat memiliki metode untuk membuat instance kapan pun diperlukan. Kelas baru akan memiliki bidang. Anda memiliki yang terbaik dari kedua dunia. Terkadang lebih mudah untuk tetap menggunakan parameter, tetapi dalam contoh Anda, Anda sudah sampai di mana kelas yang terpisah akan lebih baik.
sumber
Saya pikir, bahwa pemilihan harus sesuai dengan situasi nyata, seperti yang Anda lihat. Jika item milik instance, itu harus dilihat sebagai bidangnya. Jika item tersebut eksternal dari instance, item tersebut harus dilewatkan sebagai parameter metode.
Kita harus dibimbing dalam kasus ini bukan oleh keefektifan (perbedaannya tidak signifikan), atau (kemudahan Tuhan!) Kemudahan mengetik, tetapi oleh pemahaman dan kealamian kode.
sumber
Menurut pendapat saya, jika Anda menulis kode yang melakukan sesuatu terhadap sesuatu, maka ia harus mengambil parameter yang menentukan hal-hal apa yang harus dilakukan dan namanya harus menentukan sejauh mungkin apa yang dilakukannya terhadapnya.
Jika Anda menulis kode yang mengemas tindakan untuk dilakukan pada sesuatu maka Anda harus membungkus hal-hal yang harus dilakukan pada suatu objek dan meneruskannya ke hal Anda yang melakukan sesuatu .
Tindakan ini kemudian menjadi semacam meta-deskripsi panggilan ke metode pertama yang mungkin dapat Anda lakukan di kemudian hari dengan mengantri atau bahkan memutuskan untuk tidak melakukannya sama sekali karena alasan tertentu.
Jadi, pertanyaan Anda diterjemahkan menjadi apakah itu Aksi atau Fungsi ? Suatu Tindakan dapat ditunda atau dibatalkan dan oleh karena itu harus merangkum apa yang ditindaklanjuti. Suatu Fungsi terjadi segera sehingga tidak perlu lagi mempertahankan parameternya.
Anda dapat membatalkan dan Bertindak tetapi bukan suatu Fungsi .
sumber