Was ist idiomatisch?

19

Ich verstehe ein "Idiom" als eine häufige Operation oder ein Muster, das in einer bestimmten Sprache nicht durch die Syntax der Hauptsprache vereinfacht wird, z.

i = i + 1;

In C ++ wird diese Redewendung durch einen Operator vereinfacht:

++i;

Wenn jedoch jemand den Begriff "idiomatisch" verwendet, bin ich mir nicht sicher, wie ich ihn verstehen soll. Was macht ein Stück Code "idiomatisch"?

void.pointer
quelle
Dies gehört genauso zu english.stackexchange.com wie hier.
S.Lott
@ perl.j: Aufschlussreich. Sie haben wirklich geklärt, warum die Definition von "Idiomatic" nicht zu english.stackexchange.com gehört. Sehr hilfreich.
S.Lott

Antworten:

24

Eine idiomatische Art, Code zu schreiben, ist, wenn Sie ihn auf eine ganz bestimmte Weise schreiben, da andere Sprachen keine sprachspezifischen Redewendungen haben.

In C ++ führt das Ausnutzen der RAII-ID beispielsweise dazu, dass idiomatische Ressourcen für die Verwaltung von C ++ - Code geschrieben werden.

Ein weiteres Beispiel wäre die Verwendung von Listenverständnissen in Python, um Listen zu generieren. Es ist idiomatisch, weil Sie Listenverständnis in idiomatischem Python verwendet hätten, aber Sie hätten dasselbe auch mit einer Generatorfunktion in einer anderen Sprache oder sogar in Python tun können.

Oft schreibt jemand, der eine neue Sprache versucht, ohne die für diese Sprache spezifischen Redewendungen zu verwenden, keinen Redewendungscode.

Klaim
quelle
Hervorragende Beschreibung. Wenn ich in C # eine Erweiterungsmethode mit dem Namen " TryAdd()Generic Dictionaryclass" erst überprüfe !Contains()und dann aufrufe Add(), ist dies idiomatisch. Ich verwende eine Funktion, die für C # -Erweiterungsmethoden spezifisch ist.
void.pointer
1
Ich bin mir nicht sicher, wie es Ihnen der erfahrenste C ++ - Coder empfehlen würde, freie Funktionen zum Erweitern von Klassen zu schreiben, anstatt nach Möglichkeit Mitglieder hinzuzufügen. Es ist nicht dasselbe wie die C # -Erweiterungsmethoden, aber es ist ziemlich ähnlich und für jede Sprache verfügbar, die freie Funktionen zulässt. Was ich sicher bin, ist, dass das Schreiben von "set / getters" in C # unter Verwendung von Eigenschaften idiomatisch ist.
Klaim 20.07.11
Dies ist jedoch nicht C ++. Daher ist die Verwendung von "C ++" möglicherweise nicht "idiomatisch" genug. Die Verwendung einer Erweiterungsmethode ist hier sinnvoll und sehr C # -ähnlich. In jedem Fall war es ein Beispiel, aber Erweiterungsmethoden sind für C # sehr idiomatisch.
void.pointer
Ja, deshalb sagte ich "Ich bin nicht sicher", es fühlt sich idiomatisch an, aber es ist so nah an anderen Grundfunktionen anderer Sprachen, dass ich nicht sicher bin (weil ich kein C # -Entwickler bin). Ich habe ein anderes Beispiel: Die Schleife wird durch Rekursion in allen funktionalen Sprachen ausgeführt. Sie können es in anderen Sprachen tun, aber es ist eindeutig typisch für funktionale Sprachen. Ich bin mir nicht sicher, ob es hilft.
Klaim
1
Natürlich geht Python noch einen Schritt weiter, indem es eine idiomatische Art hat, sich auf idiomatischen Code zu beziehen, dh pythonisch. * 8 ')
Mark Booth
12

Normale Definition

Verwenden, Enthalten oder Bezeichnen von Ausdrücken, die für einen Muttersprachler natürlich sind

Programmierdefinition

Verwenden, Enthalten oder Bezeichnen von Ausdrücken, die für einen [Sprache einfügen] -Programmierer natürlich sind

ChaosPandion
quelle
1
Wenn ich die "Google" -Definitionen für diesen Begriff für hilfreich gehalten hätte, hätte ich hier nichts gepostet. Ich wollte eine bessere Beschreibung (Tutorial-ähnlich) mit Beispielen.
void.pointer
3
@Robert - Ich glaube, ich verstehe nicht, warum du nicht verstehst.
ChaosPandion
2
Ich habe Ihre Antwort zuerst gelesen, es war nicht ganz klar. Nachdem ich die Antwort gelesen hatte, die jetzt als meine Antwort markiert ist, wurde mir sehr klar, was "idiomatisch" bedeutet, und ich verstehe sie jetzt. Nachdem ich Ihre Antwort gelesen habe, macht es Sinn. Sie haben mich jedoch nicht durch Beispiele und verschiedene Szenarien geführt, weshalb ich denke, dass Ihre Antwort nicht so hilfreich war. Sie haben eine "webster" -Antwort gegeben, die technisch korrekt, aber für mein Verständnis nicht hilfreich ist. Ich weiß Ihre Hilfe zu schätzen.
void.pointer
7

Idiomatisch im Kontext der Programmierung kann normalerweise definiert werden als "die natürlichste Art, etwas in einer Sprache auszudrücken".

Ich sehe, dass das Wort Idiomatik in Ruby besonders häufig vorkommt. In Ruby gibt es umfangreiche Funktionen zur Metaprogrammierung. Um idiomatischen Ruby-Code zu schreiben, müssen Sie diese normalerweise verwenden.

Beachten Sie, dass nur, weil ein Teil des Codes idiomatisch ist, dies nicht bedeutet, dass er sauber oder sogar kurz ist. Oft müssen Sie Kompromisse eingehen.

Im Grunde genommen bezieht sich Idiomatik am häufigsten auf die gebräuchlichste Art, etwas in einer Sprache zu schreiben, häufig einschließlich "Slang" (Redewendungen). Wenn ein Teil des Codes nicht idiomatisch ist, kann er perfekt lesbar, prägnant, sauber und korrekt sein, in der verwendeten Sprache kann er sich jedoch unangenehm anfühlen / aussehen. Es ist eine Vorliebe des Geschmacks, ob das idiomatische Umschreiben eines solchen Codes tatsächlich eine gute Sache wäre und von Fall zu Fall beurteilt werden muss

Das idiomatische Englisch kann zum Beispiel von der Region abhängen. Die Verwendung des Wortes bumist wahrscheinlich für idiomatisches britisches Englisch erforderlich, während dies buttfür US-Englisch besser geeignet ist. (Ich kann leider nicht viel Englisch in Großbritannien: /)

Earlz
quelle
Danke (aufgestimmt), ich denke, Ihre Definition hat es für mich genau richtig gemacht!
Ashaman Kingpin
3

Das beste Beispiel, das ich mir aus der Vogelperspektive für etwas Idiomatisches ausdenken kann, stammt von Ruby.

In einer Fülle von Sprachen können Sie iterieren mit:

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

Oder etwas sehr Ähnliches. Viele Sprachen haben auch ein foreach(x in SetOfXes)Konstrukt. Aber die für Ruby typische Iteration umfasst Dinge wie:

collection.each do |current|
  current.do_stuff
end

und sogar

10.times do |x|
  puts x
end

Ich betrachte diese als idiomatisch, weil sie einen Weg darstellen, etwas zu tun, das weniger verbreitet ist und das etwas darstellt, das den Kern der Philosophie seines Bereichs ausmacht. Ruby hat eine Philosophie über die Interaktion mit Objekten, die zwar nicht einzigartig, aber nicht allgegenwärtig ist.

In semantischer Hinsicht vervollständigt mein Gehirn den Gedanken immer dann, wenn ich das Wort idiomatisch höre, automatisch als "idiomatisch für ..." - ich analysiere ihn einfach reflexartig als auf ein bestimmtes Thema bezogen.

asfallows
quelle
Wie collection.each do |current|unterscheidet sich von foreach(current in collection)? Beide sind Schleifenkonstrukte, die currentauf jedes Element von gesetzt werden collection.
MSalters
2

Redewendungen sind in der Regel die beste Möglichkeit, eine gemeinsame, relativ komplexe Situation in einer Sprache auszudrücken. Inkrementieren ist keine Redewendung oder ähnliches. Wenn Sie Präfixinkrement anstelle von Postfix verwenden, könnten Sie argumentieren, ein C ++ - Idiom zu sein.

Redewendungen sind die beste Möglichkeit, eine Sprache zu verwenden, die von erfahrenen Benutzern festgelegt wird. Ein echtes C ++ - Idiom wären Funktionsobjekte. Eine andere Redewendung wäre RAII. Die Sprache sagt nichts darüber aus, dass Sie Ressourcen im Destruktor freigeben müssen. Aber es ist idiomatisch, dies zu tun. Ein weiteres Beispiel sind Vorlagen - es ist idiomatisch, Vorlagen für alles zu verwenden, was Sie können, aber nichts kann Sie davon abhalten, die Vererbung zu überbeanspruchen.

DeadMG
quelle
Wikipedia verwendete das Inkrementieren als Beispiel, deshalb habe ich es in meiner Frage erwähnt. Warum müssen Redewendungen komplex sein? Dies scheint nicht Teil der Definition zu sein, die auf den anderen Antworten basiert.
void.pointer
4
@Robert Dailey: Wie könnte Inkrementieren möglicherweise eine Redewendung sein? Es ist Teil der Sprache . Redewendungen werden von den Nutzern einer Sprache gemacht und ändern sich im Laufe der Zeit. Inkrementieren ist keine Redewendung, sondern eine Grundfunktionalität der Sprache. Ausgehend von dieser Logik könnte ich sagen, dass jede andere grundlegende Sprachfunktion eine Redewendung ist, und daher ist jedes Programm eine Redewendung, die es nicht ist.
DeadMG
2

Ihre Definition scheint mir nicht richtig zu sein. Ein Idiom ist eine Art, etwas zu schreiben, das in anderen Sprachen möglich oder nicht möglich ist, aber in dieser Sprache üblich ist. Normalerweise ist es kürzer als die Alternative, aber das ist eigentlich keine Voraussetzung.

Es könnte einfacher sein, es zu erklären, indem man darüber spricht, was nicht idiomatisch ist. In C ++ ist es ziemlich idiomatisch zu schreiben:

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

Es ist noch idiomatischer zu schreiben:

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

Dieser Code macht genau das Gleiche - einige Leute, die C ++ noch nicht kennen, lesen ihn möglicherweise als Test, um festzustellen, ob p dem entspricht, was die Funktion zurückgibt, aber das ist nicht der Fall.

Vergleichen Sie mit dem, was jemand sehr unidiomatisch schreiben könnte, der aus einer anderen Sprache stammt:

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

Sie werden auch dieses Zeug als nicht idiomatisch empfinden:

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

Weil der idiomatische Ansatz ist

return (x>0);

Die nicht-idiomatischen Methoden sind nicht falsch, aber für diejenigen, die die Redewendungen kennen, dauert das Tippen in der Regel länger und das Lesen dauert immer länger. Wenn ich dich "der Junge, der den Wolf geweint hat" nenne und du die Geschichte kennst, ist es schneller, als wenn ich erkläre, wie falsche Alarme dazu führen, dass die Leute dich ignorieren. Das Problem ist natürlich, wenn Sie die Geschichte nicht kennen und nicht wissen, was Wölfe mit dem zu tun haben, worüber wir sprechen. Ebenso kann es ein Problem sein, wenn Sie es noch nie gesehen return x<y;haben und wirklich nicht wissen, was es tut.

Kate Gregory
quelle
1
Der idiomatische Ansatz wäre sicherlich, den Zeiger in der if-Bedingung zu deklarieren , sodass auf ihn niemals zugegriffen werden kann, wenn er nicht NULL ist. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG
mm wahrscheinlich. Oder tausend Zeilen früher, weil es in diesem Block verwendet wird. Oder in einer Header-Datei, weil es sich um eine Member-Variable handelt. Ich habe es nur erklärt, damit die Leser wissen, dass es ein Foo * ist. Sie haben Recht, dass es dort im wirklichen Leben nicht deklariert wird.
Kate Gregory
1

Wenn es mehrere Möglichkeiten gibt, etwas auszudrücken, die gängigste oder allgemein akzeptierte. Verwenden Sie beispielsweise eine strukturierte Anweisung in C anstelle der exakten Entsprechung mit goto-Anweisungen.

hotpaw2
quelle