Apa yang lebih baik dan mengapa? (Dari sudut pandang desain-antarmuka):
a) Untuk memiliki dua Show()
dan Hide()
fungsi
b) Untuk memiliki satu SetVisible(bool visible)
fungsi
EDIT: Misalnya beberapa objek memiliki status visibilitas dan fungsi ini digunakan untuk mengubahnya.
c) Untuk memiliki ketiga Show()
, Hide()
, SetVisible(bool visible)
fungsi
java
c++
interfaces
pengguna3123061
sumber
sumber
Jawaban:
Saya lebih suka
SetVisible(bool visible)
, karena memungkinkan saya menulis kode klien seperti ini:alih-alih harus menulis
The
SetVisible
Pendekatan juga memungkinkan untuk pelaksanaan lebih mudah. Misalnya, jika kelas konkret tertentu hanya mendelegasikan metode ke kelas kompositnya, makaSetVisible
berarti satu metode lebih sedikit untuk diterapkan.sumber
MyObject.Visible = false;
menurut saya lebih intuitif daripadaMyObject.SetVisible(false);
SetVisible()
tidak menyarankan (kepada saya) bahwa Anda benar-benar menampilkan sesuatu. Bunyinya lebih seperti Anda mengatur properti visibilitas suatu objek, mungkin menyerahkannya ke metode yang sesuaiRefresh()
atauRedisplay()
untuk memeriksa nilai properti ini untuk menentukan apakah objek tersebut harus ditampilkan atau disembunyikan.setVisible(true)
Akan menggerakkan proses di mana objek akan ditarik ketika sistem idle berikutnya, jika tidak sebelumnya. Saya berharap bahwarefresh
mungkin berguna untuk mempercepat tampilan objek, tetapi objek tersebut pada akhirnya akan ditarik terlepas (kecuali misalnya visibilitasnya diaturfalse
sebelum itu terjadi).Saya tidak setuju dengan semua poster yang menyarankan beberapa fungsi untuk melakukan hal yang sama adalah hal yang baik. Sementara tiga fungsi bukan satu mungkin tidak tampak seperti banyak mengasapi, ingat bahwa kelas Anda mungkin berakhir dengan banyak fungsi tersebut (misalnya
setEnabled
,enable
,disable
) dan dengan demikian pendekatan ini akan berakhir dengan banyak antarmuka kelas yang lebih besar. Selain itu, kemungkinan Anda akan berakhir dengan sekelompok fungsi / properti terdengar serupa / apa pun di kelas Anda dan penggandaan fungsi lebih lanjut akan mengaburkan mana yang sesuai dengan apa.Dalam bahasa yang mendukung properti, ini harus lebih disukai tetapi karena Java maupun C ++ tidak melakukannya, saya kira itu adalah poin yang bisa diperdebatkan.
Saya pikir
setVisible()
harus lebih disukai karena alasan ini:setVisible(false)
Anda meneleponsetVisible(true)
sedangkan sebaliknyahide()
bisa dengan mudahreveal()
.setVisible(wantToSee)
daripada menggunakanif
pernyataan.setX()
formatnya akan digeneralisasi sehingga Anda dapat memiliki satu set fungsi yang konsisten sedangkan pendekatan verbed akan memunculkan sejumlah fungsi yang sulit ditemukan jika Anda tidak tahu apa yang Anda cari. Konsistensi dalam API membuatnya lebih mudah dipelajari dan diingat.sumber
Itu tergantung pada apa yang ditunjukkan dan disembunyikan artinya dalam konteks. Pertama Anda ingin mencari tahu mana yang merupakan "jalan utama" Anda, dan fokus pada pengembangan itu:
setVisible(bool)
show()
danhide()
OK, jadi sekarang setelah Anda mengkodekan inti "standar emas" itu, Anda perlu mencari tahu apakah itu layak menambahkan metode kenyamanan tipis dalam gaya lain, untuk membuat hidup lebih mudah bagi siapa pun yang akan menggunakan objek Anda.
setVisible(bool)
setVisible(a==b)
)show()
danhide()
onSuccess(widget.show)
)TLDR: Cari tahu mana yang paling penting, terapkan, dan kemudian tanyakan pada diri Anda apakah perlu menambahkan gaya lain sebagai metode kenyamanan yang tipis.
sumber
Saya akan mengatakan "ketiganya".
Show()
danHide()
cenderung lebih mudah grok daripadaSetVisible(true)
danSetVisible(false)
. Namun, ketika Anda ingin mengatur visibilitas secara logis, lebih baik memiliki metode yang mengambilbool
daripada membangunif
sekitar itubool
.Anda dapat mendukung ketiganya tanpa menduplikasi logika dan boilerplate minimal:
Atau, jika hal-hal yang Anda bungkus memiliki
SetVisible
API lebih -ish:sumber
System.Windows.Forms.Timer
. Secara pribadi, saya menemukan ini membingungkan. Ketika saya melihat keduanyaShow
danSetVisible
, kecenderungan pertama saya adalah bertanya-tanya apakah ada beberapa perbedaan penting antara kedua fungsi tersebut.Saya lebih suka show () dan hide (), pada kenyataannya, setiap metode yang menerima satu boolean dapat diubah untuk dua metode dan mengekspresikan maksud API dengan lebih baik. Sebagai contoh, Robert Martin dalam kode bersih merekomendasikan untuk memilih metode dengan argumen nol daripada metode dengan satu argumen.
Argumen penting lainnya bagi saya adalah keterbacaan, menurut saya kode yang baik dapat dibaca seperti prosa, prosa yang benar-benar aneh seperti "main_window setVisible false" daripada "main_window hide", Anda menulis atau berbicara seperti itu secara normal?, Mengapa menggunakan ini aneh konstruksi bahasa dalam program perangkat lunak, kapan mungkin menggunakan bahasa yang lebih alami?
sumber
it.setVisible(false); it.setVisible(true);
tidak akan mempengaruhi visibilitas orang tua kontrol, juga tidak akan mempengaruhi urutan atau lokasi Z kontrol. Sebaliknyahide(); show()
,; bisa secara masuk akal memaksa orangtua kontrol untuk terlihat, memindahkannya di atas kontrol lain, dan membatasi posisinya ke suatu tempat yang dapat dilihat. Dalam beberapa kasus, berguna untuk memastikan sesuatu benar-benar terlihat (seperti yang disebutkan di atasshow()
, tetapi dalam kasus lain, berguna untuk mengubah bendera visibilitas tanpa mengubah apa pun yang lain.Saya percaya bahwa semakin metode ini ekspresif, semakin mudah dibaca, dan konsekuensinya, kode akan dapat dipertahankan. Pertimbangkan dua kasus berikut:
Kasus 1:
Kasus 2:
Dalam kasus pertama, jelas apa fungsi "setVisible" lakukan, tetapi jika Anda ingin membacanya, Anda akan mengatakan:
Sementara itu lebih deskriptif untuk mengatakan:
yang akan mengubah fungsi "Kasus 1" menjadi yang berikut:
ini menghasilkan lebih banyak kode, tetapi lebih mudah dibaca.
Kasing kedua memiliki cacat yang jelas, yaitu, Anda sudah tahu bahwa Anda ingin menampilkan panel, jadi mengapa tidak menggunakan fungsi "Tampilkan"?
Saya tidak mengatakan bahwa menggunakan "setVisible" benar-benar salah, tetapi akan membingungkan ketika Anda mencoba membaca kode yang tidak ditulis oleh Anda dari waktu ke waktu, dan itu tidak sesuai dengan aturan "Fungsi harus hanya menjalankan satu operasi" aturan.
sumber
show customer panel iff the user/customer is enabled
. Saya setuju bahwa mungkin ada banyak kondisi yang lebih kompleks yang tidak semudah dibaca sebagai contoh Anda, namun, dalam kasus-kasus tersebut saya akan membagi kondisi-kondisi tersebut menjadi beberapa baris yang berbeda.Saya percaya bahwa
Hide()
/Show()
alternatif itu menarik karena lebih mudah untuk memahami apa yang terjadi daripada denganSetVisible(true)
, sementara memiliki fungsi tunggal lebih disukai karena menghindari banyak persyaratan.Jika itu yang terjadi maka saya sarankan menggunakan enumerasi sebagai input
SetVisible
, sehingga Anda mendapatkan salah satuSetVisible(Visibility.Visible)
atauSetVisible(Visibility.Hidden)
. Anda memiliki satu fungsi, Anda dapat langsung membaca tindakan apa yang sedang diambil.Menggunakan konvensi penamaan Java, Anda mungkin memiliki
setVisible(Visibility.VISIBLE)
atausetVisible(Visibility.HIDDEN)
.sumber
Saya setuju dengan jawaban Darien, tetapi ingin menambahkan sudut pandang dari perspektif programmer C #.
Ketika saya melihat kode yang mengatakan 'setXXX' saya membacanya untuk mengatakan bahwa itu menetapkan nilai pada suatu hal, saya tidak berharap ini memiliki efek samping dalam hal itu selain mengatur nilai itu, dan saya berharap ini menjadi idempoten (Yaitu saya bisa terus menyetelnya dengan nilai yang sama dan tidak apa-apa). Ini seperti mengakses bidang. Secara umum saya juga berharap untuk melihat metode 'getXXX' bersama dengan 'setXXX'.
Saya tidak tahu apakah ini yang Anda harapkan di Java dan C ++, tapi itulah yang saya harapkan di C #, meskipun di C # ada tulisan singkat untuk properti ini. Dan inilah beberapa panduan bagus tentang cara menggunakan Properties ( http://msdn.microsoft.com/en-us/library/ms182181.aspx ).
Dengan tampilan ini, maka antarmuka yang saya pilih bergantung sepenuhnya pada apakah ada efek samping (selain mengubah nilai bidang itu):
Jika melakukan tindakan memiliki efek samping, misalnya menampilkan kotak dialog maka saya akan pergi dengan "Tampilkan ()", dan "Sembunyikan ()".
Jika tidak memiliki efek samping, katakan saya sedang mengatur visibilitas "widget" dan sesuatu yang lain membuat widget itu tergantung pada keadaan itu maka saya akan menggunakan setVisibility atau setIsVisible. (Saya tidak akan menyebutnya SetVisible).
Di C # (tidak yakin tentang Java) cukup umum untuk mengadopsi pola pengamat, di mana kerangka kerja UI akan mendengarkan perubahan objek dan secara otomatis merender ulang UI ketika properti seperti perubahan Visibilitas. Itu berarti bahwa pengaturan nilai dengan memanggil setIsVisible muncul seolah-olah ia memiliki efek samping, tetapi dalam definisi saya tidak. Kontrak widget dipenuhi dengan menetapkan nilai bidangnya yang mewakili "IsVisible".
Dengan kata lain, tidak apa-apa bagi saya untuk mengaktifkan visibilitas label pada formulir sebelum formulir ditampilkan. Yaitu label.getIsVisible == true, tetapi formulir tidak ditampilkan.
Tidak apa-apa bagi saya untuk memanggil Hide () ketika formulir tidak ditampilkan.
sumber
getXXX()
dansetXXX()
metode Anda sebagai cara untuk mengakses bidang tanpa efek samping terdengar seperti Java dan bukan C #. Ini adalah cara Anda harus melakukannya di Jawa karena tidak memiliki properti. Jika saya melihat kode seperti itu di C #, saya kira itu ditulis oleh pengembang Java yang belum belajar tentang properti di C #.SetVisibility
.getXX
panggilan memilikisetXX
metode yang sesuai , makasetYY
tidak boleh memengaruhi, tetapi mungkin mempengaruhigetZZ
panggilan yang tidak memilikisetZZ
metode.Saya sarankan antarmuka yang sedikit dimodifikasi:
Nama yang lebih baik
Nama-nama metode ini membantu pengembang untuk memutuskan metode mana yang akan digunakan berdasarkan apa yang perlu dilakukan. Sedangkan
SetVisible(bool visible)
dapat membingungkan pengembang karena menyampaikan makna semantik yang sama denganShow()
danHide()
,Toggle()
menyiratkan adanya suatu kondisi yang menentukan tindakan. Dengan demikian menjadi intuitif bagi pengembang kapan harus menggunakan setiap metode.Mengurangi redundansi kode
Manfaat memiliki banyak metode di antarmuka Anda adalah menyederhanakan kode panggilan. Anda bisa saja mengekspos
Show()
danHide()
, tetapi:SetVisible()
metode pribadi untuk melakukan pekerjaan nyata di belakang layar (atau menulis kode redundan untukShow()
danHide()
).SetVisible()
(atauToggle()
) sudah dilakukan untuk menghindari kode mengasapi (saya benci kode berlebihan). Dengan demikian menduplikasi suatu metode yang mungkin sudah ada sebagai metode pribadi dalam implementasi.sumber
Saya akan menyarankan menggunakan
SetVisible(bool)
jika ada hanya jika mengaktifkan visibilitas dua kali (tampilkan dan sembunyikan kembali, atau sembunyikan dan tunjukkan kembali) akan meninggalkan hal-hal dalam keadaan yang pada dasarnya sama seperti sebelum operasi dilakukan (tidak apa-apa jika menunjukkan dan menyembunyikan kembali sesuatu atau sebaliknya meninggalkan objek yang membutuhkan redraw, asalkan dapat diharapkan terjadi "secara otomatis"). Jika menyembunyikan dan menunjukkan objek tidak akan memiliki efek selain mengubah satu bit status, maka masuk akal untuk kode luar untuk memiliki beberapa metode yang menerima parameter visibilitas, dan penulisan kode tersebut akan difasilitasi olehSetVisible
.Jika menyembunyikan dan menampilkan kembali suatu objek mungkin memiliki efek samping seperti mengubah urutan Z, tindakan seperti itu seharusnya lebih mungkin dilakukan dengan metode terpisah. Dalam kasus seperti itu, kegunaan metode luar yang menerima parameter "visibilitas" akan terbatas, sehingga akan ada sedikit keuntungan untuk memfasilitasi mereka. Lebih lanjut, suatu
SetVisible
metode akan (secara keliru) menyarankan bahwa perubahan visibilitas objek dapat dilakukan tanpa efek samping.sumber