Berapa banyak parameter yang terlalu banyak? [Tutup]

228

Rutinitas dapat memiliki parameter, itu bukan berita. Anda dapat menetapkan sebanyak mungkin parameter yang Anda butuhkan, tetapi terlalu banyak parameter akan membuat rutinitas Anda sulit dipahami dan dipelihara.

Tentu saja, Anda bisa menggunakan variabel terstruktur sebagai solusinya: menempatkan semua variabel tersebut dalam satu struct dan meneruskannya ke rutin. Bahkan, menggunakan struktur untuk menyederhanakan daftar parameter adalah salah satu teknik yang dijelaskan oleh Steve McConnell dalam Code Complete . Tapi seperti katanya:

Pemrogram yang berhati-hati menghindari penggabungan data lebih dari yang diperlukan secara logis.

Jadi jika rutin Anda memiliki terlalu banyak parameter atau Anda menggunakan struct untuk menyamarkan daftar parameter besar, Anda mungkin melakukan sesuatu yang salah. Artinya, Anda tidak membuat sambungan longgar.

Pertanyaan saya adalah, kapan saya bisa menganggap daftar parameter terlalu besar? Saya pikir lebih dari 5 parameter, terlalu banyak. Bagaimana menurut anda?

Auron
sumber
1
Hanya merujuk di sini pertanyaan ini yang merupakan contoh praktis dari berapa banyak parameter yang terlalu banyak ...
Gideon
5
Dalam JavaScript 65537 parameter terlalu banyak: jsfiddle.net/vhmgLkdm
Aadit M Shah
lihat saja komponen apache http hampir mustahil untuk membangun sesuatu yang dinamis darinya
Andrew Scott Evans

Jawaban:

162

Kapan sesuatu dianggap sangat cabul sebagai sesuatu yang dapat diatur meskipun Amandemen 1 menjamin kebebasan berbicara? Menurut Justice Potter Stewart, "Saya tahu itu ketika saya melihatnya." Hal yang sama berlaku di sini.

Saya benci membuat aturan yang keras dan cepat seperti ini karena jawaban berubah tidak hanya tergantung pada ukuran dan ruang lingkup proyek Anda, tetapi saya pikir itu berubah bahkan ke tingkat modul. Bergantung pada apa yang dilakukan metode Anda, atau apa yang seharusnya diwakili oleh kelas, sangat mungkin bahwa 2 argumen terlalu banyak dan merupakan gejala dari terlalu banyak kopling.

Saya akan menyarankan bahwa dengan mengajukan pertanyaan di tempat pertama, dan memenuhi syarat pertanyaan Anda sebanyak yang Anda lakukan, bahwa Anda benar-benar tahu semua ini. Solusi terbaik di sini adalah tidak bergantung pada angka yang keras dan cepat, tetapi sebaliknya melihat ke tinjauan desain dan ulasan kode di antara rekan-rekan Anda untuk mengidentifikasi area di mana Anda memiliki kohesi rendah dan kopling ketat.

Jangan pernah takut menunjukkan kepada rekan kerja pekerjaan Anda. Jika Anda takut, itu mungkin pertanda lebih besar bahwa ada sesuatu yang salah dengan kode Anda, dan Anda sudah mengetahuinya .

Nick
sumber
A good aturan-of-thumb adalah jumlah register CPU, karena lagi dan compiler akan dipaksa untuk mengalokasikan mereka di stack.
Michaelangel007
1
@ Michaelangel007 mengenai jawaban yang Anda komentari, Anda tidak boleh mengatakan itu, karena memberi tahu bahwa tidak ada aturan. Selain itu, jumlah parameter adalah masalah keterbacaan, bukan kinerja.
clemp6r
1
@ clemp6r Salah - keduanya . Compiler cowok harus berurusan dengan "register spill" sepanjang waktu. Satu- satunya jawaban yang berwenang adalah memeriksa perakitan apa yang dihasilkan oleh kompiler Anda. Jumlah register tidak secara ajaib berubah pada platform yang sama . en.wikipedia.org/wiki/Register_allocation
Michaelangel007
124

Suatu fungsi hanya dapat memiliki terlalu banyak parameter jika beberapa parameternya berlebihan. Jika semua parameter digunakan, fungsi harus memiliki jumlah parameter yang benar. Ambil fungsi yang sering digunakan ini:

HWND CreateWindowEx
(
  DWORD dwExStyle,
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName,
  DWORD dwStyle,
  int x,
  int y,
  int nWidth,
  int nHeight,
  HWND hWndParent,
  HMENU hMenu,
  HINSTANCE hInstance,
  LPVOID lpParam
);

Itu 12 parameter (9 jika Anda menggabungkan x, y, w dan h sebagai persegi panjang) dan ada juga parameter yang berasal dari nama kelas juga. Bagaimana Anda mengurangi ini? Apakah Anda ingin mengurangi jumlah lebih banyak ke titik?

Jangan biarkan jumlah parameter mengganggu Anda, pastikan itu logis dan didokumentasikan dengan baik dan biarkan intellisense * membantu Anda.

* Asisten coding lain tersedia!

Skizz
sumber
37
Saya memilih ini. Saya kagum pada semua jawaban lain yang mengatakan "3" dan "4"! Jawaban yang benar adalah: kebutuhan minimum, yang kadang-kadang bisa beberapa.
Tony Andrews
16
Jika fungsi itu dirancang hari ini mungkin akan terlihat sedikit berbeda. x, y, nLebar dan nTinggi dapat digabungkan dalam objek Rectangle. style dan xStyle dapat digabungkan menjadi satu set enum atau string. Sekarang Anda hanya memiliki 8 parameter.
finnw
16
@finnw Jika fungsi itu dirancang hari ini? Sudah dirancang ulang. Formulir f = Formulir baru (); memiliki 0 parameter.
Nick
36
Ini adalah C dan winapi. Saya tidak bisa memikirkan contoh yang lebih buruk.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
17
Tidak tidak. Ini adalah gaya prosedural. Windows adalah objek, jadi ini sudah usang sekarang. Hari ini, ini akan diselesaikan dengan kelas agregat, bukan dengan banyak parameter. Aturan intuitif dari desain yang baik adalah jika Anda tidak dapat menggambarkan fungsi (termasuk parameter) dalam satu kalimat sederhana, itu dirancang dengan buruk . Saya percaya ini masalahnya.
Jan Turoň
106

Dalam Clean Code , Robert C. Martin mengabdikan empat halaman untuk subjek. Inilah intinya:

Jumlah ideal argumen untuk suatu fungsi adalah nol (niladik). Berikutnya adalah satu (monadik), diikuti oleh dua (diad). Tiga argumen (triadik) harus dihindari jika memungkinkan. Lebih dari tiga (polyadic) membutuhkan pembenaran yang sangat khusus - dan karenanya tidak seharusnya digunakan.

Patrick McElhaney
sumber
2
Saya ragu itu termasuk "ini" karena itu adalah konteks eksekusi. Dalam pemrograman fungsional, konteksnya global dan terbuka, konteksnya adalah objek tempat Anda menerapkan metode ini. Juga, jika Anda memasukkan "ini" dalam daftar parameter, maka tidak mungkin untuk memiliki 0 params (ideal).
Tom
1
Tidak, itu tidak termasuk "ini."
Patrick McElhaney
20
Selanjutnya, Martin harus berbicara dengan komite standar C ++. Setengah dari <algorithm> membutuhkan lebih dari 3 parameter, karena hanya satu rentang iterator yang sudah 2. Hanya sifat pemrograman dengan iterator (yaitu pemrograman generik dengan koleksi STL).
Steve Jessop
3
@SteveJessop: kesalahan <algorithm> adalah selalu bekerja pada slice. Jika algoritme dan koleksi dirancang ulang, saya akan membuat algoritme selalu mengambil seluruh koleksi, dan Anda akan mendapatkan cara untuk mengiris tampilan koleksi agar algoritma dapat bekerja pada bagian; sebagai alternatif saya juga mendefinisikan override singkatan untuk membuatnya mudah untuk bekerja pada kasus umum.
Lie Ryan
3
@ LieRyan: sedangkan jika saya mendesain ulang <algorithm>saya akan membuatnya bertindak pada objek jangkauan. Koleksi akan berupa rentang, tetapi tidak semua rentang akan menjadi koleksi. Dan memang, dorongan sudah melakukan itu. Pokoknya, maksud saya adalah bahwa perpustakaan yang banyak digunakan secara luas mengabaikan saran ini, jadi hal terburuk yang dijamin akan terjadi pada Anda jika Anda melakukannya juga, adalah bahwa banyak dari jutaan pengguna Anda akan mengotak-atik penyederhanaan kecil pada antarmuka Anda ;-)
Steve Jessop
79

Beberapa kode yang pernah saya gunakan sebelumnya menggunakan variabel global hanya untuk menghindari terlalu banyak melewati parameter.

Tolong jangan lakukan itu!

(Biasanya.)

Jeffrey L Whitledge
sumber
Beberapa kode yang saya kerjakan anggota kelas digunakan untuk mencapai hal yang sama. Pada waktu itu saya adalah seorang programmer C dan saya bertanya, mengapa ada begitu banyak variabel global, mengapa input / output tidak dapat secara eksplisit menjadi parameter?
user3528438
38

Jika Anda mulai harus menghitung secara mental parameter dalam tanda tangan dan mencocokkannya dengan panggilan, maka sekarang saatnya untuk refactor!

Rob Walker
sumber
Itu jawaban yang sangat bagus. Jika parameter disusun secara logis (x, y, w, h) mudah diingat semuanya dalam urutan yang benar. Ini lebih sulit untuk mengingat di mana harus meletakkan pointer FILE di putc (yang hanya memiliki dua parameter), terutama karena fprintf adalah sebaliknya.
user877329
Jawaban terbaik Sangat baik dikatakan
Anwar
31

Terima kasih banyak atas semua jawaban Anda:

  • Agak mengejutkan menemukan orang yang juga berpikir (seperti yang saya lakukan) bahwa 5 parameter adalah batas yang baik untuk kewarasan kode.

  • Secara umum, orang cenderung setuju bahwa batasan antara 3 dan 4 adalah aturan praktis yang baik. Ini masuk akal karena orang biasanya memiliki waktu yang buruk menghitung lebih dari 4 hal.

  • Seperti yang ditunjukkan Milan , rata-rata orang dapat menyimpan kurang lebih 7 hal di kepala mereka sekaligus. Tapi saya pikir Anda tidak bisa melupakan itu, ketika Anda merancang / memelihara / mempelajari suatu rutin, Anda harus mengingat lebih banyak hal daripada hanya parameternya.

  • Beberapa orang menganggap bahwa rutinitas harus memiliki argumen sebanyak yang diperlukan. Saya setuju, tetapi hanya untuk beberapa kasus tertentu (panggilan ke OS OS, rutinitas di mana optimasi itu penting, dll). Saya menyarankan untuk menyembunyikan kompleksitas dari rutinitas ini dengan menambahkan lapisan abstraksi tepat di atas panggilan ini bila memungkinkan.

  • Nick punya beberapa pemikiran menarik tentang ini. Jika Anda tidak ingin membaca komentarnya, saya meringkas untuk Anda: singkatnya, itu tergantung :

    Saya benci membuat aturan yang keras dan cepat seperti ini karena jawaban berubah tidak hanya tergantung pada ukuran dan ruang lingkup proyek Anda, tetapi saya pikir itu berubah bahkan ke tingkat modul. Bergantung pada apa yang dilakukan metode Anda, atau apa yang seharusnya diwakili oleh kelas, sangat mungkin bahwa 2 argumen terlalu banyak dan merupakan gejala dari terlalu banyak kopling.

    Moral di sini adalah jangan takut menunjukkan kode Anda kepada rekan-rekan Anda, berdiskusi dengan mereka dan mencoba untuk "mengidentifikasi area di mana Anda memiliki kohesi yang rendah dan penggabungan yang ketat" .

  • Akhirnya, saya pikir wnoise banyak setuju dengan Nick, dan menyimpulkan kontribusi satir dengan visi puitis ini (lihat komentar di bawah) dari seni pemrograman:

    Pemrograman bukan rekayasa. Organisasi kode adalah seni karena tergantung pada faktor manusia, yang terlalu bergantung pada konteks untuk aturan keras apa pun.

Auron
sumber
16

Jawaban ini mengasumsikan bahasa OO. Jika Anda tidak menggunakannya - lewati jawaban ini (ini bukan jawaban bahasa-agnostik dengan kata lain.

Jika Anda melewati lebih dari 3 parameter (terutama tipe / objek intrinsik), ini bukan berarti "Terlalu banyak" tetapi Anda mungkin kehilangan kesempatan untuk membuat objek baru.

Cari grup parameter yang dapat diteruskan ke lebih dari satu metode - bahkan grup yang dialihkan ke dua metode hampir menjamin bahwa Anda harus memiliki objek baru di sana.

Kemudian, Anda merevisi fungsionalitas ke objek baru Anda dan Anda tidak akan percaya betapa itu membantu baik kode Anda dan pemahaman Anda tentang pemrograman OO.

Bill K
sumber
Tolong, sebutkan bahasa yang tidak menggunakan rutinitas atau parameter. Saya tidak bisa memikirkan satu, bahkan perakitan dapat dianggap memiliki rutinitas (label).
Auron
x86 assembly pasti memiliki rutinitas (panggilan / kembali). Yang lain mungkin memerlukan kombo cmp / jmp.
Brian Knoblauch
Maaf, "ret", bukan "kembali". Menghela nafas. Sudah hari yang panjang.
Brian Knoblauch
Maaf tentang kalimat ambigu Auron, kurasa aku memperbaikinya. Jawaban saya adalah yang spesifik bahasa, bukan pertanyaan.
Bill K
1
Tidak semua bahasa mengizinkan struktur lewat. Selain itu, melewatkan struktur berarti bahwa metode penerima harus memiliki kode untuk menangani struktur dan oleh karena itu, mungkin memerlukan lebih banyak parameter. Juga, dalam bahasa non-oo, Anda biasanya memerlukan parameter tambahan - semua bahasa OO memiliki parameter "tersembunyi" dari "ini" yang seharusnya diteruskan (atau, dalam bahasa / desain yang lebih mengerikan, mungkin secara global dapat diakses)
Bill K
13

Sepertinya ada pertimbangan lain selain angka belaka, berikut beberapa yang terlintas dalam pikiran:

  1. hubungan logis dengan tujuan utama fungsi vs pengaturan satu kali

  2. Jika itu hanya bendera lingkungan, bundling bisa sangat berguna

John Mulder
sumber
12

Salah satu epigram pemrograman terkenal Alan Perlis (diceritakan dalam ACM SIGPLAN Notices 17 (9), September, 1982) menyatakan bahwa "Jika Anda memiliki prosedur dengan 10 parameter, Anda mungkin melewatkan beberapa."

Peter S. Housel
sumber
11

Menurut Steve McConnell dalam Code Complete , Anda harus melakukannya

Batasi jumlah parameter rutin hingga sekitar tujuh

Paul Reiners
sumber
3
/: Nomor yang menunjukkan bahwa factoid dibuat: xkcd.com/899
user877329
9

Bagi saya, ketika daftar melewati satu baris pada IDE saya, maka itu salah satu parameter yang terlalu banyak. Saya ingin melihat semua parameter dalam satu baris tanpa memutus kontak mata. Tapi itu hanya preferensi pribadi saya.

Belajar
sumber
Ini bagus sampai Anda bersama dengan beberapa devs akan mencoba foo (int a, float b, string c, double d). Terbaik untuk mencoba menghindari bekerja dengan mereka, kurasa. : D
Rontolog
4
Jika ada orang lain yang memberikan nama yang sangat panjang pada kelas, saya tidak akan membiarkan itu mempengaruhi bagaimana saya mendefinisikan atau memanggil rutinitas saya.
finnw
9
Bolehkah saya memperkenalkan Anda pada "carriage return"?
3
Ketika daftar melewati satu baris pada IDE Anda, maka monitor Anda terlalu kecil untuk menggunakannya dengan kode itu dan Anda harus membeli monitor dengan resolusi horizontal yang lebih tinggi. Pemutusan garis atau pengurangan parameter smount hanya solusi yang tidak menyelesaikan masalah root yaitu monitor Anda terlalu kecil untuk basis kode itu!
Kaiserludi
9

Saya biasanya setuju dengan 5, namun, jika ada situasi di mana saya membutuhkan lebih banyak dan ini adalah cara paling jelas untuk menyelesaikan masalah, maka saya akan menggunakan lebih banyak.

Inisheer
sumber
8

Tujuh hal dalam ingatan jangka pendek?

  1. Nama fungsinya
  2. Nilai pengembalian fungsi
  3. Tujuan fungsinya
  4. Parameter 1
  5. Parameter 2
  6. Parameter 3
  7. Parameter 4
Mike Clark
sumber
Baik. Ini aturan praktis. Ketika Anda mengkodekan tubuh fungsi, Anda tidak peduli tentang namanya, dan nilai pengembalian dan tujuannya terkait erat.
Auron
7
8. urutan parameter
Eva
7

Dalam Cuplikan Kode 5 Terburuk , periksa yang kedua, "Apakah ini konstruktor". Ini memiliki lebih dari 37 ⋅ 4 ≈ 150 parameter:

Di sini seorang programmer menulis konstruktor ini [... S] beberapa dari Anda mungkin berpikir ya itu konstruktor besar tetapi ia menggunakan alat pembuat kode gerhana otomatis [.] NOO, dalam konstruktor ini ada bug kecil yang saya temukan, yang membuat saya menyimpulkan bahwa konstruktor ini ditulis dengan tangan. (omong-omong ini hanya bagian atas konstruktor, itu tidak lengkap).

konstruktor dengan lebih dari 150 parameter

medopal
sumber
Ini sangat menyedihkan ... Tidak tahu tentang "catatan" atau "struct" atau "nilai objek", yang menggabungkan beberapa nilai bersama dan memberi mereka nama umum sehingga Anda dapat secara hierarki mewakili banyak dari mereka dengan cara yang dapat dibaca seperti berjalan di sekitar dengan sepatu yang tidak terpasang selama bertahun-tahun karena tidak ada yang pernah memberitahumu kamu bahkan bisa melakukan itu 🙈
yeoman
6

Satu lebih dari yang diperlukan. Saya tidak bermaksud menjadi glib, tetapi ada beberapa fungsi yang perlu beberapa opsi. Sebagai contoh:

void *
mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t offset);

Ada 6 argumen, dan semuanya penting. Selain itu, tidak ada tautan umum di antara mereka untuk membenarkan bundling mereka. Mungkin Anda bisa mendefinisikan "struct mmapargs", tetapi itu akan lebih buruk.

Kirk Strauser
sumber
Yah, protdan flagsbisa saja digulung bersama jika dirasakan oleh desainer bahwa 5 entah bagaimana angka ajaib yang jauh lebih baik daripada 6. Sedikit seperti cara yang openmenggabungkan mode baca / tulis dengan semua bendera lain-lain. Dan mungkin Anda dapat menyingkirkan offsetdengan menentukan bahwa bagian yang dipetakan dimulai pada posisi pencarian saat ini filedes. Saya tidak tahu apakah ada situasi di mana Anda dapat mmapsuatu daerah yang Anda tidak mampu lseekmelakukannya, tetapi jika tidak maka itu tidak sepenuhnya diperlukan.
Steve Jessop
... jadi saya pikir mmapini adalah ilustrasi yang bagus dari fakta bahwa beberapa desainer dan pengguna lebih suka daftar panjang parameter, sedangkan yang lain lebih suka melalui beberapa langkah menyiapkan sejumlah parameter yang lebih kecil sebelum melakukan panggilan.
Steve Jessop
1
@Steve: Menyetel posisi mencari dengan panggilan terpisah sebelumnya akan memperkenalkan kondisi balapan serampangan. Untuk beberapa API (OpenGL), ada begitu banyak parameter yang memengaruhi panggilan sehingga Anda benar-benar harus menggunakan status, tetapi biasanya, setiap panggilan harus berdiri sendiri sebanyak mungkin. Aksi di kejauhan adalah jalan menuju sisi gelap.
Ben Voigt
5

Menurut Perl Best Practices , 3 tidak apa-apa, 4 terlalu banyak. Itu hanya panduan, tetapi di toko kami itulah yang kami coba patuhi.

Adam Bellaire
sumber
5

Saya akan menggambar batas untuk fungsi publik di 5 parameter sendiri.

IMHO, daftar parameter panjang hanya dapat diterima dalam fungsi pembantu pribadi / lokal yang hanya dimaksudkan untuk dipanggil dari beberapa tempat tertentu dalam kode. Dalam kasus tersebut, Anda mungkin harus menyampaikan banyak informasi keadaan, tetapi keterbacaan tidak menjadi masalah besar karena hanya Anda (atau seseorang yang akan menjaga kode Anda dan harus memahami dasar-dasar modul Anda) yang harus peduli. memanggil fungsi itu.

Tidur
sumber
Yang tepatnya mengapa banyak orang pada titik ini akan membuat segala sesuatu yang bukan argumen aktual, tetapi keadaan dibawa-bawa, hanya keadaan objek dalam bentuk bidang (variabel anggota). Objek itu akan direpresentasikan sebagai kelas. Ini akan dipakai baik sekali atau untuk setiap penggunaan. Kadang-kadang objek seperti itu hanya akan memiliki satu paket metode privat atau publik, yang kemudian mendelegasikan bekerja ke metode pribadi dengan masing-masing beberapa argumen. Beberapa argumen sekarang mungkin karena konfigurasi dan keadaan sekarang memiliki tempat yang tepat :)
yeoman
5

Pertanyaan terkait yang harus Anda pertimbangkan adalah seberapa kohesifnya rutinitas itu. Sejumlah besar parameter mungkin bau yang memberitahu Anda bahwa rutin itu sendiri mencoba melakukan terlalu banyak dan karenanya kohesi dicurigai. Saya setuju bahwa sejumlah parameter yang keras dan cepat mungkin tidak mungkin tetapi saya akan menebak bahwa rutinitas kohesi yang tinggi akan menyiratkan jumlah parameter yang rendah.

Onorio Catenacci
sumber
4

Saya berhenti di tiga parameter sebagai aturan umum. Terlebih lagi dan inilah saatnya untuk melewatkan array parameter atau objek konfigurasi, yang juga memungkinkan parameter berikutnya ditambahkan tanpa mengubah API.

Eran Galperin
sumber
Jika API berubah, maka API seharusnya benar-benar berubah, tidak hanya memiliki perubahan tersembunyi di mana ketidakcocokan mungkin masih terjadi, tetapi menjadi kurang jelas.
Berkumandang
namun, jika Anda memerlukan satu parameter lagi untuk mengonfigurasikan kasus tepi, seharusnya tidak merambat ke komponen yang tidak terkait menggunakan API
Eran Galperin
4

Pembatasan panjang pada daftar parameter hanyalah satu pembatasan lagi. Dan pembatasan berarti kekerasan yang diterapkan. Kedengarannya lucu, tetapi Anda bisa tanpa kekerasan bahkan saat pemrograman. Biarkan kode mendikte aturan. Jelas bahwa jika Anda memiliki banyak parameter, tubuh fungsi / metode kelas akan cukup besar untuk menggunakannya. Dan potongan kode besar biasanya dapat di refactored dan dipecah menjadi potongan yang lebih kecil. Jadi, Anda mendapatkan solusi untuk tidak memiliki banyak parameter sebagai bonus gratis, karena mereka dibagi di antara potongan kode yang lebih kecil.

Anonim
sumber
4

Satu hal yang akan saya tunjukkan dari perspektif kinerja adalah bahwa tergantung pada bagaimana Anda mengirimkan parameter ke suatu metode, melewati banyak parameter berdasarkan nilai akan memperlambat program karena setiap parameter harus disalin dan kemudian ditempatkan di tumpukan.

Menggunakan satu kelas untuk mencakup semua parameter akan bekerja lebih baik karena satu parameter yang dilewatkan oleh referensi akan menjadi elegan dan bersih, dan lebih cepat!

Dominic Zukiewicz
sumber
Saya memberikan jawaban ini +1 karena ini satu-satunya yang membahas apa pun selain kode-kebersihan atau batas sewenang-wenang, yang keduanya subjektif. Beberapa orang mungkin tidak berpikir tentang apa yang Anda lakukan pada stack ketika Anda berada dalam satu lingkaran dan mendorong puluhan argumen masuk dan keluar dari stack. Jika dalam satu lingkaran, Anda harus mempertimbangkan untuk menggunakan jumlah argumen yang dilewatkan oleh REGISTER di ABI yang Anda kompilasi. Sebagai contoh, dalam MS x64 ABI, maks args yang dilewatkan melalui register adalah 4. "System V" ABI (digunakan oleh OS non-Windows) menggunakan lebih banyak register, jadi menggunakan 4 args yang cukup portabel
Lakey
3

Menurut saya mungkin ada kasus di mana Anda akan melebihi 4 atau beberapa nomor tetap. Hal-hal yang harus diperhatikan mungkin

  1. Metode Anda terlalu banyak dan Anda perlu melakukan refactor.
  2. Anda mungkin ingin mempertimbangkan untuk menggunakan koleksi atau beberapa struktur data.
  3. Pikirkan kembali desain kelas Anda, mungkin beberapa hal tidak perlu diedarkan.

Dari sudut kemudahan penggunaan atau kemudahan membaca kode, saya pikir ketika Anda perlu sedikit "membungkus kata" tanda tangan metode Anda, yang seharusnya membuat Anda berhenti dan berpikir, Kecuali Anda merasa tidak berdaya dan semua upaya membuat tanda tangan lebih kecil mengarah ke tidak ada hasil. Beberapa perpustakaan yang sangat baik di masa lalu dan sekarang menggunakan lebih dari 4-5 kereta bayi.

Perpetualcoder
sumber
3

Aturan praktis saya adalah bahwa saya harus bisa mengingat parameter cukup lama untuk melihat panggilan dan mengetahui fungsinya. Jadi jika saya tidak bisa melihat metode dan kemudian beralih ke panggilan metode dan ingat parameter mana yang melakukan apa maka ada terlalu banyak.

Bagi saya itu sama dengan sekitar 5, tapi saya tidak secerah itu. Jarak tempuh Anda mungkin beragam.

Anda bisa membuat objek dengan properti untuk menyimpan parameter dan meneruskannya jika Anda melebihi batas apa pun yang Anda tetapkan. Lihat buku Refactoring Martin Fowler dan bab tentang membuat panggilan metode lebih sederhana.

Mike Two
sumber
1

Ini sangat tergantung pada lingkungan tempat Anda bekerja. Ambil contoh javascript. Dalam javascript cara terbaik untuk mengirimkan parameter adalah menggunakan objek dengan pasangan kunci / nilai, yang dalam praktiknya berarti Anda hanya memiliki satu parameter. Dalam sistem lain, sweet spot akan berada pada tiga atau empat.

Pada akhirnya, semuanya bermuara pada selera pribadi.

Joeri Sebrechts
sumber
1

Saya setuju dengan 3 tidak apa-apa, 4 terlalu banyak sebagai pedoman. Dengan lebih dari 3 parameter, Anda pasti melakukan lebih dari satu tugas. Lebih dari satu tugas harus dibagi menjadi metode terpisah.

Namun, jika saya melihat proyek terbaru yang saya kerjakan, pengecualian akan berlimpah dan sebagian besar kasus akan sulit untuk turun ke 3 parameter.

kae
sumber
1

Jika saya memiliki 7-10 parameter dalam satu rutin saya melihat bundling mereka ke dalam kelas baru tetapi tidak jika kelas itu akan menjadi apa-apa selain sekelompok bidang dengan getter dan setter - kelas baru harus melakukan sesuatu selain dari nilai pengocokan dan di luar. Kalau tidak, saya lebih suka memasang dengan daftar parameter panjang.

menemukan
sumber
1
Saya akan menggabungkannya dengan kelas data saja jika digunakan di lebih dari satu tempat, tetapi bahkan kemudian saya biasanya membuat kedua konstruktor.
Leahn Novash
1

Ini adalah fakta yang diketahui bahwa, rata-rata, orang dapat menyimpan 7 + / - 2 hal di kepala mereka sekaligus. Saya suka menggunakan prinsip itu dengan parameter. Dengan asumsi bahwa programmer semua adalah orang-orang cerdas di atas rata-rata, saya akan mengatakan semuanya 10+ terlalu banyak.

BTW, jika parameter serupa dengan cara apa pun, saya akan meletakkannya dalam vektor atau daftar daripada struct atau kelas.

Milan Babuškov
sumber
1

Saya akan mendasarkan jawaban saya pada seberapa sering fungsi dipanggil.

Jika itu adalah fungsi init yang hanya dipanggil sekali maka biarkan dibutuhkan 10 parms atau lebih, siapa yang peduli.

Jika itu disebut banyak kali per frame maka saya cenderung membuat struktur dan hanya melewati pointer karena itu cenderung lebih cepat (dengan asumsi bahwa Anda tidak membangun kembali struct setiap waktu juga).

KPexEA
sumber
1

Menurut Jeff Bezos dari ketenaran Amazon, tidak lebih dari dapat diberi makan dengan dua pizza :

Kevin Pang
sumber