'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 gelirCons
: bu dillerde deneyimi olmayanlar için fonksiyonel dillerde normal adı, ama anlamsız olduğuna inanıyorumPlus
: 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
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);
&; Toplama numaralandırılmış" olur...
Nasıl değişmez bir " baskı miyim;{}&qu...
numarasını: ÖNEMLİ: kullanıcı "is...
&Quot bağlayın;ayrıcalıklı" port ...
Hata alıyorum: PostgreSQL raylar için ...