Kelebihan atau Parameter Opsional

10

Ketika saya memiliki fungsi yang mungkin, atau mungkin tidak menerima parameter tertentu, apakah lebih baik membebani fungsi tersebut, atau menambahkan argumen opsional?

Jika masing-masing memiliki pasang surut - kapan saya akan menggunakan masing-masing?

JNF
sumber
Dari perspektif optimasi, memiliki parameter opsional adalah opsi yang lebih baik.
Maneet Puri

Jawaban:

12

Jika bahasa mendukung mereka dengan benar (misalnya keamanan jenis, jika berlaku), saya lebih suka argumen opsional karena alasan berikut:

  • Mereka menyampaikan maksud Anda dengan lebih baik sehingga tidak ada yang curiga bahwa fungsi Anda yang berlebihan akan melakukan sesuatu yang berbeda (yang mungkin tidak seharusnya terjadi).
  • Lebih sedikit kode untuk dipelihara, bahkan jika fungsi kelebihan hanya mendelegasikan ke yang lebih komprehensif. Jika Anda ingin mengganti nama fungsi nanti, Anda memiliki setidaknya 3 tempat untuk melakukannya (dua definisi + satu panggilan).
  • Kompiler (jika ada) dapat menghasilkan binari yang lebih kecil.
  • Skala argumen opsional lebih baik, setidaknya dalam beberapa bahasa. Bagaimana jika Anda ingin memiliki 3 argumen opsional dengan kemampuan untuk mencampur dan mencocokkan? Untuk fleksibilitas penuh, Anda perlu 6 kelebihan untuk melakukannya.
  • Jika ini merupakan metode objek, banyak kelebihan akan sangat menghambat implementasi override dalam subclass.
Benjamin Kloster
sumber
Tidakkah Anda membutuhkan 8? Tiga argumen opsional a, bdan cmemiliki kemungkinan ini: tidak ada, a, b, c, ab, ac, bc, abc. Ini 2^nuntuk tipe yang berbeda, bukann!
Mark
0

Dengan asumsi situasi semacam konstruktor: Saya sering memilih pola pembangun yang fasih untuk mencegah situasi dengan banyak pilihan.

Misalnya. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))adalah contoh memanggil antarmuka pembangun yang lancar diimplementasikan di Guava.

Tentu saja Anda sekarang memerlukan objek terpisah untuk menahan keadaan pembangun Anda, tetapi Anda mengurangi kerumitan keseluruhan dengan memisahkan perilaku membangun dari perilaku yang dibangun.

Dibbeke
sumber
Ini tidak menjawab pertanyaan.
Andy