Konteks
Dalam Clean Code , halaman 35, katanya
Ini menyiratkan bahwa blok dalam pernyataan if, statement lain, sedangkan statement, dan seterusnya harus sepanjang satu baris. Mungkin saluran itu harus menjadi pemanggilan fungsi. Ini tidak hanya menjaga fungsi penutup tetap kecil, tetapi juga menambah nilai dokumenter karena fungsi yang disebut di dalam blok dapat memiliki nama deskriptif yang bagus.
Saya sepenuhnya setuju, itu masuk akal.
Kemudian, di halaman 40, dikatakan tentang argumen fungsi
Jumlah argumen ideal untuk suatu fungsi adalah nol (niladik). Berikutnya adalah satu (monadik), diikuti oleh dua (diad). Tiga argumen (triadik) harus dihindari jika memungkinkan. Lebih dari tiga (polyadic) membutuhkan pembenaran yang sangat khusus — dan karenanya tidak seharusnya digunakan. Argumennya sulit. Mereka mengambil banyak kekuatan konseptual.
Saya sepenuhnya setuju, itu masuk akal.
Isu
Namun, agak sering saya menemukan diri saya membuat daftar dari daftar lain dan saya harus hidup dengan salah satu dari dua kejahatan.
Entah saya menggunakan dua baris di blok , satu untuk membuat sesuatu, satu untuk menambahkannya ke hasil:
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;
}
Atau saya menambahkan argumen ke fungsi untuk daftar di mana hal itu akan ditambahkan, menjadikannya "satu argumen lebih buruk".
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
CreateFlurpInList(badaBoom, flurps);
}
return flurps;
}
Pertanyaan
Apakah ada (dis-) keuntungan yang tidak saya lihat, yang membuat salah satu dari mereka disukai secara umum? Atau adakah keuntungan seperti itu dalam situasi tertentu; dalam hal itu, apa yang harus saya cari ketika membuat keputusan?
f(g(x))
bertentangan dengan panduan gaya Anda, well, saya tidak bisa memperbaiki panduan gaya Anda. Maksud saya, Anda juga tidak terbagi sqrt(x*x + y*y)
menjadi empat baris, bukan? Dan itu tiga (!) Bersarang subekspresi pada dua (!) Tingkat bersarang batin (terkesiap!). Tujuan Anda harus dapat dibaca , bukan pernyataan operator tunggal. Jika Anda menginginkannya nanti, well, saya memiliki bahasa yang sempurna untuk Anda: Assembler.
mov
instruksi x86 dan satu jmp toStart
di akhir. Seseorang benar-benar membuat kompiler yang melakukan hal itu: D
rlwimi
instruksi terkenal di PPC. (Itu adalah singkatan dari Rotate Left Word Immediate Mask Insert.) Perintah ini memakan waktu tidak kurang dari lima operan (dua register, dan tiga nilai langsung), dan melakukan operasi berikut: Satu konten register diputar oleh shift langsung, mask adalah dibuat dengan menjalankan tunggal 1 bit yang dikendalikan oleh dua operan langsung lainnya, dan bit yang sesuai dengan 1 bit dalam topeng itu di operan register lainnya diganti dengan bit yang sesuai dari register yang diputar. Instruksi sangat keren :-)
flurps.Add(CreateFlurp(badaBoom));
?