Cosa è idiomatico?


19

Capisco un "linguaggio" come un'operazione o modello comune che in una lingua particolare non è semplificata dalla sintassi del linguaggio principale, come l'incremento di interi:

i = i + 1;

In C ++, questo linguaggio è semplificato da un operatore:

++i;

Tuttavia, quando qualcuno usa il termine "idiomatico", non sono sicuro di come capirlo. Cosa rende "idiomatico" un pezzo di codice?


Questo appartiene tanto su english.stackexchange.com come qui.
S.Lott

@ perl.j: Insightful. Hai chiarito davvero perché la definizione di "idiomatica" non appartiene a english.stackexchange.com. Molto utile.
S. Lott,

Risposte:


24

Un modo idiomatico di scrivere del codice è quando lo scrivi in ​​un modo molto specifico a causa di idiomi specifici della lingua che altre lingue non hanno.

Ad esempio, in C ++, lo sfruttamento del linguaggio RAII porta a modi di scrivere codice C ++ gestendo risorse idiomatiche.

Un altro esempio potrebbe essere la comprensione delle liste in Python per generare liste. È idiomatico perché avresti usato la comprensione dell'elenco in Python idiomatico ma avresti potuto fare lo stesso usando una funzione di generatore in qualsiasi altra lingua o persino in Python.

Spesso, qualcuno che prova una nuova lingua senza usare gli idiomi specifici di questa lingua non scriverà un codice idiomatico.


Descrizione eccellente. Quindi in C #, se creo un metodo di estensione chiamato TryAdd()su Dictionaryclasse generica per verificare prima !Contains()e poi chiamare Add(), questo sarebbe idiomatico? Sto usando una funzione specifica per i metodi di estensione C #.
void.pointer

1
Non sono sicuro esattamente come il programmatore C ++ più esperto ti direbbe di scrivere funzioni gratuite per estendere le classi invece di aggiungere membri, ove possibile. Non è lo stesso dei metodi di estensione C # ma è abbastanza vicino e disponibile per qualsiasi linguaggio che consenta funzioni gratuite. Quello che sono sicuro è che scrivere "set / getters" in C # usando le proprietà È idiomatico.
Klaim,

Ma questo non è C ++, quindi l'uso del "modo C ++" potrebbe non essere abbastanza "idiomatico". L'uso di un metodo di estensione qui è ragionevole e molto simile a C #. In ogni caso è stato un esempio, ma i metodi di estensione sono molto idiomatici di C #.
void.pointer

Sì, è per questo che ho detto "Non sono sicuro", sembra idiomatico ma è così vicino ad altre funzionalità di base di altre lingue che non sono sicuro (perché non sono un sviluppatore C #). Ho un altro esempio: il looping viene eseguito per ricorsione in tutti i linguaggi funzionali. Puoi farlo in altre lingue, ma chiaramente è idiomatico per i linguaggi funzionali. Non sono sicuro se aiuta.
Klaim,

1
Naturalmente python fa un ulteriore passo avanti avendo un modo idiomatico di riferirsi al codice idiomatico, cioè pythonic. * 8 ')
Mark Booth,

12

Definizione normale

Usare, contenere o denotare espressioni naturali per un madrelingua

Definizione di programmazione

Utilizzando, contenenti, o che denota espressioni che sono naturali a un [inserire la lingua] programmatore


1
Se pensassi che le definizioni "google" per questo termine fossero utili non avrei pubblicato qui. Volevo una descrizione migliore (simile a un tutorial) con esempi.
void.pointer

3
@Robert - Immagino di non capire perché non capisci.
ChaosPandion,

2
Ho letto prima la tua risposta, non era del tutto chiaro. Dopo aver letto la risposta che ora è contrassegnata come mia risposta, è diventato molto chiaro cosa significasse "idiomatico" e ora lo capisco. Ora che ho letto la tua risposta ha senso. Tuttavia, non mi hai guidato attraverso esempi e scenari diversi, motivo per cui penso che la tua risposta non sia stata altrettanto utile. Hai dato una risposta "webster" che è tecnicamente corretta ma non utile per aiutarmi a capire. Apprezzo il tuo aiuto però.
void.pointer

7

Idiomatico nel contesto della programmazione di solito può essere definito come "il modo più naturale per esprimere qualcosa in una lingua"

Vedo che la parola idiomatica appare particolarmente in Ruby. In Ruby ci sono enormi capacità di meta-programmazione e per scrivere un codice Ruby idiomatico, di solito è necessario utilizzarle.

Nota che solo perché un pezzo di codice è idiomatico, non significa che sia pulito o addirittura conciso. Molte volte devi scendere a compromessi.

Quindi, fondamentalmente, l'idioma si riferisce più comunemente al modo più comune di scrivere qualcosa in una lingua, spesso includendo "gergo" (modi di dire). Se un pezzo di codice non è idiomatico, può essere perfettamente leggibile, conciso, pulito e corretto, ma può sembrare / apparire imbarazzante nella lingua usata. È una preferenza di gusto se riscrivere in modo idiomatico una tale parte di codice sarebbe effettivamente una buona cosa e debba essere valutata caso per caso

L'inglese idiomatico, ad esempio, può dipendere dalla regione. L'uso della parola bumè probabilmente richiesto per l'inglese inglese idiomatico, mentre buttè più appropriato per l'inglese americano. (Non so molto inglese britannico purtroppo: /)


Grazie (votato), penso che la tua definizione sia arrivata subito sul posto per me!
Ashaman Kingpin,

3

Il miglior esempio che posso escogitare, in cima alla mia testa, per qualcosa di idiomatico, viene da Ruby.

In molte lingue, puoi iterare con:

for( start; end; increment){
    code;
}

O qualcosa di molto simile. Molte lingue hanno anche un foreach(x in SetOfXes)costrutto. Ma l'iterazione idiomatica di Ruby include cose come:

collection.each do |current|
  current.do_stuff
end

e persino

10.times do |x|
  puts x
end

Vedo questi come idiomatici perché rappresentano un modo di fare qualcosa che è meno comune e che rappresenta qualcosa al centro della filosofia del suo dominio. Ruby ha una filosofia sull'interazione con oggetti che, sebbene non unica, non è onnipresente.

Su una nota semantica, ogni volta che sento la parola idiomatica, il mio cervello completa automaticamente il pensiero come "idiomatico a ..." - lo analizzo solo riflessivamente in relazione a un argomento specifico.


In cosa collection.each do |current|differisce da foreach(current in collection)? Entrambi sono costrutti di loop impostati currentsu ciascun elemento di collection.
MSalters,

2

Gli idiomi sono di solito il modo migliore per esprimere una situazione comune e relativamente complessa in una lingua. L'incremento non è un linguaggio o qualcosa del genere. Usando l'incremento del prefisso invece del postfisso, potresti sostenere di essere un linguaggio C ++.

I modi di dire sono il modo migliore per usare una lingua, come determinato da utenti esperti. Un vero linguaggio C ++ sarebbe oggetti funzione. Un altro linguaggio sarebbe RAII. Non c'è niente nella lingua che ti dica che devi liberare risorse nel distruttore. Ma è idiomatico farlo. Un altro esempio è rappresentato dai modelli: è idiomatico usare i modelli per tutto ciò che puoi, ma non c'è nulla che ti impedisca di usare eccessivamente l'eredità.


Wikipedia ha usato l'incremento come esempio, quindi è per questo che l'ho menzionato nella mia domanda. Perché gli idiomi devono essere complessi? Questo non sembra parte della definizione basata sulle altre risposte.
void.pointer

4
@Robert Dailey: in che modo l'incremento potrebbe essere un idioma? Fa parte della lingua . Gli idiomi sono fatti dagli utenti di una lingua, cambiano nel tempo. L'incremento non è un linguaggio, è una funzionalità di base della lingua. Prendendo quella logica, potrei dire che qualsiasi altra funzione linguistica di base è un linguaggio, e quindi ogni programma è idiomatico, cosa che non lo è.
DeadMG

2

La tua definizione non mi sembra corretta. Un linguaggio è un modo di scrivere qualcosa che può o non può essere possibile in altre lingue, ma che è un luogo comune in questa lingua. Di solito, è più breve dell'alternativa, ma non è davvero un requisito.

Potrebbe essere più facile spiegarlo parlando di ciò che non è idiomatico. In C ++, è abbastanza idiomatico scrivere:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p)
{
 // whatever
}

È ancora più idiomatico scrivere:

Foo* p; 
if(p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
{
 // whatever
}

Questo codice fa esattamente la stessa cosa: alcune persone che non conoscono C ++ potrebbero leggerlo come test per vedere se p è uguale a ciò che restituisce la funzione, ma non è quello che fa.

Confronta con quello che qualcuno potrebbe scrivere, in modo molto non idiomatico, che proviene da un'altra lingua:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p !=NULL)
{
 // whatever
}

Vedrai anche queste cose come non idiomatiche:

if (x>0)
  return true;
else
 return false;

Perché l'approccio idiomatico è

return (x>0);

I modi non idiomatici non sono sbagliati, ma di solito impiegano più tempo a scrivere e impiegano sempre più tempo a leggere, per coloro che conoscono gli idiomi. Se ti chiamo "il ragazzo che piangeva lupo" e conosci la storia, è più veloce che se ti spiegassi come i falsi allarmi inducono le persone a ignorarti. Il problema, ovviamente, è se non conosci la storia e non sai cosa hanno a che fare i lupi con ciò di cui stiamo parlando. Allo stesso modo, può essere un problema se non l'hai mai visto return x<y;prima e davvero non sai cosa fa.


1
L'approccio idiomatico sarebbe sicuramente quello di dichiarare il puntatore nella condizione if, in modo che non sia mai possibile accedervi se non è NULL. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG

mm, probabilmente. O mille righe prima perché è usata in questo blocco. O in un file di intestazione perché è una variabile membro. L'ho dichiarato solo in modo che i lettori sapessero che era un Foo *, hai ragione che nella vita reale non sarebbe stato dichiarato lì.
Kate Gregory,

1

Quando ci sono diversi modi per esprimere qualcosa, il modo più comune o comunemente accettato. Ad esempio, usando un'istruzione strutturata in C invece dell'equivalente esatto usando le istruzioni goto.

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.