Kaç parametre çok fazla? [kapalı]


228

Rutinlerin parametreleri olabilir, bu haber değildir. İhtiyacınız olabilecek kadar çok parametre tanımlayabilirsiniz, ancak bunların birçoğu rutininizin anlaşılmasını ve bakımını zorlaştıracaktır.

Elbette, yapılandırılmış bir değişkeni geçici bir çözüm olarak kullanabilirsiniz: tüm bu değişkenleri tek bir yapıya koymak ve rutine aktarmak. Aslında, parametre listelerini basitleştirmek için yapıları kullanmak Steve McConnell tarafından Code Complete'te açıklanan tekniklerden biridir . Ama dediği gibi:

Dikkatli programcılar, verileri mantıksal olarak gerekenden daha fazla paketlemekten kaçınırlar.

Bu nedenle, rutininizde çok fazla parametre varsa veya büyük bir parametre listesini gizlemek için bir yapı kullanıyorsanız, muhtemelen yanlış bir şey yapıyorsunuzdur. Yani, bağlantıyı gevşek tutmuyorsunuz.

Sorum şu: Bir parametre listesini ne zaman çok büyük olarak değerlendirebilirim? 5'ten fazla parametrenin çok fazla olduğunu düşünüyorum. Ne düşünüyorsun?


1
Sadece kaç parametrenin çok fazla olduğuna dair pratik bir örnek olan bu soruya atıfta bulunarak ...
Gideon

5
JavaScript 65537'de parametreler çok fazla: jsfiddle.net/vhmgLkdm
Aadit M Shah

apache http bileşenlerine bakın, dinamik bir şey oluşturmak neredeyse imkansız
Andrew Scott Evans

Yanıtlar:


162

Serbest konuşma için 1. Değişiklik garantisine rağmen düzenlenebilecek bir şey ne kadar müstehcen olarak kabul edilir? Justice Potter Stewart'a göre, "Onu gördüğümde biliyorum." Burada da aynı şey geçerli.

Bunun gibi sert ve hızlı kurallar yapmaktan nefret ediyorum, çünkü cevap sadece projenizin boyutuna ve kapsamına bağlı olarak değişmiyor, aynı zamanda modül seviyesine bile değiştiğini düşünüyorum. Yönteminizin ne yaptığına veya sınıfın neyi temsil etmesi gerektiğine bağlı olarak, 2 argümanın çok fazla olması ve çok fazla eşleşmenin bir belirtisi olması mümkündür.

Soruyu ilk etapta sorarak ve sorunuzu sizin kadar niteleyerek, tüm bunları gerçekten bildiğinizi öneririm. Buradaki en iyi çözüm, sert ve hızlı bir sayıya güvenmemek değil, bunun yerine düşük uyum ve sıkı bağlantıya sahip olduğunuz alanları belirlemek için akranlarınız arasında tasarım incelemelerine ve kod incelemelerine bakmaktır.

İş arkadaşlarınıza çalışmalarınızı göstermekten asla korkmayın. Eğer korkuyorsanız, bu muhtemelen kodunuzla ilgili bir şeylerin yanlış olduğunu ve zaten bildiğinizi gösteren en büyük işarettir .


İyi bir kural , CPU kayıtlarının sayısıdır, çünkü artık ve derleyici bunları yığına ayırmaya zorlanacaktır.
Michaelangel007

1
@ Michaelangel007 yorumladığınız cevapla ilgili olarak söylememelisiniz, çünkü kural olmadığını söyler. Ayrıca, parametre sayısı performans değil, okunabilirlikle ilgilidir.
clemp6r

1
@ clemp6r Yanlış - her ikisi de . Derleyiciler çocuklar her zaman "kayıt dökülme" ile uğraşmak zorunda. Sadece yetkili cevabı derleyici oluşturuyor şeyin montajını denetlemektir. Kayıtların sayısı aynı platformda sihirli bir şekilde değişmez . en.wikipedia.org/wiki/Register_allocation
Michaelangel007

124

Bir işlevin yalnızca parametrelerin bazıları yedekli olması durumunda çok fazla parametresi olabilir. Tüm parametreler kullanılıyorsa, işlev doğru sayıda parametreye sahip olmalıdır. Bu sık kullanılan işlevi al:

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

Bu 12 parametredir (x, y, w ve h'yi dikdörtgen olarak paketlerseniz 9) ve ayrıca sınıf adından türetilmiş parametreler de vardır. Bunu nasıl azaltabilirsiniz? Sayıyı daha da azaltmak ister misiniz?

Parametre sayısının sizi rahatsız etmesine izin vermeyin, sadece mantıklı ve iyi belgelendiğinden emin olun ve intellisense * size yardımcı olsun.

* Diğer kodlama yardımcıları da mevcuttur!


37
Buna oy veriyorum. "3" ve "4" diyen diğer tüm cevaplara hayran kaldım! Doğru cevap: gerekli olan minimum, bazen oldukça az olabilir.
Tony Andrews

16
Bu işlev bugün tasarlanmış olsaydı, muhtemelen biraz farklı görünecektir. x, y, nWidth ve nHeight bir Dikdörtgen nesnesinde paketlenebilir. style ve xStyle bir dizi numaralandırma veya dize halinde birleştirilebilir. Artık sadece 8 parametreniz var.
finnw

16
@finnw Bu işlev bugün tasarlanmışsa? Zaten yeniden tasarlandı. Form f = yeni Form (); 0 parametreye sahiptir.
Nick

36
Bu C ve winapi. Daha kötü bir örnek düşünemiyorum.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

17
Hayır hayır. Bu yöntemsel bir tarzdır. Windows nesnelerdir, bu yüzden artık eskidir. Bugün, bu, bir grup parametre ile değil, toplu sınıflarla çözülebilir. İyi tasarımın sezgisel kuralı, işlevi (parametreler dahil) basit bir cümleyle tanımlayamamanız, kötü tasarlanmış olmasıdır . Durumun bu olduğuna inanıyorum.
Jan Turoň

106

Gelen Temiz Kanunu , Robert C. Martin konuya dört sayfa ayırdı. İşte öz:

Bir işlev için ideal argüman sayısı sıfırdır (niladik). Sonra bir (monadik) gelir, ardından iki (ikili) gelir. Mümkün olan yerlerde üç argümandan (triadik) kaçınılmalıdır. Üçten fazla (poliamik) çok özel bir gerekçe gerektirir - ve sonra yine de kullanılmamalıdır.


2
"Bu" kelimesini içerdiğinden şüpheliyim çünkü yürütme bağlamı budur. İşlevsel programlamada, bağlam geneldir ve oop'ta bağlam, yöntemi uyguladığınız nesnedir. Ayrıca, parametre listesine "this" i eklerseniz, 0 parametreye sahip olmak imkansız olacaktır (ideal).
Tom

1
Hayır, "bunu" içermiyor.
Patrick McElhaney

20
Ayrıca, Martin, C ++ standart komitesiyle bir söz sahibi olmalıdır. <algoritma> 'nın yarısı 3'ten fazla parametre alır, çünkü yalnızca bir yineleyici aralığı zaten 2'dir. Sadece yineleyicilerle programlamanın doğasıdır (yani STL koleksiyonlarıyla jenerik programlama).
Steve Jessop

3
@SteveJessop: <algoritma> hatası, her zaman bir dilim üzerinde çalışmasıdır. Algoritma ve koleksiyon yeniden tasarlanacak olsaydı, algoritmaların her zaman bütün bir koleksiyonu almasını isterdim ve algoritmaların parçalar üzerinde çalışmasına izin vermek için bir koleksiyonun görünümünü dilimlemenin bir yolunu elde edersiniz; alternatif olarak, genel durum üzerinde çalışmayı kolaylaştırmak için bir steno geçersiz kılma tanımlarım.
Lie Ryan

3
@LieRyan: Yeniden tasarlasaydım <algorithm>bir menzil nesnesi üzerinde hareket ederdim. Koleksiyonlar aralık olur, ancak tüm aralıklar koleksiyon değildir. Ve aslında, destek zaten bunu yaptı. Her neyse, benim açımdan, çok kullanılan bir kütüphane bu tavsiyeyi görmezden geliyor, bu yüzden siz de yaparsanız size garanti edilen en kötü şey, milyonlarca kullanıcınızın çoğunun arayüzünüze küçük basitleştirmelerle uğraşmasıdır ;-)
Steve Jessop

79

Geçmişte birlikte çalıştığım bazı kodlar, çok fazla parametre iletmekten kaçınmak için küresel değişkenler kullandılar.

Lütfen bunu yapma!

(Genelde.)


Bazı kod aynı şeyi elde etmek için kullanılan sınıf üyeleri üzerinde çalışıyordu. O zaman bir C programcısıydım ve sordum, neden bu kadar çok küresel değişken var, giriş / çıkışlar neden açıkça parametre olamaz?
user3528438

38

İmzadaki parametreleri zihinsel olarak saymaya ve bunları çağrı ile eşleştirmeye başlarsanız, o zaman refactor zamanı!


Bu çok iyi bir cevap. Parametreler mantıksal olarak düzenlenmişse (x, y, w, h) hepsini doğru sırayla hatırlamak kolaydır. Özellikle fprintf tam tersi olduğu için, FILE işaretçisini putc'a (sadece iki parametresi vardır) nereye koyacağınızı söylemek daha zordur.
user877329

En güzel cevap. Çok iyi dedi
Anwar

31

Tüm cevaplarınız için çok teşekkür ederim:

  • Aynı zamanda (benim yaptığım gibi) 5 parametrenin kodun akıl sağlığı için iyi bir sınır olduğunu düşünen insanları bulmak biraz şaşırtıcıydı.

  • Genellikle, insanlar 3 ve 4 arasındaki bir sınırın iyi bir kural olduğu konusunda hemfikirdir. İnsanlar genellikle 4'ten fazla şeyi saymakta zorlandıkları için bu mantıklı.

  • As Milan noktaları , ortalama insanlar üzerinde bir anda kendi kafasından aşağı yukarı 7 şeyleri tutabilir. Ancak, bir rutini tasarlarken / sürdürürken / çalışırken, parametrelerden daha fazla şeyi aklınızda tutmanız gerektiğini unutamayacağınızı düşünüyorum.

  • Bazı insanlar bir rutinin ihtiyaç duyduğu kadar argümana sahip olması gerektiğini düşünür. Kabul ediyorum, ancak sadece birkaç özel durum için (OS API'lerine çağrılar, optimizasyonun önemli olduğu rutinler vb.). Mümkün olduğunca bu çağrıların hemen üstüne bir soyutlama katmanı ekleyerek bu rutinlerin karmaşıklığını gizlemenizi öneririm.

  • Nick'in bu konuda bazı ilginç düşünceleri var. Yorumlarını okumak istemiyorsanız, sizin için özetleyeceğim: kısaca, bağlıdır :

    Bunun gibi sert ve hızlı kurallar yapmaktan nefret ediyorum, çünkü cevap sadece projenizin boyutuna ve kapsamına bağlı olarak değişmiyor, aynı zamanda modül seviyesine bile değiştiğini düşünüyorum. Yönteminizin ne yaptığına veya sınıfın neyi temsil etmesi gerektiğine bağlı olarak, 2 argümanın çok fazla olması ve çok fazla eşleşmenin bir belirtisi olması mümkündür.

    Buradaki ahlaki, kodunuzu akranlarınıza göstermekten korkmayın, onlarla tartışın ve "düşük uyum ve sıkı bağlantınızın olduğu alanları belirlemeye çalışın " .

  • Son olarak, wnoise'ın Nick'le çok hemfikir olduğunu ve programlama sanatının bu şiirsel vizyonuyla (aşağıdaki yorumlara bakınız) hiciv katkısını sonuçlandırdığını düşünüyorum :

    Programlama mühendislik değildir. Kodun organizasyonu bir sanattır, çünkü herhangi bir zor kural için bağlama çok fazla bağlı olan insan faktörlerine bağlıdır.


16

Bu cevap bir OO dili varsayar. Birini kullanmıyorsanız - bu cevabı atlayın (bu, başka bir deyişle, dile özgü agnostik bir cevap değildir).

3 veya daha fazla parametre (özellikle de içsel tipler / nesneler) geçiyorsanız, bu "Çok fazla" değildir, ancak yeni bir nesne oluşturma şansınızı kaçırıyor olabilirsiniz.

Birden fazla yönteme geçirilen parametre gruplarına bakın - iki yönteme geçirilen bir grup bile, orada yeni bir nesneye sahip olmanız gerektiğini garanti eder.

Daha sonra işlevselliği yeni nesnenize yeniden yansıtırsınız ve hem kodunuza hem de OO programlama anlayışınıza ne kadar yardımcı olduğuna inanmazsınız.


Lütfen rutin veya parametre kullanmayan bir dile ad verin. Birini düşünemiyorum, hatta montajın rutinleri (etiketler) olduğu düşünülebilir.
Auron

x86 meclisi kesinlikle rutinlere sahiptir (çağrı / dönüş). Diğerleri cmp / jmp kombinasyonları gerektirebilir.
Brian Knoblauch

Üzgünüz, "ret", "return" değil. İç çekişler. Zaten uzun bir gündü.
Brian Knoblauch

Belirsiz ifadeler Auron için üzgünüm, düzelttiğime inanıyorum. Soru, dile değil, dile özgü idi.
Bill K

1
Tüm diller geçiş yapılarına izin vermez. Ayrıca bir yapının geçirilmesi, alıcı yöntemin yapıyı işlemek için koda sahip olması gerektiği için daha fazla parametreye ihtiyaç duyabileceği anlamına gelir. Ayrıca, oo olmayan bir dilde, genellikle ekstra bir parametreye ihtiyacınız vardır - tüm OO dillerinde "bu" bir "Gizli" parametresi vardır, aksi takdirde iletilmesi gerekir (veya daha korkunç bir dilde / tasarımda küresel olabilir) erişilebilir)
Bill K

13

Görünüşe göre, sadece sayıdan başka başka düşünceler de var, akla gelen bazı şeyler:

  1. bir kerelik ayarlara karşı işlevin birincil amacı ile mantıksal ilişki

  2. Eğer sadece çevre bayrakları ise, demetleme çok kullanışlı olabilir


12

Alan Perlis'in iyi bilinen programlama epigramlarından biri (ACM SIGPLAN Notices 17 (9), Eylül 1982'de sayılmıştır), "10 parametreli bir prosedürünüz varsa, muhtemelen bazılarını kaçırmışsınızdır" ifadesini kullanır.



9

Benim için, liste IDE'mdeki bir satırı geçtiğinde, o zaman çok fazla bir parametredir. Tüm parametreleri göz temasını kesmeden tek bir satırda görmek istiyorum. Ama bu sadece benim kişisel tercihim.


Bazı geliştiriciler ile foo (int a, float b, string c, double d) çalışana kadar bu iyidir. Onlarla çalışmaktan kaçınmak en iyisi sanırım. : D
Rontolog

4
Eğer bir başkası sınıflara gülünç derecede uzun isimler vermişse, bunun rutinleri nasıl tanımladığımı veya çağırdığımı etkilemesine izin vermezdim.
finnw

9
Sizi "taşıma iadesi" ile tanıştırabilir miyim?

3
Liste IDE'nizdeki bir satırı geçtiğinde, monitörünüz bu kodla kullanmak için çok küçüktür ve açıkça daha yüksek yatay çözünürlüğe sahip bir monitör satın almalısınız. Satır kesmesi veya parametre sayısındaki azalma, monitörünüzün bu kod tabanı için çok küçük olmasıyla ilgili temel sorunu çözmeyen geçici çözümlerdir!
Kaiserludi

9

Genelde 5 ile hemfikirim, ancak daha fazlasına ihtiyacım olan bir durum varsa ve sorunu çözmenin en açık yolu varsa, o zaman daha fazlasını kullanırdım.


8

Kısa süreli hafızada yedi şey var mı?

  1. İşlevin adı
  2. İşlevin dönüş değeri
  3. Fonksiyonun amacı
  4. Parametre 1
  5. Parametre 2
  6. Parametre 3
  7. Parametre 4

İyi. Bu bir kural. Bir fonksiyonun gövdesini kodlarken, adını umursamıyorsunuz ve dönüş değeri ve purporse yakından ilişkilidir.
Auron

7
8. parametrelerin sırası
Eva

7

En Kötü 5 Kod Parçacıklarında , ikincisi olan "Bu bir kurucu mu?" 37 ⋅ 4 ≈ 150'den fazla parametreye sahiptir:

Burada bir programcı bu yapıcı yazdı [... S] ome evet düşünebilirsiniz onun büyük bir yapıcı ama o tutulma otomatik kod oluşturma araçları [.] NOO, bu yapıcı içinde keşfettiğim, beni yapan küçük bir hata vardı bu kurucunun elle yazıldığı sonucuna varır. (Bu arada, bu sadece kurucunun üst kısmıdır, tamamlanmamıştır).

150'den fazla parametreli kurucu


Bu çok üzücü ... Birkaç değeri bir araya toplayan ve onlara ortak bir ad veren "kayıtlar" veya "yapılar" veya "değer nesneleri" hakkında bilgi sahibi olmak, çoğunu okunabilir bir şekilde hiyerarşik olarak temsil edebilmeniz gibi dolaşmak gibidir. yıllarca ayakkabı değiştirmeden çünkü hiç kimse bunu bile yapabileceğini söylemedi 🙈
yeoman

6

Gerekenden bir tane daha. Glib olmak istemiyorum, ancak mutlaka birkaç seçeneğe ihtiyaç duyan bazı işlevler var. Örneğin:

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

6 argüman vardır ve her biri esastır. Ayrıca, gruplandırmayı haklı çıkarmak için aralarında ortak bir bağlantı yoktur. Belki "struct mmapargs" tanımlayabilirsiniz, ama bu daha kötü olurdu.


Peki, protve flagstasarımcı tarafından 5'in 6'dan çok daha iyi bir sihirli sayı olduğunu hissettiyse birlikte yuvarlanabilirdi. Biraz openokuma / yazma modunu diğer çeşitli bayraklarla birleştiren yol gibi . Ve belki olabilir kurtulmak offsetakımda eşlenen bölüm başlar pozisyonunu aradığı belirterek filedes. Yapamayacağınız mmapbir bölgeyi yapabileceğiniz herhangi bir durum olup olmadığını bilmiyorum lseek, ancak eğer o zaman kesinlikle gerekli değildir.
Steve Jessop

... bu yüzden mmapbazı tasarımcıların ve kullanıcıların parametrelerin uzun bir listesini tercih etmelerinin iyi bir örneğidir.
Steve Jessop

1
@Steve: Arama pozisyonunu önceden ayrı bir çağrı ile ayarlamak, gereksiz bir yarış durumu getirecektir. Bazı API'lar (OpenGL) için, bir çağrıyı etkileyen o kadar çok parametre vardır ki, gerçekten durumu kullanmanız gerekir, ancak normal olarak, her çağrı mümkün olduğunca yalnız kalmalıdır. Uzaktan hareket karanlık tarafa giden yoldur.
Ben Voigt

5

Göre Perl İyi Uygulamalar , 3 4 çok fazla olduğunu, tamamdır. Bu sadece bir rehber, ama dükkanımızda buna bağlı kalmaya çalışıyoruz.


5

5 parametrede kamusal fonksiyonların sınırını kendim çizeceğim

IMHO, uzun parametre listeleri yalnızca koddaki birkaç belirli yerden çağrılması gereken özel / yerel yardımcı işlevlerinde kabul edilebilir. Bu durumlarda, çok fazla durum bilgisini iletmeniz gerekebilir, ancak okunabilirlik endişe verici değildir, çünkü yalnızca siz (veya kodunuzu koruyacak ve modülünüzün temellerini anlaması gereken) ilgilenmek zorundadır bu işlevi çağırır.


Tam da neden bu noktada birçok insan gerçek bir argüman olmayan her şeyi, ancak devleti taşıdı, sadece bir nesnenin alanlar (üye değişkenler) biçimindeki durumunu yapar. Bu nesne bir sınıf olarak temsil edilir. Bir kez veya her kullanım için somutlaştırılacaktır. Bazen böyle bir nesnenin yalnızca bir paket özel veya genel yöntemi vardır, bu da delegelerin her biri birkaç argümanla özel yöntemlerle çalışır. Birkaç argüman artık mümkün, çünkü yapılandırma ve durum artık uygun bir yere sahip :)
yeoman

5

Dikkate almanız gereken ilgili bir soru , rutinin ne kadar uyumlu olduğudur . Çok sayıda parametre, rutinin kendisinin çok fazla yapmaya çalıştığını söyleyen bir koku olabilir ve bu nedenle uyum şüphelidir. Zor ve hızlı bir sayıda parametrenin muhtemelen imkansız olduğunu kabul ediyorum, ancak yüksek bir uyum rutininin düşük sayıda parametre anlamına geleceğini tahmin ediyorum.



4

Genel bir kural olarak üç parametrede duruyorum. Daha fazla ve bunun yerine bir dizi parametreyi veya bir yapılandırma nesnesini geçirmenin zamanı geldi, bu da gelecekteki parametrelerin API'yi değiştirmeden eklenmesine izin veriyor.


API değişirse, API aslında değişmelidir, sadece uyumsuzluğun hala gerçekleşebileceği gizli bir değişiklik değil, aynı zamanda daha az açık olmalıdır.
wnoise

ancak, bir kenar durumunu yapılandırmak için bir parametreye daha ihtiyacınız varsa, API kullanarak ilgili olmayan bileşenlere
yayılmamalıdır

4

Parametre listesindeki uzunluk kısıtlaması yalnızca bir kısıtlamadır. Kısıtlama, uygulanan şiddet anlamına gelir. Kulağa komik geliyor, ancak programlama yaparken bile şiddetsiz olabilirsiniz. Kodun kuralları dikte etmesine izin verin. Çok sayıda parametreniz varsa, işlev / sınıf yönteminin gövdesinin bunları kullanabilecek kadar büyük olacağı açıktır. Ve büyük kod parçacıkları genellikle yeniden düzenlenebilir ve daha küçük parçalara bölünebilir. Böylece, daha küçük yeniden düzenlenmiş kod parçaları arasında bölündüğünden, birçok parametreye ücretsiz bonus olarak sahip olmanıza karşı çözüm elde edersiniz.


4

Performans perspektifinden işaret ettiğim bir şey, bir yönteme parametreleri nasıl geçirdiğinize bağlı olarak, her parametrenin kopyalanıp yığına yerleştirilmesi gerektiğinden, değere göre çok sayıda parametrenin geçirilmesi programı yavaşlatır.

Tüm parametreleri kapsamak için tek bir sınıf kullanmak daha iyi sonuç verecektir, çünkü referansla iletilen tek bir parametre zarif ve daha temiz ve daha hızlı olacaktır!


Bu cevabı +1 olarak veriyorum çünkü kod temizliği ya da keyfi sınırların yanı sıra öznel olan her şeyi tartışan tek kişi bu. Bazı insanlar, bir döngüde olduğunuzda ve yığında düzinelerce argümanı ittiğinizde yığına ne yaptığınızı düşünmeyebilir. Bir döngüdeyse, KAYITÇILAR tarafından derlediğiniz ABI'de iletilen bağımsız değişken sayısını kullanmayı düşünmelisiniz. Örneğin, MS x64 ABI'de, kayıtlardan geçirilen maksimum bağımsız değişkenler 4'tür. "System V" ABI (Windows işletim sistemi olmayan işletim sistemi tarafından kullanılır) daha fazla kayıt kullanır, bu nedenle 4 bağımsız değişken kullanır
Lakey

3

Bana göre 4'ü veya sabit bir sayıyı aşacağınız durumlar olabilir. Dikkat edilecek şeyler olabilir

  1. Metodunuz çok fazla şey yapıyor ve yeniden düzenleme yapmanız gerekiyor.
  2. Bir koleksiyon veya bazı veri yapıları kullanmayı düşünebilirsiniz.
  3. Sınıf tasarımınızı yeniden düşünün, belki bazı şeylerin geçmesine gerek yoktur.

Kullanım kolaylığı veya kod okuma kolaylığı açısından, yöntem imzanızı "kelime sarmak" gerektiğinde, sizi durduracak ve düşünecek bir şey yapmayı düşünüyorum. sonuç yok. Geçmişteki ve günümüzdeki bazı çok iyi kütüphaneler 4-5'ten fazla çocuk arabası kullanıyor.


3

Temel kuralım, bir aramaya bakmak ve ne yaptığını söylemek için yeterince uzun parametreleri hatırlayabilmem gerektiğidir. Bu yüzden yönteme bakıp bir yöntemin çağrısına geçip hangi parametrenin ne yaptığını hatırlayamıyorsam, o zaman çok fazla var.

Benim için bu yaklaşık 5'e eşit, ama o kadar parlak değilim. Kilometreniz değişebilir.

Parametreleri tutmak için özellikleri olan bir nesne oluşturabilir ve ayarladığınız sınırı aşarsanız bu nesneyi iletebilirsiniz. Martin Fowler'in Yeniden Düzenleme kitabına ve yöntem çağrılarını basitleştirme bölümüne bakın .


1

Büyük ölçüde içinde çalıştığınız ortama bağlıdır. Örneğin javascript'i ele alalım. Javascript'te parametreleri iletmenin en iyi yolu anahtar / değer çiftlerine sahip nesneler kullanmaktır, bu da pratikte sadece bir parametreniz olduğu anlamına gelir. Diğer sistemlerde tatlı nokta üç veya dörde olacaktır.

Sonunda, hepsi kişisel zevkinize kadar kaynar.


1

3 ile anlaşacağım tamam, 4 bir rehber olarak çok fazla. 3'ten fazla parametre ile, kaçınılmaz olarak bir görevden daha fazlasını yaparsınız. Birden fazla görev ayrı yöntemlere bölünmelidir.

Bununla birlikte, üzerinde çalıştığım en son projeye baksaydım, istisnalar bol olurdu ve çoğu durumda 3 parametreye ulaşmak zor olurdu.


1

Bir rutinde 7-10 parametre varsa, onları yeni bir sınıfa paketlemeye bakıyorum, ancak bu sınıf, alıcılar ve ayarlayıcılarla bir grup alandan başka bir şey olmazsa, yeni sınıfın değerleri karıştırmaktan başka bir şey yapması gerekmez. dışarı. Aksi takdirde uzun parametre listesi koymak istiyorum.


1
Birden fazla yerde kullanılıyorsa, yalnızca veri sınıfıyla paketleyeceğim, ancak o zaman bile genellikle her iki kurucuyu da oluşturuyorum.
Leahn Novash

1

Ortalama olarak, insanların bir seferde 7 +/- 2 şeyi başlarında tutabilecekleri bilinen bir gerçektir. Bu prensibi parametrelerle kullanmayı seviyorum. Programcıların ortalamanın üstünde zeki insanlar olduğunu varsayarsak, 10 yaşın üzerindeki her şeyin çok fazla olduğunu söyleyebilirim.

BTW, parametreler herhangi bir şekilde benzerse, bunları bir yapı veya sınıf yerine bir vektör veya listeye koyarım.


1

Cevabımı işlevin ne sıklıkta çağrıldığına dayandırırım.

Sadece bir kez çağrılan bir init işlevi ise, o zaman kimin umurunda, 10 parm veya daha fazla almasına izin verin.

Çerçeve başına bir sürü kez denirse, bir yapı yapma eğilimindeyim ve sadece daha hızlı olma eğiliminde olduğu için bir işaretçi geçiririm (her seferinde yapıyı yeniden inşa etmediğinizi varsayarsak).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.