Soru Bir kurucu için parametre sayısı


Yapıcısına iletilecek 12 parametreye ihtiyaç duyan bir sınıfım var. Bu yüzden bu sınıfın tasarımında yanlış bir şey olduğunu düşünüyorum.

Bir sınıfın, özellikle de kurucusunun tasarımıyla ilgili herhangi bir tasarım deseni veya genel bir kurallar listesi olup olmadığını sormak istiyorum.


32
2018-01-04 09:56


Menşei


Bu soruya bir göz atın: kaç yıllık değişkenler-a-yapıcı-sahip olmalıdır OP C # kullanıyor olsa da, cevaplar C ++ için geçerlidir. - Tony
12 parametre alan bir kurucu kod kokusu. Muhtemelen, sınıfınız çok fazla yapmaya çalışıyor. - John Dibling


Cevaplar:


12 parametre kesinlikle bana çok fazla geliyor. Numaralarını azaltmak için seçenekler:

  1. Parametre Nesnesini Tanıtın Mantıksal olarak ilişkili parametreleri bir nesneye gruplayarak ve bu nesneyi bireysel parametreler yerine geçirerek.

  2. Bir tanıtmak inşaatçı (isteğe bağlı olarak yöntem zincirleme). Bu, gerçek parametre listesini azaltmaz, ancak kodu daha okunabilir yapar ve değişken parametrelere sahip birkaç farklı oluşturma senaryosuna sahipseniz özellikle yararlıdır. Yerine

    MyClass someObject = new MyClass(aFoo, aBar, aBlah, aBaz, aBorp, aFlirp, 
            andAGoo);
    MyClass anotherObject = new MyClass(aFoo, null, null, aBaz, null, null, 
            andAGoo);
    

    Alabilirsin

    MyClass someObject = new MyClassBuilder().withFoo(aFoo).withBar(aBar)
            .withBlah(aBlah).withBaz(aBaz).withBorp(aBorp).withFlirp(aFlirp)
            .withGoo(aGoo).build();
    MyClass anotherObject = new MyClassBuilder().withFoo(aFoo).withBaz(aBaz)
            .withGoo(aGoo).build();
    
  3. (Belki de bununla başladım ;-) Parametreleri analiz et - hepsi yapıcıya gerçekten ihtiyaç duyuyor mu (yani zorunlu)? Bir parametre isteğe bağlıysa, kurucu yerine normal ayarlayıcı ile ayarlayabilirsiniz.


35
2018-01-04 10:10



Oluşturucu yaklaşımı için +1, zarif bir çözümdür - stijn
Ben kesinlikle 1. veya 2. girişimi yapmadan önce kesinlikle 3. yaparım. - Matthieu M.


Eğer fonksiyonunuz on bir parametre alırsa, muhtemelen bir tane daha unutmuşsunuzdur

Bu cümleyi seviyorum çünkü hepsini özetliyor: Kötü tasarım kötü tasarım gerektiriyor.

Bunu kitaptan aldım C ++ Kodlama Standartları: 101 Kurallar, İlkeler ve En İyi Uygulamalar Herb Sutter, Andrei Alexandrescu tarafından.

Düzenleme: Doğrudan teklif On parametresi olan bir prosedürünüz varsa, muhtemelen bazılarını kaçırdınız. Kendisi Alan Perlis'den bir alıntı.

Pek çok parametreye sahip fonksiyonlar, kötü tasarımın bir symtomudur. Bu olasılıklardan biri, tanımlanmış bir amacı olan bir varlık / sınıfta bu parametrelerin bir kısmını kapsamaya çalışmaktır. (tüm parametreleri anlamlı yapıya sahip olmayan bir çöp sınıfı değil).


Asla unutma Tek Sorumluluk İlkesi Sonuç olarak, sınıflar boyut olarak sınırlı kalır ve sonuç olarak, üye parametrelerinin sayısında sınırlıdır ve bu nedenle, kurucuları için gerekli olan parametrelerin büyüklüğü ile sınırlıdır. Aşağıdaki yorumlardan biri gibi, çok fazla yapıcı parametresi olan sınıf, ana hedefinden bağımsız olarak çok fazla ayrıntıyı ele alabilir.


Buna bir bakış da tavsiye edilir: Kaç tane parametre var?


9
2018-01-04 10:29



Bu iğneleyici! :-) - ltjax
alaycı, ironi ;-) hissettiğiniz gibi :-) - Stephane Rolland
+1 Kod kokusu. Öyle görünüyor ki sınıf çok detaylara dikkat ediyor. Ama sanırım bir parametre sınıfı gerçekten kokuyu kaplıyor. - daramarak
Kitaba baktım ve evet orada. Doğrudan alıntı "On parametresi olan bir prosedürünüz varsa, muhtemelen bir kaçını kaçırdınız". Bu bir alıntıdır Alan Perlis. - wardw
@wardw güzel. Cevapta doğru teklifi dahil ettim. - Stephane Rolland


12 Parametreler, bir şey tasarımda muhtemelen yanlıştır.

Parametreler ne yapılır?

  • Sınıf onları başka kuruculara mı gönderiyor? O zaman belki de sadece hazır inşa edilmiş nesnelere arayüzleri kabul etmelidir.
  • Sınıf büyük mü ve tüm bu parametrelerle pek çok şey var mı? Daha sonra sınıfın çok fazla sorumluluğu vardır ve bunun yerine ayrıntılara dikkat eden sınıfları kabul etmelidir.
  • Parametrelerde herhangi bir "küme" var mı? Belki de yaratılıştaki bir sınıfın parametreleridir. Onları kapsüller ve onlara uygun sorumluluğu verin.

Bunun alternatifi, bunun düşük seviyeli, performans açısından kritik bir yapı için parametreler olmasıdır, bu durumda tasarımın sadece arkaya yaslanması gerekir, ancak bu nadiren durumdur.


6
2018-01-04 12:47





eğer mümkünse parametreleri sınıflara göre gruplayabilir ve örneklerini yapıcıya iletebilirsiniz.


4
2018-01-04 10:02



Bu yaklaşım örn. Win32 API işlevleri tarafından. - Alexandre C.


Örneğin, Devlet modelini kullanırken bunun kabul edilebilir olduğunu düşünüyorum. Ancak, (eğer uygunsa) nesneyi bu parametrelerin yerine geçtiğini önerebilir miyim? Ve sonra kurucudan verileri yüklüyor?


2
2018-01-04 09:59