Mir wurde die Aufgabe übertragen, eine domänenspezifische Sprache für ein Tool zu implementieren, das für das Unternehmen sehr wichtig werden kann. Die Sprache ist einfach, aber nicht trivial, sie erlaubt bereits geschachtelte Schleifen, Verkettung von Zeichenfolgen usw. und es ist praktisch sicher, dass andere Konstrukte hinzugefügt werden, wenn das Projekt voranschreitet.
Ich weiß aus Erfahrung, dass das Schreiben eines Lexers / Parsers von Hand - es sei denn, die Grammatik ist trivial - ein zeitaufwendiger und fehleranfälliger Prozess ist. Ich hatte also zwei Möglichkeiten: einen Parser-Generator à la Yacc oder eine Combinator-Bibliothek wie Parsec. Ersteres war auch gut, aber ich habe mich aus verschiedenen Gründen für Letzteres entschieden und die Lösung in einer funktionalen Sprache implementiert.
Das Ergebnis ist für mich ziemlich spektakulär, der Code ist sehr präzise, elegant und lesbar / fließend. Ich gebe zu, es mag etwas seltsam aussehen, wenn Sie nie etwas anderes als java / c # programmiert haben, aber das würde für alles gelten, was nicht in java / c # geschrieben ist.
Irgendwann wurde ich jedoch buchstäblich von einem Mitarbeiter angegriffen. Nach einem kurzen Blick auf meinen Bildschirm erklärte er, dass der Code unverständlich ist und dass ich das Parsen nicht neu erfinden sollte, sondern nur einen Stack und String.Split verwenden sollte, wie es jeder tut. Er machte viel Lärm, und ich konnte ihn nicht überzeugen, zum Teil, weil ich überrascht war und keine klare Erklärung hatte, zum Teil, weil seine Meinung unveränderlich war (kein Wortspiel beabsichtigt). Ich bot ihm sogar an, ihm die Sprache zu erklären, aber ohne Erfolg.
Ich bin mir sicher, dass die Diskussion vor dem Management wieder auftauchen wird, also bereite ich einige solide Argumente vor.
Dies sind die ersten Gründe, die mir einfallen, um eine auf String.Split basierende Lösung zu vermeiden:
- Sie brauchen eine Menge Wenns, um Sonderfälle zu bewältigen, und die Dinge geraten schnell außer Kontrolle
- Viele fest codierte Array-Indizes machen die Wartung schmerzhaft
- extrem schwer zu handhabende Dinge wie ein Funktionsaufruf als Methodenargument (zB add ((add a, b), c)
- Sehr schwierig, bei Syntaxfehlern aussagekräftige Fehlermeldungen zu liefern (sehr wahrscheinlich)
- Ich bin alle der Einfachheit, Klarheit und Vermeidung unnötiger intelligenter und kryptischer Dinge verpflichtet, aber ich bin auch der Meinung, dass es ein Fehler ist, jeden Teil der Codebasis so zu dumm zu machen, dass selbst ein Burgerflipper dies verstehen kann. Es ist das gleiche Argument, das ich höre, wenn ich keine Schnittstellen benutze, keine Trennung von Bedenken vornehme, keinen Code kopiert oder einfügt. Schließlich ist ein Minimum an technischer Kompetenz und Lernbereitschaft erforderlich, um an einem Softwareprojekt zu arbeiten. (Ich werde dieses Argument nicht verwenden, da es wahrscheinlich anstößig klingen wird und der Beginn eines Krieges niemandem helfen wird.)
Was sind Ihre Lieblingsargumente gegen das Parsen nach Cthulhu ? *
* Natürlich, wenn Sie mich überzeugen können, dass er Recht hat, werde ich auch vollkommen glücklich sein