Apakah lebih baik memanggil fungsi yang tidak memiliki efek pada saat itu, JIKA itu meningkatkan kejelasan kode?

60

Saya memiliki tiga tampilan di program saya (aplikasi iOS). Hanya satu dari mereka yang aktif pada saat yang sama sehingga saya menonaktifkan visibilitas untuk dua dari mereka dan mengalihkan visibilitas saat pengguna menekan tombol. Tampilan diinisialisasi sebagai terlihat sehingga saya menonaktifkan visibilitas dalam kode sebelum tampilan utama ditampilkan.

dapat saya lakukan

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

untuk dua tampilan, tetapi sekarang yang ketiga (yang harus terlihat pada awal aplikasi) tidak ditangani. Saya menempatkan

[view3 setAlpha:1.0f];

setelah dua yang pertama, karena saya pikir tetap jelas bahwa sebenarnya ada tiga pandangan, bukan dua seperti yang orang pikirkan ketika melihat kode. Bagaimana programmer lain melakukan ini? Apakah ini murni preferensi atau ada beberapa konvensi?

Jika panggilan itu sangat berat, jelas lebih baik untuk tidak meneleponnya saat itu tidak perlu, tetapi saya bertanya-tanya tentang hal-hal kecil seperti contoh saya.

Kevin
sumber

Jawaban:

134

Anda memiliki invarian:

Hanya satu tampilan (dari 3) yang pernah aktif (dan terlihat).

Lalu, saya sarankan Anda menyediakan fungsi untuk mengalihkan aktivitas dan visibilitas SEMUA tampilan sekaligus:

[setActiveView viewID:2]

Fungsi ini akan:

  • periksa apakah tampilan sudah aktif, hindari pekerjaan yang tidak perlu
  • atur tampilan sebagai aktif, dan terlihat
  • atur 2 pandangan lainnya sebagai tidak aktif dan tidak terlihat

Ini memiliki beberapa keuntungan tentang panggilan mentah ke setVisibility:

  • ramah: menyebutnya tidak perlu tidak membuat masalah kinerja
  • defensive: parameter tunggal jauh lebih sulit untuk dirusak, sedangkan untuk setVisibilityitu lebih sulit untuk diingat bahwa rentang nilai adalah 0.0f - 1.0fdan bahwa hanya satu yang harus diatur ke1.0f
  • tangguh: orang berikutnya tidak dapat secara tidak sengaja melupakan salah satu pandangan
  • adaptable: menambah / menghapus tampilan tidak perlu memeriksa semua kode aplikasi untuk menemukan di mana switch berada, satu fungsi (yang ini) perlu diperbarui

Idealnya, untuk membantu menegakkan invarian, tidak ada fungsi lain yang dapat mengacaukan pengaturan ini ...

Matthieu M.
sumber
Saran bagus. Saya akan melakukan ini dengan contoh saya saat ini. Tetapi bagaimana bila desain seperti itu tidak mungkin / diinginkan? Atau apakah Anda memutuskan di tempat apa cara terbaik untuk menanganinya?
Kevin
4
@ Kevin: Sangat tergantung. Kadang-kadang Anda bisa menyelesaikan masalah dengan mengulangi koleksi, terkadang tidak, tetapi prinsip utamanya adalah untuk menghindari duplikasi dan membuatnya mudah untuk mempertahankan invarian. Semakin banyak tindakan "manual" perlu diingat untuk hal-hal untuk bekerja dengan benar, semakin sedikit peluang Anda bahwa hal-hal akan berfungsi dengan baik. Saya benci tidak jelas di sini, tetapi ada begitu banyak situasi yang berbeda sehingga saya khawatir aturan "generik" hanya akan menyesatkan Anda.
Matthieu M.
23
"membuatnya mudah untuk mempertahankan invarian" adalah aturan umum yang perlu diingat.
Gusdor
1
@ Tony: Saya tidak tahu apakah mendorong penggunaan variabel global adalah "melakukannya dengan benar", tetapi memang jika Anda tahu persis mana yang aktif sebelumnya, Anda hanya perlu memperbarui dua tampilan. Solusi lain adalah agar setiap pandangan mengingat visibilitasnya dan untuk setVisibilitytidak melakukan apa pun jika visibilitas sudah menjadi yang diminta, yang menurunkan tanggung jawab.
Matthieu M.
1
@ MatthieuM. Saya menulis dengan tergesa-gesa, tetapi sebenarnya apa yang saya maksudkan juga. Jika Anda tahu keadaan sebelumnya, Anda hanya perlu memperbarui 2 tampilan paling banyak. Bagaimana mengingat keadaan itu adalah masalah lain ;-). Adapun memindahkan tanggung jawab ke bawah: Jika kelas tampilan tidak menyediakan untuk itu Anda perlu membungkus kelas di objek lain hanya untuk menambahkan properti itu. Itu solusi bersih, tapi mungkin agak berlebihan.
Tonny
12

Gagasan alternatif: jika tujuan Anda adalah mencegah bug terjadi karena orang lupa ada tiga pandangan dan melakukan sesuatu dengan hanya dua di antaranya yang benar-benar harus mereka lakukan dengan semua itu, maka buatlah fungsi yang membuat mustahil untuk dilupakan:

setViewVisibilities(0.0f, 0.0f, 1.0f)

Sekarang Anda memiliki sesuatu yang jauh lebih kuat - waktu kompilasi menjamin Anda tidak lupa . Jika Anda lupa parameter, kompiler akan berteriak kepada Anda. Ini jauh lebih berguna daripada komentar atau kode yang tidak perlu, karena membuat protokol bernama ketat yang memberlakukan properti yang Anda pedulikan.

Untuk kasus di mana view3visibilitasnya tidak perlu diubah, Anda dapat menambahkan beberapa perilaku di mana melewati nilai khusus seperti -1.0atau nilatau sesuatu di sepanjang garis itu berarti "tidak mengubah visibilitas tampilan sama sekali". Ini mengatasi masalah pengaturan visibilitas yang tidak perlu.

Mendongkrak
sumber
9
Jika OP mendapatkan hingga 10+ tampilan, parameter per tampilan akan menjadi mustahil untuk dipertahankan. Poin Anda tentang kesalahan waktu kompilasi sudah benar, tetapi ini adalah solusi yang sangat tidak dapat dipertahankan, sayangnya.
Chris Cirefice
3
@ChrisCirefice: Jika jumlah view bertambah, Anda bisa membuat semacam objek / kelas "ViewState", yang memberlakukan invarian ini. Kemudian gunakan itu untuk beralih dll. Dengan begitu banyak tampilan, beberapa jenis objek manajer mungkin masuk akal pula.
sleske
8

Saya akan percaya bahwa menambahkan komentar yang menjelaskan bahwa panggilan itu tidak diperlukan (dan mengapa) adalah yang terbaik.

(mungkin, fakta bahwa panggilan tidak diperlukan, atau bahwa Anda memerlukan komentar tentang itu, mungkin merupakan bau kode)

Basile Starynkevitch
sumber
1
@Niall Jika memungkinkan, pernyataan akan lebih baik daripada komentar.
200_success
9
Komentar bukanlah solusi untuk kode yang tidak dapat dipelihara dan tidak dapat dibaca
dj18
2
@Kevin atau Anda dapat menulis kode yang dapat dibaca tanpa komentar.
Jan
1
@ Jan Komentar lebih dari sekedar menjelaskan apa kode tidak .......
Kevin
2
@ Kevin Saya akan mengatakan komentar tidak boleh ada untuk menjelaskan kode apa, tetapi untuk menjelaskan mengapa ia melakukannya. Dan dalam situasi seperti itu seringkali refactor akan mendapatkan maksud tanpa perlu komentar (yang terdengar seperti poin Jan).
RJFalconer
4

Dalam kasus khusus ini, @Mattieu M. memiliki solusi yang tepat.

Dalam kasus yang lebih umum, di mana tidak ada sama mengubah, Anda harus bertanya pada diri sendiri: Apakah ada setiap kesempatan programmer kekuatan kekacauan masa ini sampai?

Jawabannya biasanya ya. Yang berarti, ya, Anda harus menambahkan panggilan. Mungkin beberapa versi kerangka masa depan dimulai dengan semua tampilan MATI bukan AKTIF.

Stig Hemmer
sumber