Uzun durum değişken listesine karşı uzun parametre listesi


10

Bir C ++ kitabında yazar, parametrelerin çoğunun bir sınıftaki durum değişkenlerine dönüştürülebildiği için artık uzun parametre listesiyle bir işleve ihtiyacımız olmadığını söylüyor. Öte yandan, işlevsel bir programlama kitabı durum değişkenlerinin kötü olduğunu, çünkü hataya eğilimli ve kodun paralelleştirilmesi zor olan yan etkilere neden olduğunu söylüyor. Şaşkınım. Kod, durum değişkenini işlev parametre listesine taşıyarak durum değişkenlerine mümkün olduğunca güvenmekten kaçınmalı mıdır?


C ++ üzerine yorum yapan orijinal kitap işlevsel bir dil miydi?
Martin York

Yanıtlar:


7

Bir proceduralveya functionalparadigmada programlama yapmanıza bağlıdır . Biri için değişebilir devlet, daha sonra için sakatlık gerekir. Bu elma ve portakal. Her ikisi de kendi icralarında doğru!

Zorunlu yordamsal dillere tek ödev ve diğer işlevsel teknikleri uygulayabilirsiniz, değişmez durum eşzamanlı programlamayı daha belirleyici hale getirir, ancak Java veya C ++ gibi bir dilde her nesneyi değişmez hale getirmek neredeyse imkansızdır çünkü bellek modelleri bu paradigmayı kolayca desteklemez.


:Teşekkürler! Her programcının bilmesi gereken << 97 kitap >> yan etkilerden kaçınma gibi fonksiyonel programlama ilkelerini uygulamamız gerektiğini söylüyor. İşlevsel programlama ilkelerini zorunlu bir kod bağlamında uygulayamıyor muyuz?
TomCaps

Devlet edilir değil gerekli prosedürel programlama için. Bu yaygındır, ancak gerekli değildir. Yaygın olması alışkanlıklardan başka her şeyden daha fazladır. Yine de, bir (durum) değişkenini çevrede tutmanın alternatiflerden (örneğin asenkron işleme) daha kolay olduğu durumlar olduğunu kabul edeceğim.
Marjan Venema

@ Değişmez değişkenleri olan herhangi bir şey durumdur

@Jarrod: Şimdi kafam karıştı. Cevabınızı tekrar okuduğumda, "Değişken durum gerekli" ifadesindeki "Değişken" i kaçırdığımı görüyorum. Fakat yorumunuz değişmez değişkenlere sahip olmanın devlet olduğunu söylüyor. Anlama. Çünkü etrafta dolaşmaya ve bu açıdan değişebilir ve değişmez düşünmeye alışkın değilim. Okumam gereken referanslar var mı?
Marjan Venema

@MarjanVenema: Evet, değişmez değişkenlere sahip olmak durumdur. Prosedürel ve fonksiyonel programlama arasındaki işlem durumundaki fark proc.prog değildir. durumu vardır ve fonksiyonel değildir - daha ziyade, bu proc. prog. sahip değişken durum, her zaman (saf) işlevsel programlama iletmenin ise, durum. Bkz. Örn. En.wikipedia.org/wiki/Purely_functional , tamamen işlevsel dillerin güncellemelerden kaçındığını açıklar.
sleske

1

Sorunuzu doğru anlarsam, hangi koşulların parametre veya sınıf değişkeni / üye / alan / vb. Kullanımına uygun olduğunu soruyorsunuz? Bir işleve değil bir yönteme başvurduğunuzu varsayıyorum. Bu özellikle C ++ ile ilgili ise, sorunuzu taşma yığınına taşımanızı öneririz.

Uzun bir parametre listesi, yönteminizi daha ayrıntılı bir dizi halinde yeniden düzenlemeniz gerekebileceğinin bir işareti olabilir. Genel olarak, parametreleri kullanmak kodunuzu daha gevşek bir şekilde bağlar. Bunun çoğu modern OO dili için doğru olup olmadığından emin değilim, ancak özellikle çok sayıda sınıf değişkeni varsa nesne oluşturma pahalı olabilir; sınıf değişkenleriniz nesne ise ve bir programda sıkça başvuruluyorsa, bunlar sınıf değişkenleri olarak gerekçelendirilebilir.

Ayrıca:

  • Diğer yöntemler sınıf değişkenlerini kullanabilir mi? Evetse, sınıf değişkenleriyle devam etmeyi düşünün.
  • Yönteminiz herkese açık mı? Herkese açıksa parametreleri kullanın.
  • Parametre listeniz uygun şekilde bir karma / map / dizi / toplama / liste / vb. Olarak temsil edilebilir mi? Öyleyse, bir seçenek olarak düşünün.
  • Metodunuz statik midir? Evet ise parametreleri kullanın.

0

Hayır, durum değişkenleri kendiliğinden yan etkilere neden olmaz .

(Görünür başka bir veri yapısını) bir ayarlayıcı yöntemini çağırma olan bir yan etkisi.

Uzun parametre listelerini ansd gizlemek için veri yapılarınız olabilir, ancak bunları uygun şekilde yapılandırırsanız yan etkilerden kaçının. İşte küçük bir örnek (Java'da, test edilmemiş):

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

Tabii ki, ManyParams'ın kurucusu yine de bu şekilde uzun bir parametre listesine sahip olacak. Ama gizli.

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.