Eines der Dinge, mit denen ich zu kämpfen habe, ist, die ungarische Notation nicht zu verwenden. Ich möchte nicht zur Variablendefinition gehen müssen, nur um zu sehen, welcher Typ es ist. Wenn ein Projekt umfangreich wird, ist es schön, eine Variable mit dem Präfix 'bool' zu betrachten und zu wissen, dass nach true / false anstelle eines 0 / 1- Werts gesucht wird.
Ich arbeite auch viel in SQL Server. Ich stelle meinen gespeicherten Prozeduren 'sp' und meinen Tabellen 'tbl' voran, ganz zu schweigen von all meinen Variablen in der Datenbank.
Ich sehe überall, dass niemand wirklich die ungarische Notation verwenden möchte, bis zu dem Punkt, an dem sie es vermeiden. Meine Frage ist, was der Vorteil ist, wenn man keine ungarische Schreibweise verwendet, und warum meidet die Mehrheit der Entwickler dies wie die Pest?
quelle
Antworten:
Weil seine ursprüngliche Absicht (siehe http://www.joelonsoftware.com/articles/Wrong.html und http://fplanque.net/Blog/devblog/2005/05/11/hungarian_notation_on_steroids ) missverstanden wurde und es wurde ( ab) dient dazu, sich zu erinnern, welcher Typ eine Variable ist, wenn die von ihnen verwendete Sprache nicht statisch typisiert ist. In jeder statisch getippten Sprache benötigen Sie keine zusätzlichen Präfixe, um den Typ einer Variablen zu bestimmen. In vielen untypisierten Skriptsprachen kann es helfen, aber es wurde oft so missbraucht, dass es völlig unhandlich wurde. Leider haben die Leute es gerade zu einem der "bösen" Dinge gemacht, die Sie vermeiden sollten, anstatt zu der ursprünglichen Absicht der ungarischen Notation zurückzukehren.
Kurz gesagt, die ungarische Notation sollte Variablen eine gewisse Semantik voranstellen. Wenn Sie beispielsweise Bildschirmkoordinaten haben (links, oben, rechts, unten), werden Variablen mit absoluten Bildschirmpositionen mit "
abs
" und Variablen mit Positionen relativ zu einem Fenster mit "rel
" vorangestellt . Auf diese Weise ist es für jeden Leser offensichtlich, wenn Sie eine relative Koordinate an eine Methode übergeben, die absolute Positionen erfordert.update (als antwort auf kommentar von delnan)
IMHO sollte die missbrauchte Version wie die Pest vermieden werden, weil:
listboxXYZ
oderMyParticularFlavourListBoxXYZ
.ui
ganze Zahl ohne Vorzeichen? eine nicht referenzierte gezählte Schnittstelle? etwas mit Benutzeroberflächen zu tun? Und diese Dinge können lang werden . Ich habe Präfixe von mehr als 15 scheinbar zufälligen Zeichen gesehen, die den genauen Typ der Var wiedergeben sollen, aber wirklich nur mystifizieren.quelle
AbsoluteXType
und ein habenRelativeYType
, können Sie nicht irrtümlicherweise eine relative Y-Koordinate für eine absolute X-Koordinate übergeben. Ich bevorzuge Variablen, die inkompatible Entitäten darstellen, von inkompatiblem Typ, anstatt inkompatible Präfixe zu haben. Der Compiler achtet nicht auf Präfixe (oder Suffixe).Die ungarische Notation ist in modernen Programmierumgebungen und in der Form der Tautologie ein Anti-Muster .
Es werden unnötigerweise Informationen ohne Nutzen und zusätzlichen Wartungsaufwand wiederholt. Was passiert, wenn Sie Ihren
int
Typ auf einen anderen Typ ändernlong
, müssen Sie jetzt Ihre gesamte Codebasis suchen und ersetzen, um alle Variablen umzubenennen, oder sie sind jetzt semantisch falsch, was schlimmer ist, als wenn Sie den Typ nicht im Namen dupliziert hätten.Es verstößt gegen das DRY-Prinzip. Wenn Sie Ihren Datenbanktabellen eine Abkürzung voranstellen müssen, um Sie daran zu erinnern, dass es sich um eine Tabelle handelt, sind Sie definitiv nicht in der Lage, Ihre Tabellen semantisch aussagekräftig genug zu benennen. Gleiches gilt für alle anderen Dinge, mit denen Sie dies tun. Es ist nur eine zusätzliche Eingabe, die in einer modernen Entwicklungsumgebung keinen Nutzen bringt.
quelle
int
einen anderen Typ alslong
... wählen?" Einfach: <sarcasm> Ändern Sie den Namen nicht, da nicht absehbar ist, an wie vielen Stellen sich die Änderung auswirkt. </ Sarcasm> Nun haben Sie also eine Variable, deren Name geändert wird Ungarischer Name widerspricht seiner Umsetzung. Es ist absolut nicht abzusehen, wie weit verbreitet die Änderung des Namens ist, wenn die Variable / Funktion öffentlich sichtbar ist.Wikipedia hat eine Liste von Vor- und Nachteilen der ungarischen Notation und kann daher wahrscheinlich die umfassendste Antwort auf diese Frage geben. Die bemerkenswerten Meinungen sind auch eine ziemlich interessante Lektüre.
Der Vorteil, keine ungarische Notation zu verwenden, besteht im Wesentlichen darin, dass nur die Nachteile vermieden werden:
Ich selbst benutze diese Notation nicht, weil ich das unnötige technische Rauschen nicht mag. Ich weiß fast immer, mit welchem Typ ich es zu tun habe und ich möchte eine saubere Sprache in meinem Domain-Modell, aber ich schreibe hauptsächlich in statischen und stark typisierten Sprachen.
quelle
Als MS SQL Server spezifisches Problem:
quelle
sp_
sodass ich mich nur an die Konvention hielt.IMO ist der größte Vorteil, wenn Sie kein Ungarisch verwenden, die Tatsache, dass Sie dazu gezwungen werden, aussagekräftige Namen zu verwenden . Wenn Sie Variablen richtig benennen, sollten Sie sofort wissen, um welchen Typ es sich handelt, oder in der Lage sein, ihn in einem gut konzipierten System relativ schnell abzuleiten. Wenn Sie sich verlassen müssen
str
oderbln
oder schlechter alleobj
Präfixe zu wissen , welche Art eine Variable ist, würde ich argumentieren , es eine Name Problem gibt - entweder schlechte Variablennamen im Allgemeinen oder viel zu allgemeine Bedeutung zu vermitteln.Aus persönlicher Erfahrung ist das Hauptszenario, in dem ich Ungarisch gesehen habe, entweder "Frachtkult" -Programmierung (dh, es wird von anderem Code verwendet, verwenden wir es also weiterhin, nur weil) oder in VB.NET, um die Tatsache zu umgehen, dass es sich um eine Sprache handelt Groß- / Kleinschreibung wird
Person oPerson = new Person
nicht berücksichtigt (z. B. weil Sie nicht verwenden könnenPerson person = new Person
undPerson p = new Person
zu vage sind); Ich habe in diesem speziellen Fall auch das Präfix "the" oder "my" (wie inPerson thePerson = new Person
oder hässlicherPerson myPerson = new Person
) gesehen.Ich werde das Hinzufügen nur Zeit verwende ich Ungar für ASP.NET - Steuerelemente zu sein scheint und das ist wirklich eine Frage der Wahl. Ich finde es sehr hässlich zu tippen
TextBoxCustomerName
oderCustomerNameTextBox
gegenüber dem EinfacherentxtCustomerName
, aber selbst das fühlt sich "dreckig" an. Ich bin der Meinung, dass für Steuerelemente eine Art Namenskonvention verwendet werden sollte, da es mehrere Steuerelemente geben kann, die dieselben Daten anzeigen.quelle
Ich werde mich nur auf SQL Server konzentrieren, da Sie es erwähnt haben. Ich sehe keinen Grund, 'tbl' vor einen Tisch zu stellen. Sie können sich jeden tSQL-Code ansehen und eine Tabelle danach unterscheiden, wie sie verwendet wird. Sie würden nie
Select from stored_procedure.
oderSelect from table(with_param)
möchten, dass Sie eine UDF oderExecute tblTableOrViewName
eine gespeicherte Prozedur möchten .Tabellen könnten mit einer Ansicht verwechselt werden, aber wenn es darum geht, wie sie verwendet werden; Es gibt keinen Unterschied. Worum geht es also? Die ungarische Notation erspart Ihnen möglicherweise die Zeit, die Sie für die Suche in SSMS (unter Tabelle oder Ansichten?) Benötigen, aber das war es auch schon.
Variablen können ein Problem darstellen, aber sie müssen deklariert werden. Wie weit von Ihrer Deklarierungsanweisung entfernt möchten Sie eine Variable verwenden? Ein paar Zeilen zu scrollen sollte keine große Sache sein, es sei denn, Sie schreiben sehr lange Prozeduren. Es kann eine gute Idee sein, den langen Code ein wenig aufzubrechen.
Was Sie beschreiben, ist ein Schmerz, aber die ungarische Notationslösung löst das Problem nicht wirklich. Sie können sich den Code einer anderen Person ansehen und feststellen, dass der Variablentyp möglicherweise geändert wird, was jetzt eine Änderung des Variablennamens erforderlich macht. Nur noch eine Sache zu vergessen. Und wenn ich ein VarChar verwende, müssen Sie sich die declare-Anweisung trotzdem ansehen, um die Größe zu ermitteln. Beschreibende Namen werden Sie wahrscheinlich weiterbringen. @PayPeriodStartDate erklärt sich so ziemlich von selbst.
quelle
Eine andere Sache ist, welche Abkürzungen würden Sie für ein gesamtes Framework wie .NET verwenden? Ja, es ist so einfach, sich daran zu erinnern, dass es sich
btn
um eine Schaltfläche undtxt
ein Textfeld handelt. Aber was denkst du über so etwasStringBuilder
?strbld
? Was istCompositeWebControl
? Verwenden Sie so etwas:Eine der Ineffizienzen der ungarischen Notation bestand darin, dass durch immer größere Frameworks nicht nur ein zusätzlicher Nutzen, sondern auch eine höhere Komplexität für die Entwickler erzielt wurde, da sie nun mehr und mehr die nicht standardmäßigen Präfixe lernen mussten.
quelle
Aus meiner Sicht ist die ungarische Notation ein Trick, um ein ungenügend leistungsfähiges Typensystem zu umgehen. In Sprachen, in denen Sie Ihre eigenen Typen definieren können, ist es relativ einfach, einen neuen Typ zu erstellen, der das von Ihnen erwartete Verhalten codiert. In Joel Spolskys Schimpfen über die ungarische Notation gibt er ein Beispiel für die Erkennung möglicher XSS-Angriffe, indem er angibt, dass eine Variable oder Funktion entweder unsicher (wir) oder sicher (s) ist, die visuelle Prüfung jedoch weiterhin vom Programmierer abhängig ist. Wenn Sie stattdessen über ein erweiterbares Typsystem verfügen, können Sie einfach zwei neue Typen erstellen, UnsafeString und SafeString, und diese dann entsprechend verwenden. Als Bonus wird die Art der Kodierung:
Wenn Sie nicht auf die Interna von UnsafeString zugreifen oder andere Konvertierungsfunktionen verwenden, ist dies die einzige Möglichkeit, von einem UnsafeString zu einem SafeString zu gelangen. Wenn alle Ihre Ausgabefunktionen nur Instanzen von SafeString verwenden, ist es unmöglich, eine nicht maskierte Zeichenfolge auszugeben [Bloßstellen bei Konvertierungen wie StringToSafeString (someUnsafeString.ToString ())].
Es sollte offensichtlich sein, warum es dem Versuch überlegen ist, den Code von Hand oder in diesem Fall per Auge überprüfen zu lassen, dass das Typensystem die Integrität Ihres Codes überprüft.
In einer Sprache wie C sind Sie natürlich der Meinung, dass ein Int ein Int ein Int ist, und Sie können nicht viel dagegen tun. Man könnte immer mit Strukturen spielen, aber es ist fraglich, ob das eine Verbesserung ist oder nicht.
Was die andere Interpretation der ungarischen Notation anbelangt, so ist der IE, dem der Variablentyp vorangestellt wird, schlichtweg dumm und ermutigt zu faulen Praktiken wie dem Benennen von Variablen uivxwFoo anstelle von etwas Sinnvollem wie countOfPeople.
quelle
int[]
welcher frei modifiziert, aber niemals geteilt werdenint[]
darf " oder " welcher frei geteilt werden darf nur unter Dingen, die ihn niemals ändern werden"? Wenn einint[]
Feldfoo
die Werte einkapselt,{1,2,3}
kann man es einkapseln lassen,{2,2,3}
ohne zu wissen, welchen "Typ"int[]
es darstellt? Ich denke, Java und .NET wären viel besser gewesen, wenn sie - ohne die Unterstützung von Typsystemen - zumindest eine Namenskonvention zur Unterscheidung dieser Typen eingeführt hätten.Die ungarische Notation ist in einer statisch typisierten Sprache fast völlig unbrauchbar. Es ist eine grundlegende IDE-Funktion, um den Typ einer Variablen anzuzeigen, indem Sie mit der Maus darüber fahren oder auf andere Weise. Außerdem können Sie sehen, was der Typ ist, indem Sie ein paar Zeilen an der Stelle nachsehen, an der er deklariert wurde, wenn keine Typinferenz vorliegt. Der springende Punkt bei der Typinferenz ist, dass das Rauschen des Typs nicht überall wiederholt wird. Daher wird die ungarische Notation in Sprachen mit Typinferenz normalerweise als eine schlechte Sache angesehen.
In dynamisch getippten Sprachen kann es manchmal helfen, aber für mich fühlt es sich unidiomatisch an. Sie haben bereits aufgegeben, Ihre Funktionen auf exakte Domains / Codomains zu beschränken. Wenn alle Ihre Variablen in ungarischer Schreibweise benannt sind, geben Sie nur wieder, was Ihnen ein Typensystem gegeben hätte. Wie drückt man eine polymorphe Variable aus, die eine Ganzzahl oder eine Zeichenfolge in ungarischer Notation sein kann? "IntStringX"? "IntOrStringX"? Der einzige Ort, an dem ich jemals die ungarische Notation verwendet habe, war der Assembler-Code, weil ich versucht habe, das zurückzuholen, was ich mit einem Typensystem bekommen hätte, und es war das erste, was ich jemals codiert habe.
Egal, es ist mir egal, wie die Leute ihre Variablen nennen, der Code wird wahrscheinlich immer noch genauso unverständlich sein. Entwickler verschwenden viel zu viel Zeit mit Stil- und Variablennamen, und am Ende des Tages erhalten Sie immer noch eine Menge Bibliotheken mit völlig anderen Konventionen in Ihrer Sprache. Ich entwickle eine symbolische (dh nicht textbasierte) Sprache, in der es keine Variablennamen, nur eindeutige Bezeichner und vorgeschlagene Namen für Variablen gibt (aber die meisten Variablen haben noch keinen vorgeschlagenen Namen, da es für einfach keinen vernünftigen Namen gibt Sie); Wenn Sie nicht vertrauenswürdigen Code überwachen, können Sie sich nicht auf Variablennamen verlassen.
quelle
Wie in einem solchen Fall üblich, werde ich eine Antwort posten, bevor ich die Antworten anderer Teilnehmer lese.
Ich sehe drei "Bugs" in Ihrer Vision:
1) Wenn Sie den Typ einer Variablen / eines Parameters / eines Attributs / einer Spalte kennen möchten, können Sie mit der Maus darüber fahren oder darauf klicken, und es wird in der modernsten IDE angezeigt. Ich weiß nicht, welche Tools Sie verwenden, aber das letzte Mal, als ich gezwungen war, in einer Umgebung zu arbeiten, die diese Funktion nicht bot, war im 20. Jahrhundert COBOL, nein, Fortran und mein Chef Ich habe nicht verstanden, warum ich gegangen bin.
2 / Die Typen können sich während des Entwicklungszyklus ändern. Eine 32-Bit-Ganzzahl kann zu einem bestimmten Zeitpunkt eine 64-Bit-Ganzzahl werden, aus guten Gründen, die zu Beginn des Projekts nicht erkannt wurden. Das Umbenennen von intX in longX oder das Belassen eines Namens, der auf den falschen Typ verweist, ist schlechtes Karma.
3) Was Sie verlangen, ist tatsächlich eine Redundanz. Redundanz ist kein besonders gutes Entwurfsmuster oder keine Gewohnheit. Sogar Menschen zögern zu viel Redundanz. Sogar Menschen zögern zu viel Redundanz.
quelle
Ich glaube, dass es ein Symptom ist, dringend Ungarn zu brauchen .
Ein Symptom für zu viele globale Variablen ... oder dafür, dass Funktionen zu lang sind, um erreichbar zu sein .
Wenn Ihre Variablendefinition nicht in Sicht ist, haben Sie normalerweise Probleme.
Und wenn Ihre Funktionen keinen denkwürdigen Konventionen folgen , gibt es wieder große Probleme.
Das ist ... so ziemlich der Grund, warum es an vielen Arbeitsplätzen ausgeblendet wird, nehme ich an.
Es entstand aus Sprachen , die es brauchten .
Zu Zeiten globaler Variablen bonanza . (aus Mangel an Alternativen)
Es hat uns gut gedient.
Die einzige wirkliche Verwendung wir es heute haben , ist der Joel Spolsky ein .
Verfolgung bestimmter Attribute der Variablen, z. B. ihrer Sicherheit .
( zB "Hat die Variable
safeFoobar
grünes Licht, um in eine SQL-Abfrage eingespeist zu werden?- Wie es heißt
safe
, ja")In einigen anderen Antworten ging es um Editorfunktionen, mit deren Hilfe Sie den Typ einer Variablen beim Bewegen der Maus erkennen konnten. Meiner Meinung nach sind auch diese problematisch für die Code-Sicherheit . Ich glaube, sie waren nur für das Refactoring gedacht , ebenso wie viele andere Funktionen (wie das Falten von Funktionen) und sollten nicht für neuen Code verwendet werden.
quelle
Ich denke, die Gründe für die Nichtverwendung der ungarischen Schreibweise wurden von anderen Plakaten gut abgedeckt. Ich stimme ihren Kommentaren zu.
Bei Datenbanken verwende ich die ungarische Notation für DDL-Objekte, die nur selten in Code verwendet werden, ansonsten aber in Namespaces kollidieren würden. Dies ist hauptsächlich darauf zurückzuführen, dass Indizes und benannte Einschränkungen mit ihrem Typ vorangestellt werden (PK, UK, FK und IN). Verwenden Sie eine konsistente Methode, um diese Objekte zu benennen, und Sie sollten in der Lage sein, einige Überprüfungen durchzuführen, indem Sie die Metadaten abfragen.
quelle
TABLE SomeStringById(int somestringId, varchar somestring)
den Index drauf habe wäre das auch logischSomeStringById
aber das verursacht eine Kollision. Also nenne ich esidx_SomeStringById
. Um dem Beispiel zu folgen, mache ich esidx_SomeStringByValue
nur, weil es dumm ist, dasidx_
eine und nicht das andere zu haben.Der Grund, warum dies vermieden wird, ist, dass Systeme in Ungarn gegen DRY verstoßen (das Präfix ist genau der Typ, den der Compiler und (eine gute) IDE ableiten können).
Apps ungarischen OTOH Präfixe mit der Verwendung der Variablen (dh scrxMouse ist Axtkoordinate auf dem Bildschirm Dies kann ein Int, Short, Long oder sogar ein benutzerdefinierter Typ sein (Typedefs können Sie sogar leicht ändern))
das missverständnis von systemen ist das, was ungarisch als best practice zerstört
quelle
Nehmen wir an, wir haben eine Methode wie die folgende (in C #):
Nun nennen wir es im Code so:
Das Int sagt uns nicht viel. Die bloße Tatsache, dass etwas ein Int ist, sagt uns nicht, was darin enthalten ist. Nehmen wir stattdessen an, wir nennen es so:
Jetzt können wir sehen, was der Zweck der Variablen ist. Würde es etwas ausmachen, wenn wir wissen, dass es ein Int ist?
Der ursprüngliche Zweck von Ungarisch war jedoch, dass Sie so etwas tun:
Dies ist in Ordnung, solange Sie wissen, wofür c steht. Aber Sie müssten eine Standardtabelle mit Präfixen haben, und jeder müsste sie kennen, und alle neuen Leute müssten sie lernen, um Ihren Code zu verstehen. Während
customerCount
odercountOfCustomers
ist auf den ersten Blick ziemlich offensichtlich.Ungarisch hatte in VB zuvor einen bestimmten Zweck
Option Strict On
, da in VB6 und früheren Versionen (und in VB .NET mitOption Strict Off
) VB Typen erzwingen würde. Sie können dies also tun:Das ist schlecht, aber der Compiler würde es Ihnen nicht sagen. Wenn Sie also Ungarisch verwenden, haben Sie zumindest einen Hinweis darauf, was passiert ist:
In .NET ist dies bei statischer Typisierung nicht erforderlich. Und Ungarisch wurde zu oft als Ersatz für eine gute Benennung verwendet. Vergessen Sie Ungarisch und wählen Sie stattdessen gute Namen.
quelle
Ich habe viele gute Argumente dagegen gefunden, aber eines habe ich nicht gesehen: Ergonomie.
In früheren Zeiten, als Sie nur string, int, bool und float hatten, hätten die Zeichen sibf ausgereicht. Aber mit string + short fangen die Probleme an. Verwenden Sie den ganzen Namen für das Präfix oder str_name für string? (Während Namen fast immer Zeichenfolgen sind - oder?) Was ist mit einer Street-Klasse? Die Namen werden immer länger, und selbst wenn Sie CamelCase verwenden, ist es schwer zu sagen, wo das Typpräfix endet und wo der Variablenname beginnt.
Okay - Sie können Unterstriche verwenden, wenn Sie sie noch nicht für etwas anderes verwenden, oder CamelCase, wenn Sie so lange Unterstriche verwendet haben:
Es ist ungeheuerlich und wenn du es konsequent tust, wirst du haben
Entweder werden Sie unbrauchbare Präfixe für triviale Fälle verwenden, wie z. B. Schleifenvariablen oder
count
. Wann haben Sie kürzlich einen Short oder einen Long für einen Counter verwendet? Wenn Sie Ausnahmen machen, verlieren Sie oft Zeit und überlegen, ob Sie ein Präfix benötigen oder nicht.Wenn Sie viele Variablen haben, werden diese normalerweise in einem Objektbrowser gruppiert, der Teil Ihrer IDE ist. Wenn nun 40% mit i_ für int und 40% mit s_ für string beginnen und sie alphabetisch sortiert sind, ist es schwierig, den signifikanten Teil des Namens zu finden.
quelle
Der einzige Ort, an dem ich immer noch regelmäßig entweder ungarische oder analoge Suffixe verwende, ist in Kontexten, in denen dieselben semantischen Daten in zwei verschiedenen Formen vorliegen, wie z. B. Datenkonvertierung. Dies kann in Fällen der Fall sein, in denen mehrere Maßeinheiten vorhanden sind oder in denen mehrere Formen vorhanden sind (z. B. Zeichenfolge "123" und Ganzzahl 123).
Ich finde die Gründe, die hier angeführt wurden, nicht zwingend, um anderen kein Ungarisch aufzuzwingen , sondern nur als Andeutung, um über Ihre eigene Praxis zu entscheiden.
Der Quellcode eines Programms ist eine eigene Benutzerschnittstelle - dem Betreuer werden Algorithmen und Metadaten angezeigt - und Redundanz in Benutzerschnittstellen ist eine Tugend, keine Sünde . Sehen Sie sich zum Beispiel die Bilder in " Das Design alltäglicher Dinge " an und schauen Sie sich die Türen mit der Aufschrift "Push" an, die so aussehen, als würden Sie sie ziehen, und die Bierzapfstellen, die die Bediener an den wichtigen Kernreaktorsteuerungen gehackt haben, weil sie irgendwie "herumschwebten" sie in der IDE "war nicht gut genug.
Das "Just Hover in a IDE" ist kein Grund, Ungarisch nicht zu verwenden - nur ein Grund, warum manche Leute es möglicherweise nicht nützlich finden. Ihr Kilometerstand kann abweichen.
Die Idee, dass Ungarisch beim Wechsel der Variablentypen einen erheblichen Wartungsaufwand verursacht, ist albern - wie oft wechseln Sie die Variablentypen? Außerdem ist das Umbenennen von Variablen ganz einfach:
Wenn Ungarisch Ihnen wirklich hilft, schnell einen Code zu finden und ihn zuverlässig zu pflegen, verwenden Sie ihn. Wenn nicht, dann nicht. Wenn andere Ihnen sagen, dass Sie sich in Bezug auf Ihre eigenen Erfahrungen geirrt haben, würde ich vorschlagen, dass sie wahrscheinlich diejenigen sind, die im Irrtum sind.
quelle