Cos'è il codice idiomatico?


87

Sarei interessato ad alcuni esempi c # prima e dopo, alcuni esempi non idiomatici e idiomatici. Anche gli esempi non c # andrebbero bene se trasmettessero l'idea. Grazie.


3
Le funzionalità nascoste di C # sono piene di idiomatiche C #. Non tutti ti dispiace, ma molte delle semplici battute con un numero elevato di voti positivi potrebbero essere considerate idiomatiche. E alcune risposte descrivono anche le alternative non idiomatiche.
Michiel van Oosterhout

Risposte:


122

Idiomatico significa seguire le convenzioni della lingua. Desideri trovare i modi più semplici e comuni per svolgere un'attività piuttosto che trasferire le tue conoscenze da una lingua diversa.

python non idiomatico usando un ciclo con append:

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

pitone idiomatico che utilizza una comprensione delle liste:

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

36

Qualche esempio:

Gestione delle risorse , non idiomatica:

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

Idiomatico:

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

Iterazione , non idiomatica:

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

Anche non idiomatici:

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

Idiomatico:

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

Filtrante , non idiomatico:

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

idiomatico:

var list2 = list1.Where(num=>num>100);

13
Le parentesi graffe sono Java idiomatiche ;-)
Mathieu Guindon

15

Il codice idiomatico è un codice che svolge un'attività comune nel modo comune per la tua lingua. È simile a un modello di progettazione, ma su scala molto più piccola. I modi di dire differiscono ampiamente in base alla lingua. Un idioma in C # potrebbe essere quello di utilizzare un iteratore per iterare in una raccolta anziché eseguire il ciclo attraverso di essa. Altre lingue senza iteratori potrebbero fare affidamento sull'idioma del ciclo.


6

In PHP a volte incontro codice come:

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

Che idiomaticamente può essere implementato con:

return array_map('trim', $array);

5

In pratica, significa scrivere codice in modo coerente, cioè tutti gli sviluppatori che lavorano sulla tua base di codice dovrebbero seguire le stesse convenzioni quando scrivono costrutti di codice simili.

Quindi il modo idiomatico è il modo in cui corrisponde allo stile dell'altro codice, il modo non idiomatico significa che stai scrivendo il tipo di funzione ma in un modo diverso.

ad esempio, se stai ripetendo un certo numero di elementi, potresti scrivere il ciclo in diversi modi:

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

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

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

eccetera

La cosa più importante è che lo stile scelto sia usato in modo coerente. In questo modo le persone diventano molto familiari e sicure di come usarlo, e quando spii un utilizzo che sembra diverso può essere un segno di un errore introdotto, forse un errore di un errore, ad es.

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

2
Immagino di aver pensato che idiomatico significasse "il modo migliore" in contrapposizione a uno standard arbitrario. Ma immagino che il modo migliore sia soggetto al contesto.
MrBoJangles
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.