Apakah ini bau kode jika metode pribadi memanggil yang umum?

25

Apakah itu bau kode untuk memanggil metode publik dalam metode pribadi dari instance objek yang sama?

Eimantas
sumber
AAMOI apakah Anda memiliki contoh khusus?
ocodo
Tidak, tidak sekarang. Baru ingat sebuah kasus yang saya diskusikan dengan kolega saya. Ingin mendapatkan beberapa pendapat di sini juga.
Eimantas
5
Biasanya saya bisa mengetahui akronim berdasarkan konteksnya, tapi AAMOI saya pasti harus melihat ke atas
Carson Myers
@Carson - apakah Anda menemukan sesuatu?
Eimantas
4
Sebagai Hal yang Menarik
Carson Myers

Jawaban:

32

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.

Kutu buku
sumber
Saya setuju. Beberapa metode menyediakan fungsionalitas yang berguna baik untuk internal, dan untuk penelepon eksternal. Bendera merah mungkin jika metode publik sangat spesifik untuk implementasi internal, tetapi bahkan kemudian, tidak setiap kelas dimaksudkan untuk menyembunyikan internalnya. Saya sering memiliki "alat" lapisan struktur data di bawah lapisan tipe abstrak wadah, misalnya - dengan cara itu saya dapat menggunakan kembali beberapa kode struktur data untuk struktur data lain yang mendasari wadah lain.
Steve314
19

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.

ocodo
sumber
5
+1 untuk 'bukan penyebab alarm'. Terlalu sering kita melihat 'bau' dan langsung beralih ke mode refactor tanpa berpikir.
Michael K
+1 untuk SRP. Saya hanya menemukan sebuah kasus di mana dekorator tidak bekerja karena kelas yang didekorasi memanggil fungsi publiknya sendiri, melewati dekorator. Solusinya: pecah kelas menjadi dua dan menyuntikkan ketergantungan dihiasi.
Jon Hulka
18

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.

Kim
sumber
Mengapa? Jika metode publik yang ditimpa menyebabkan kejutan yang tidak menyenangkan, apakah benar-benar penting siapa yang memanggil metode itu?
user281377
4
Ya itu. Jika mengganti satu metode publik memecah metode publik lain saya bisa menimpa metode lain juga. Jika itu melanggar metode pribadi, saya bisa ....?
Kim
5
Kejutan yang tidak menyenangkan akibat menimpa metode publik adalah bau kode itu sendiri. Kode bau, sebenarnya.
Larry Coleman
Kim: jika metode ini bersifat publik, Anda harus berasumsi bahwa kelas-kelas lain juga memanggil metode itu ...
user281377
@Larry: Tepat! Metode pribadi (yang biasanya berisi asumsi implementasi khusus) yang memanggil metode publik membuatnya lebih mungkin bahwa mengesampingkan metode publik akan merusak banyak hal.
Kim
5

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.

Nivas
sumber
5

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?

pengguna281377
sumber
Atau minta metode publik mendelegasikan ke metode pribadi (baru) yang dipanggil oleh metode pribadi lainnya. Tapi, kenapa repot-repot?
Lawrence Dol
4

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?)

Nama tampilan
sumber
2

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?

  1. Metode publik dapat berisi tes yang tidak diperlukan setelah kode pelaksana Anda secara internal. Itu mungkin menerima UserObj dan ingin menguji izin pengguna misalnya.

  2. 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.

  3. Lebih cenderung memperkenalkan kesalahan melingkar dan loop tak terbatas dan keluar dari mem pengecualian menurut saya.

  4. 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.

Mark Graham
sumber
1
Bagaimana jika metode publik yang ada dipanggil oleh banyak kelas lain? Menjadikannya pribadi akan mematahkan itu. Ingat bahwa metode publik dipanggil oleh kelas lain karena alasan lain, bukan hanya kelas ini. agak mengapa ada metode publik.
Michael Durrant
Saya menyatakan bahwa 'konten metode publik harus diambil dan ditempatkan dalam metode pribadi ...' Metode publik akan tetap ada, tetapi lakukan panggilan ke metode pribadi yang baru. Seperti halnya metode pribadi lainnya yang perlu menggunakan kembali fungsi yang sama.
Mark Graham
Jadi Anda menambahkan metode lain tanpa alasan lain selain - yah, karena Anda menyatakan ini sebagai "bau kode". Metode tak berguna adalah bau kode yang lebih buruk.
gnasher729
Maaf, tetapi, bukankah saya hanya menyebutkan beberapa alasan di atas. Banyak kode yang saya tulis adalah untuk sistem bisnis, banyak kelas dibatasi untuk pengguna berdasarkan peran. Banyak metode publik menguji izin pengguna dan params. Mengapa saya ingin memanggil kembali ke metode publik yang sama untuk menggunakan kembali fungsinya dan menguji kembali izin pengguna?
Mark Graham
Saya tidak pernah dalam hidup saya perlu memanggil metode publik dari metode pribadi. Sepertinya dan terasa sangat salah bagi saya. Saya benar-benar terkejut kebanyakan orang berpikir itu tidak masalah.
Trap
2

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?

  • Buat duplikat metode pribadi? Tidak
  • Buat metode publik khusus untuk acara ini? Tidak
  • Panggil metode pribadi khusus yang dapat memanggil metode publik? Tidak
  • Semacam super yang bisa melakukan ini? Tidak

Jawabannya jelas bahwa ketika Anda ingin fungsionalitas dalam metode publik Anda harus dapat memanggil metode itu dari metode kelas ini atau dari kelas lain.

Michael Durrant
sumber
1

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.

Neil
sumber
1

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).

Brad Thomas
sumber