Apa itu kode idiomatik?

87

Saya akan tertarik dengan beberapa contoh c # sebelum dan sesudah, beberapa contoh non-idiomatik vs idiomatik. Contoh non-c # akan baik-baik saja jika mereka menyampaikan idenya. Terima kasih.

MrBoJangles
sumber
3
Fitur tersembunyi C # penuh dengan idiomatik C #. Tidak semuanya mempedulikan Anda, tetapi banyak kalimat sederhana dengan jumlah suara positif yang tinggi dapat dianggap idiomatis. Dan beberapa jawaban juga menggambarkan alternatif non-idiomatik.
Michiel van Oosterhout

Jawaban:

122

Idiomatik berarti mengikuti konvensi bahasa. Anda ingin menemukan cara termudah dan paling umum untuk menyelesaikan tugas daripada mentransfer pengetahuan Anda dari bahasa yang berbeda.

python non-idiomatik menggunakan loop dengan menambahkan:

mylist = [1, 2, 3, 4]
newlist = []
for i in mylist:
    newlist.append(i * 2)

python idiomatik menggunakan pemahaman daftar:

mylist = [1, 2, 3, 4]
newlist = [(i * 2) for i in mylist] 
Corey Goldberg
sumber
36

Beberapa contoh:

Manajemen sumber daya , tidak idiomatik:

string content;
StreamReader sr = null;
try {
    File.OpenText(path);
    content = sr.ReadToEnd();
}
finally {
    if (sr != null) {
        sr.Close();
    }
}

Idiomatis:

string content;
using (StreamReader sr = File.OpenText(path)) {
    content = sr.ReadToEnd();
}

Iterasi , non idiomatik:

for (int i=0;i<list.Count; i++) {
   DoSomething(list[i]);
}

Juga non-idiomatik:

IEnumerator e = list.GetEnumerator();
do {
   DoSomenthing(e.Current);
} while (e.MoveNext());

Idiomatis:

foreach (Item item in list) {
   DoSomething(item);
}

Penyaringan , non-idiomatik:

List<int> list2 = new List<int>();
for (int num in list1) {
  if (num>100) list2.Add(num);
}

idiomatis:

var list2 = list1.Where(num=>num>100);
JacquesB
sumber
13
Kawat gigi adalah idiomatik Java ;-)
Mathieu Guindon
15

Kode idiomatik adalah kode yang melakukan tugas umum dengan cara yang umum untuk bahasa Anda. Ini mirip dengan pola desain, tetapi pada skala yang jauh lebih kecil. Idiom sangat berbeda menurut bahasa. Satu idiom di C # mungkin menggunakan iterator untuk mengulang melalui koleksi daripada mengulanginya. Bahasa lain tanpa iterator mungkin mengandalkan idiom loop.

Bill the Lizard
sumber
6

Di PHP saya terkadang menemukan kode seperti:

foreach ($array as $value) {
    $trimmed[] = trim($value);
}
return $trimmed;

Yang secara idiomatis dapat diimplementasikan dengan:

return array_map('trim', $array);
jmoz
sumber
5

Secara praktis, ini berarti menulis kode dengan cara yang konsisten, yaitu semua pengembang yang bekerja pada basis kode Anda harus mengikuti konvensi yang sama saat menulis konstruksi kode yang serupa.

Jadi cara idiomatik adalah cara yang sesuai dengan gaya kode lain, cara non-idiomatik berarti Anda menulis jenis fungsi tetapi dengan cara yang berbeda.

misalnya jika Anda mengulang sejumlah item, Anda dapat menulis loop dengan beberapa cara:

for (int i = 0; i < itemCount; i++)

for (int i = 1; i <= itemCount; i++)

for (int i = 0; i < itemCount; ++i)

dll

Yang terpenting adalah gaya yang dipilih digunakan secara konsisten. Dengan begitu, orang menjadi sangat akrab dan percaya diri dengan cara menggunakannya, dan ketika Anda melihat penggunaan yang terlihat berbeda, itu bisa menjadi tanda adanya kesalahan, mungkin kesalahan satu per satu, mis.

for (int i = 1; i < itemCount; i++)
RickL
sumber
2
Saya kira saya pikir idiomatik berarti "cara terbaik" sebagai lawan dari standar yang sewenang-wenang. Tapi saya rasa cara terbaik bergantung pada konteks.
MrBoJangles