Ich habe schon oft im Internet gelesen, dass Sie dies tun sollten, wenn Ihre Sprache bestimmte Konzepte wie Objektorientierung oder Funktionsaufrufe nicht unterstützt.
Das einzige Problem, das ich jetzt sehe, ist, dass andere Programmierer Ihren Code möglicherweise zu unterschiedlich finden als sonst, was das Programmieren für sie schwierig macht. Welche anderen Probleme könnten sich Ihrer Meinung nach daraus ergeben?
programming-languages
concepts
idioms
Julio Rodrigues
quelle
quelle
Antworten:
Eines der Probleme besteht darin, dass Sie möglicherweise viel Code schreiben, um etwas so auszudrücken, wie Sie es in einer anderen Sprache tun, während die Sprache, die Sie verwenden, einfacher ist.
Zum Beispiel, in einer Antwort auf Stack - Überlauf , habe ich erklärt , wie Code Verträge, Konzept in .NET Framework verwendet wird , können teilweise in PHP emuliert werden , die sie nicht unterstützt. Ich habe viel Code für nichts geschrieben, da das gleiche mit einfachen Arrays möglich war.
Im Allgemeinen hat jede Sprache ihre eigene Kultur, ihre eigenen Best Practices und ihren eigenen Stil.
Wenn ich anfange, C # -Code zu schreiben, als wäre es C, wäre es hässlich.
Wenn ich Haskell als Java-Entwickler verstehe, der gezwungen war, Haskell zu verwenden, aber seine Stärken nicht verstehen und nur die Konzepte von Java klonen möchte, leidet der Code, den ich schreiben würde.
etc.
Es ist nichts Falsches daran, die Sprache zu verbessern (zum Beispiel C # durch die Einführung von Maßeinheiten wie in F # zu verbessern ), aber wenn Sie zu viel tun, sollten Sie vielleicht eine andere Sprache wählen, die tatsächlich Ihren Bedürfnissen entspricht.
quelle
Die Abnahme der Lesbarkeit ist an sich schon ein Problem: Sie verringert drastisch den Personenkreis, der Ihr Projekt möglicherweise ohne eine umfassende Schulung von Ihnen warten könnte.
Zusätzlich,
quelle
Es ist keine so gute Idee, wie sie auf dem Papier erscheint.
Beispiel 1: Wenn Sie alt genug sind, können Sie sich an die Tage erinnern, als C das neue Kind in der Stadt war. Pascal- und Ada-Programmierer mochten Cs enge Klammern zum Öffnen und Schließen nicht. Sie definieren
begin
undend
öffnen Klammer und schließen Klammer, und voila! CAda! Das unglückliche Ergebnis war aus der Sicht von Ada oder C hässlich.Beispiel 2, persönlich: Eines der Dinge, die ich am Common Lisp Object System wirklich mochte, ist, dass es vor, nach und um Methoden geht. Sie können also an mehreren Stellen sehr nützlich sein. Deshalb habe ich dieses Konzept in C ++ an einigen ausgewählten Stellen emuliert. Die einzige Möglichkeit, diese Konstrukte in C ++ zu emulieren, besteht darin, dass der Entwickler einer abgeleiteten Klasse die gleichnamige Methode der übergeordneten Klasse an der richtigen Stelle im Code aufruft. Dies stellte eine Anforderung an Entwickler, die aus meinen Klassen stammten, die der C ++ - Programmierung ein wenig fremd waren, und möglicherweise gegen den Strich der C ++ - Programmierung. Unabhängig davon, wie gut diese Anforderung dokumentiert war, haben die Benutzer die Richtlinien einfach nicht befolgt, da sie nicht ganz dem C ++ - Paradigma entsprachen.
quelle
Undichte Abstraktionen.
quelle
out
Parameter in einem Framework zu emulieren , das sie nicht wirklich unterstützt. C # geht davon aus, dass jede Funktion immer in alleout
Parameter schreibt , aber Nicht-C # -Methoden, die von C # -Methoden aufgerufen werden, bieten keine solche Garantie.Es kann unerschwinglich schwierig sein. Stellen Sie sich vor, Sie möchten LINQ von C # in Ihre Java-Anwendung implementieren. Oder wie wäre es einfach, einer Sprache lexikalische Closures hinzuzufügen? Sie müssten so ziemlich einen neuen Compiler schreiben, der Ihnen so ziemlich eine neue Sprache gibt.
In Fällen, in denen Sie keine eigene Sprache implementieren müssen, können Sie sich auch vorstellen, Sammlungsmethoden mit Funktionen höherer Ordnung (z. B. map) in einer Sprache zu implementieren, die keine Codeblöcke oder Lambda-Funktionen oder Abschlüsse oder Funktionen als Erstes enthält Klassenobjekte. Jede Funktion höherer Ordnung muss als Schnittstelle deklariert und explizit implementiert werden, und jeder Zustand, der in einem Closure erfasst worden wäre, muss explizit in der implementierenden Klasse gespeichert werden. Es ist so viel mehr Tippen und so viel schwerer zu lesen, dass es sich oft nicht lohnt.
quelle