Apakah itu bau kode untuk memanggil metode publik dalam metode pribadi dari instance objek yang sama?
25
Apakah itu bau kode untuk memanggil metode publik dalam metode pribadi dari instance objek yang sama?
Jawaban:
Tidak bau tidak enak. Ini mungkin diperlukan, mengapa Anda menduga itu salah? Metode pada tingkat atom adalah entitas independen yang melakukan tugas. Selama melakukan tugas, siapa pun yang memiliki akses ke sana dapat memanggilnya untuk menyelesaikan tugas.
sumber
Bau kode? Ya, bukan yang benar-benar buruk, tetapi indikator yang baik bahwa kelas mungkin memiliki tanggung jawab terlalu banyak.
Anggap itu sebagai tanda bahwa kelas mungkin perlu dipecah menjadi objek yang berbeda, metode pribadi seharusnya tidak perlu memanggil metode publik dari objek yang sama, tentu saja dalam desain OO yang bersih.
Tentu saja, setelah Anda memeriksa kelas dan alasan untuk pemanggilan metode jelas, itu mungkin penggunaan yang sangat masuk akal, secara umum Anda akan mengharapkan metode utilitas untuk kelas menjadi pribadi, tetapi jika ada yang cukup berguna untuk menjadi umum dan digunakan dengan metode lain, saya, umumnya, berharap metode-metode itu untuk umum juga.
Seperti semua kode bau, ini adalah motivasi untuk pemeriksaan kode lebih lanjut, merasionalisasi dan mungkin refactor, tetapi bukan alasan untuk khawatir.
sumber
Ini dapat menyebabkan kejutan yang tidak menyenangkan jika seseorang yang belum membaca kode sumber kelas ini mencoba untuk mensubklasifikasikan dan menimpa metode publik. Apakah itu benar-benar masalah jelas tergantung pada situasi Anda. Mungkin Anda harus mempertimbangkan membuat metode publik atau bahkan final kelas.
sumber
Saya rasa kita tidak bisa membuat genarisasi.
Itu semua sangat tergantung pada konteks.
Saya mungkin memiliki, katakanlah, metode utilitas publik di kelas yang digunakan oleh kelas lain, dan juga beberapa metode pribadi di kelas yang sama.
sumber
Tidak. Apa lagi yang harus dilakukan dalam kasus itu? Jadikan metode pribadi publik atau metode publik pribadi? Salin-tempel kode dari metode publik ke yang pribadi?
sumber
TIDAK , tidak ada bau busuk di sini.
jika kita mengimplementasikan antarmuka antrian dengan List, apakah bau hanya memanggil fungsi Daftar yang tepat untuk mencapai implementasi antrian dengan mudah?
jika Anda memiliki sesuatu dan Anda ingin mengubahnya menjadi sesuatu yang lain (seperti pembungkus) maka itu bukan bau yang buruk, kodenya dapat digunakan kembali dengan pola desain yang bertindak di tingkat fungsi (apakah fungsi merupakan objek?)
sumber
Saya tahu ini adalah postingan lama, tapi ini sesuatu yang saya perdebatkan di tempat kerja. Saya 'menganggap' ini bau kode, dan tidak bisa mengerti mengapa Anda ingin melakukan ini. Jika metode pribadi harus memanggil metode publik, maka konten metode publik harus diambil dan ditempatkan dalam metode pribadi, yang kemudian dapat dipanggil oleh kedua metode. Mengapa?
Metode publik dapat berisi tes yang tidak diperlukan setelah kode pelaksana Anda secara internal. Itu mungkin menerima UserObj dan ingin menguji izin pengguna misalnya.
Setelah panggilan publik, Anda mungkin memiliki persyaratan untuk mengunci objek, jika Anda menggunakan threading, jadi secara internal, Anda tidak ingin menelepon kembali ke metode publik.
Lebih cenderung memperkenalkan kesalahan melingkar dan loop tak terbatas dan keluar dari mem pengecualian menurut saya.
Polos dan sederhana, desain buruk dan "malas". Metode publik menyediakan akses ke dunia luar. Tidak ada alasan untuk berjalan kembali ke luar ketika Anda sudah di dalam.
sumber
Bayangkan sebaliknya. Anda menggunakan metode pribadi dan Anda membutuhkan fungsionalitas dalam metode publik. Bagaimana jika Anda tidak dapat memanggil metode publik itu dari metode pribadi. Apa yang akan kamu lakukan?
Jawabannya jelas bahwa ketika Anda ingin fungsionalitas dalam metode publik Anda harus dapat memanggil metode itu dari metode kelas ini atau dari kelas lain.
sumber
Dalam kode saya, saya sering membuat pemuat pemalas, yang artinya objek tersebut diinisialisasi saat pertama kali diminta dan kemudian menggunakan kembali objek instantiated yang sama. Namun, objek yang dipakai menggunakan beban malas menyiratkan bahwa itu mungkin tidak harus dipakai pada titik tertentu. Daripada membungkus kepala saya di sekitar urutan panggilan sehingga saya tahu bahwa objek itu sudah dipakai atau mengulangi kode yang sama dari beban malas di dalam metode lain, saya hanya memanggil loader malas setiap kali saya membutuhkan objek itu.
Sama seperti Anda dapat menggunakan metode publik dengan cara yang cerdas, Anda juga dapat menggunakannya secara salah. Contohnya mungkin metode publik yang memproses parameternya sebelum memanggil metode pribadi lainnya. Ini akan menjadi kesalahan untuk memanggil metode publik dengan santai hanya karena Anda memiliki parameter yang sama. Kesalahannya halus tetapi kesalahan desain lebih dari apa pun dan mengharuskan Anda belajar mengelola dengan parameter metode internal daripada parameter metode publik.
Jadi untuk menjawab pertanyaan Anda, tentu bukan kode yang buruk jika Anda menggunakannya dengan benar.
sumber
Pertanyaan yang perlu Anda tanyakan pada diri sendiri adalah mengapa kelas Anda memiliki kebutuhan yang sama dengan klien kelas Anda? Biasanya kelas memiliki kebutuhan yang sangat berbeda dari kliennya. Jadi ya, ini adalah indikasi bahwa Anda memiliki keduanya
(a) mengungkapkan sesuatu kepada publik yang seharusnya bersifat pribadi; atau
(B) perilaku kelas tidak cukup sempit (pikirkan prinsip tanggung jawab tunggal).
sumber