Auf deine erste Frage "Wie würdest du das machen?" - eine kurze Antwort würde ich nicht geben. Ich habe nicht genug Parser / Compiler-Theorie, um das durchzuziehen. Aber ich programmiere seit 25 Jahren, also habe ich einige Ideen und Meinungen, die ich teilen kann.
Zunächst würde ich versuchen, einen OOP-Ansatz zu finden, mit dem Sie wirklich verbundene Modelle erstellen können. Was ich damit meine ist, dass Modelle eines der wichtigsten Dinge in fast jeder Art von Programmierprojekt sind - es ist immer viel Grunzarbeit und kontinuierliches Refactoring, um es richtig zu machen, und ich tadele dies an einem Mangel an echter Konnektivität in OO Sprachen.
Erlaube mir zu demonstrieren. Angenommen, ein Klassenhaus hat eine Door-Eigenschaft.
var door = house.Door;
Sie haben jetzt eine lokale Variable mit einem Verweis auf die Door-Instanz.
Aber bedenken Sie, was gerade passiert ist: Sie haben gerade die Tür vom Haus gerissen, und jetzt sind Sie ziemlich glücklich, die Tür herumgereicht zu haben, und der Rest Ihres Codes weiß nicht, dass diese Tür tatsächlich mit einem Haus verbunden ist.
Für mich ist das grundsätzlich falsch.
Und ja, ich weiß, dies kann "leicht" von Fall zu Fall behoben werden - in diesem Fall durch Beibehalten eines umgekehrten Verweises von jeder Tür zu dem Haus, an dem es gegenwärtig angebracht ist. Hierdurch wird Ihr Modell natürlich fehleranfällig, da Sie nun zwei umgekehrte Verweise genau pflegen müssen, sodass Sie die Eigenschaften House.Doors und Door.House als privat kennzeichnen und Methoden wie House.AddDoor (), House.RemoveDoor () hinzufügen. ), Door.SetHouse () usw. und verdrahten Sie alles und testen Sie die Einheit, um sicherzustellen, dass es tatsächlich funktioniert.
Klingt das nicht nach viel Arbeit, um eine so direkte Beziehung zu modellieren? Viel Code zu pflegen? Eine Menge Code, der umgestaltet werden muss, während sich das Modell weiterentwickelt?
Das Problem sind Zeiger. Jede OO-Sprache, die ich gesehen habe, leidet von Natur aus unter der Tatsache, dass eine Objektreferenz wirklich ein Zeiger ist, denn das ist, was Computer verwenden.
Zeiger sind kein guter Weg, um die reale Welt zu modellieren. Unabhängig davon, welche Welt Sie modellieren möchten, ist fast garantiert, dass alle Beziehungen in dieser Welt wechselseitige Beziehungen sind. Zeiger zeigen nur in eine Richtung.
Ich würde gerne eine Sprache sehen, in der das grundlegende Datenmodell ein Diagramm ist - wobei alle Beziehungen standardmäßig zwei Enden haben. Dies würde mit ziemlicher Sicherheit eine viel natürlichere Möglichkeit bieten, die reale Welt zu modellieren. Dies ist das einzige, wofür wir überhaupt Computer benötigen. (das und Videospiele.)
Ich habe keine Ahnung, wie die Syntax für eine solche Sprache aussehen würde oder ob sie sich überhaupt mit Text ausdrücken lässt. (Ich habe mich gefragt, ob eine solche Sprache irgendwie grafisch sein müsste ...)
Ich möchte auch, dass alle Formen des zufälligen Zustands beseitigt werden.
Zum Beispiel verbringen wir in der Webentwicklung viel Zeit damit, Daten aus Datenbanken in Geschäftsmodelle, in Darstellungsmodelle umzuwandeln ... dann werden einige dieser Daten in Formularen dargestellt, was wirklich nur eine weitere Transformation darstellt. .. und state kommt von Form-Posts zurück, und dann formen wir diese Daten um und projizieren sie zurück auf das Ansichtsmodell, z. B. Ansichtsmodellbinder und so weiter. Wir projizieren dann vom Ansichtsmodell zurück auf das Geschäftsmodell. model ... Wir verwenden dann objektrelationale Mapper (oder Grunts), um die Daten aus dem Ansichtsmodell zu transformieren und in eine relationale Datenbank zu projizieren ...
Fängt das an, redundant zu klingen? Zu welchem Zeitpunkt haben wir während dieses ganzen Wahnsinns wirklich etwas Nützliches erreicht? Und mit nützlich meine ich etwas Greifbares - etwas, das der Endbenutzer verstehen und sich darum kümmern kann. Letztendlich sind die Stunden, die Sie damit verbracht haben, etwas zu erstellen, das die Benutzer überhaupt verstehen können, wirklich die einzigen Stunden, die Sie gut ausgegeben haben. Alles andere sind Nebenwirkungen.
Ich möchte eine sehr dynamische Sprache. Der Schreib- / Kompilier- / Ausführungszyklus ist eine mühsame Zeitverschwendung. Im Idealfall sollte die Sprache nur herausfinden, was sich geändert hat, und bei Bedarf transparent im Hintergrund kompilieren / laden.
Im Idealfall sollten Sie nicht einmal auf "Ausführen" klicken müssen - Dinge sollten auf dem Bildschirm geschehen, während Sie Änderungen vornehmen, die Ihre Änderungen sofort widerspiegeln. Das Problem mit dem Write / Compile / Run-Zyklus oder sogar mit dem direkteren Write / Run-Zyklus ist, dass Sie zu weit von dem entfernt sind, was Sie tun - um sich mit unserer Arbeit verbunden zu fühlen brauche sofortiges Feedback, sofortige Ergebnisse. Das Warten ist zu lang!
Wiederum weiß ich nicht einmal, ob dies mit einer traditionellen IDE erreicht werden könnte oder ob dies eine völlig neue Art von Schnittstelle erfordern würde.
Sie sollten in der Lage sein, eine Mischung aus schwacher und starker Eingabe zu verwenden, je nachdem, was für das Problem, an dem Sie arbeiten, am besten geeignet ist.
Der Status im Allgemeinen sollte etwas sein, das die Sprache für Sie vollständig beherrscht. Warum sollten Sie sich aus Gründen der Persistenz auf eine Datenbank verlassen müssen? Im Idealfall möchte ich einfach die Lebensdauer einer Variablen im Modell angeben können: eine Webanforderung, eine Sitzung, 24 Stunden, permanent.
Warum müssen wir uns zwischen einer ganzen Reihe von Speicherlösungen für unterschiedliche Medien und Laufzeiten entscheiden? - ganz zu schweigen von der Anpassung und Formung der Daten an die jeweiligen Medien; Browser-Cache, Datenbank, Speicher, Festplatte, wen interessiert das? Daten sind Daten. Wo Sie Ihre Daten speichern (und wie lange), sollte eine einfache Entscheidung sein, kein Kampf gegen die Götter!
Nun, viel Glück damit.