bağlam
In Temiz Kod , sayfa 35, diyor
Bu, if ifadelerindeki blokların, başka ifadelerin, while ifadelerinin vb. Bir satır uzunluğunda olması gerektiği anlamına gelir. Muhtemelen bu hat bir işlev çağrısı olmalıdır. Bu sadece çevreleyen işlevi küçük tutmakla kalmaz, aynı zamanda belgesel değeri de ekler çünkü blok içinde çağırılan işlev güzel bir tanımlayıcı ada sahip olabilir.
Tamamen hemfikir, bu çok mantıklı.
Daha sonra, sayfa 40'ta fonksiyon argümanları hakkında yazıyor
Bir fonksiyon için ideal argüman sayısı sıfırdır (niladik). Daha sonra bir (monadik) geliyor, ardından iki (dyadic) yakından takip ediyor. Mümkünse üç argümandan (üçlü) kaçınılmalıdır. Üçten fazla (polyadik) çok özel bir gerekçe gerektirir - ve daha sonra kullanılmamalıdır. Argümanlar zor. Çok fazla kavramsal güç alıyorlar.
Tamamen hemfikir, bu çok mantıklı.
Konu
Ancak, sık sık kendimi başka bir listeden bir liste oluştururken buluyorum ve iki kötülükten biriyle yaşamak zorunda kalacağım.
Ya blokta iki satır kullandım , biri şeyi yaratmak için, biri sonucu eklemek için:
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
Flurp flurp = CreateFlurp(badaBoom);
flurps.Add(flurp);
}
return flurps;
}
Veya listenin fonksiyonuna bir şeyin argümanını ekleyerek, "bir argümanı daha kötü" yapar.
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
CreateFlurpInList(badaBoom, flurps);
}
return flurps;
}
Soru
Bunlardan birini genel olarak tercih eden, göremediğim (dis-) avantajlar var mı? Veya bazı durumlarda böyle avantajlar var mı; Bu durumda karar verirken nelere dikkat etmeliyim?
f(g(x))
, stil rehberine aykırıysa, stil rehberinizi düzeltemem. Demek istediğim, sen de sqrt(x*x + y*y)
dört çizgiye bölünmüyorsun, değil mi? Ve bu, iki (!) İç yuvalama düzeyindeki (gasp!) Üç (!) Yuvalanmış alt ifadelerdir. Amacınız tek operatör ifadeleri değil okunabilirlik olmalıdır . Eğer daha sonra istersen, senin için mükemmel bir dile sahibim: Assembler.
mov
komutlarını ve jmp toStart
sonunda bir tane kullanarak bir Turing tamamlandı bilgisayarı yapabilirsiniz . Birisi aslında tam olarak yapan bir derleyici yaptı: D
rlwimi
talimattan bahsetmemek . (Bu, Sol Maske Döndürme Anında Maske Ekini Döndürme anlamına gelir.) Bu komut, beş işlenenden (iki yazmaç ve üç anlık değer) daha azını almadı ve aşağıdaki işlemleri gerçekleştirdi: Bir yazmaç içeriği hemen kaydırma ile döndürüldü, bir maske yapıldı. diğer iki acil işlenen tarafından kontrol edilen 1 bitlik tek bir çalıştırma ile oluşturulan ve diğer kayıt işlemcisi içindeki bu maskedeki 1 bit'e karşılık gelen bitler, döndürülen yazıcının karşılık gelen bitleri ile değiştirildi. Çok güzel talimat :-)
flurps.Add(CreateFlurp(badaBoom));
?