SORU
6 ŞUBAT 2009, Cuma


'olmayan mutasyona " için en iyi isim;Ekle" üzerinde değişmez bir toplama yöntemi?

Waffly başlık için özür dilerim - eğer kısa bir başlık ile gelip olsaydım, bu soruyu sormak zorunda kalmazdım.

Liste değişmez bir tip var sanırım. Sonunda fazladan bir unsur olarak belirtilen bağımsız değişken ile yeni değişmez listesini verir 8* *bir operasyon var. Değerleri ile dizeleri bir liste oluşturmak için"", "", "dünya" yazabilirsiniz: . değişmez Merhaba

var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");

(Bu C# kodu, ve en bir C ilgileniyorum# öneri ise dil önemli olduğunu düşünüyorsanız. Temelde Dil Bir soru değil, ama dilin cümleler önemli olabilir.)

Önemli olan şey, mevcut listelerdeğilempty.Count Foo - tarafından değiştirilmiş hala 0 döndürecektir.

Sonuç olurdu sonuna kadar alma (daha fazla) bir deyim vardır:"

var list = new ImmutableList<string>().Foo("Hello")
                                      .Foo("immutable")
                                      .Foo("word");

Benim sorum:Foo için en iyi isim nedir?

3 DÜZENLEMEK: Daha sonra açıklayacağım gibi, türünün adı aslında pozisyon net yapan ImmutableList<T>, olmayabilir. TestSuite ve bir parçası çerçevesinde bütün değişmez... değişmez bunun yerine hayal edin

(Son düzenleme 3)

Seçenekleri ile bugüne kadar geldim.

  • Add: ortak .NET, ama orijinal listenin mutasyon anlamına gelir
  • Cons: bu dillerde deneyimi olmayanlar için fonksiyonel dillerde normal adı, ama anlamsız olduğuna inanıyorum
  • Plus: benim en sevdiğim şu ana kadar mutasyon anlamına gelmezbana. Görünüşe göre bu da ama biraz farklı beklentileri (Haskell bir programcı bu iki liste birlikte diğer liste için tek bir değer eklemek yerine eklemek için bekleyebilirsiniz) used in Haskell.
  • With: diğer kuralları değişmez, ama eskisi gibi değil ile tutarlı "additionness" IMO.
  • And: çok açıklayıcı değil.
  • Operatör aşırı yükleme için : ben gerçekten bu kadar sevmiyorum; ben genellikle operatörler sadece alt düzey türleri için uygulanması gerektiğini düşünüyorum. İkna olmak için istekli olsa da benim!

Seçtiğiniz için kullanıyorum kriterleri:

  • Verir yöntem çağrısı sonucu (ekstra bir öğe ile özgün listesinde olduğu gibi) doğru bir izlenim
  • Mevcut liste mutasyona olmadığını gösteriyor, mümkün olduğunca temizleyin
  • Kulağa mantıklı geliyor, ikinci örnekte olduğu zincirleme

Lütfen daha fazla bilgi için sorarsanız kendimi yeterince iyi yapıyor muyum diye

EDİT 1:İşte Add 20 *tercih için benim akıl. Kod: bu iki satır düşünün

list.Add(foo);
list.Plus(foo);

Benim görüşüme göre (ve bukişisel bir şey) ikincisi açıkça hatalı olduğu - yazma gibi "x 5;" bir ifadesi olarak kendi başına. İlk satırı değişmez olduğunu hatırlayana kadar sorun yok gibi görünüyor. Aslında, kendi başına artı operatörü, basitçe mutasyona olmayan şekilde Plus en sevdiğim bir başka sebebi de budur. Operatör yükleme hafif ickiness olmadan, hala vardır aynı çağrışımları, (benim için) işlenen değil mutasyona uğradığını (ya da bu durumda yöntem hedef) verir.

EDİT 2:Ekle hoşlanmamak için bir sebep.

Çeşitli etkili cevaplar: "Ekle" Gidin. DateTime yapar String değişmezliğini tanıdı bu belli olmasın Replace yöntemleri vb." Katılıyorum - önceliği var. Ancak, insanlar DateTime.Add String.Replace Ara bol bol gördümmutasyon bekliyoruz. Orada yüklerin haber grubu soruları (ve muhtemelen bu YÜZDEN olanları eğer ben etrafında kazmak) cevap tarafından "görmezden geliyorsun dönüş değeri String.Replace; dizeleri değişmez, yeni bir dize alır döndü."

Şimdi, soru bir incelik ortaya etmeliyim - türü olabilirdeğilaslında değişmez bir listesi, ama farklı bir tür değişmez. Özellikle, bir odaya testleri eklediğiniz kıyaslama bir çerçeve üzerinde çalışıyorum, ve yeni bir paketi oluşturur. O kadar belli olabilir:

var list = new ImmutableList<string>();
list.Add("foo");

bir şey yapmak için gitmiyor, ama bir olurçokbunu değiştirmek için zaman giderek:

var suite = new TestSuite<string, int>();
suite.Add(x => x.Length);

Bu bir sorun olmaz gibi görünüyor. Bana bu ise, hatayı daha açık hale getirir:

var suite = new TestSuite<string, int>();
suite.Plus(x => x.Length);

O sadece olmak için yalvarıyor

var suite = new TestSuite<string, int>().Plus(x => x.Length);

İdeal olarak, benim kullanıcılar test paketi değişmez olduğunu söyledi olmak zorunda değil istiyorum. Onlara başarı çukura düşmek istiyorum. Buolabilirmümkün değil, ama denemek istiyorum.

Aşırı basitleştirme tek değişmez liste türü hakkında konuşarak özgün soru için özür dilerim. Tüm koleksiyonlar ImmutableList<T>:) hem de kendinden oldukça açıklayıcı

CEVAP
6 ŞUBAT 2009, Cuma


Bu gibi durumlarda, genelde Concat ile git. Yeni bir nesne oluşturuluyor genelde bana ima eder.

var p = listA.Concat(listB);
var k = listA.Concat(item);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MkElite

    MkElite

    13 NİSAN 2012
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013
  • TVNorge

    TVNorge

    5 EKİM 2006