A votre première question, "comment le feriez-vous" - réponse courte, je ne le ferais pas. Je n'ai pas assez de théorie de l'analyseur / compilateur pour retirer cela. Mais je programme depuis 25 ans et j’ai donc quelques idées et opinions à partager.
Tout d’abord, j’essayerais de proposer une approche POO permettant de créer des modèles vraiment connectés. Ce que je veux dire par là, c’est que les modèles sont l’un des éléments les plus importants dans presque tous les types de projets de programmation - il faut toujours beaucoup de travail ingrat et de refactorisation continue Langues OO.
Permettez-moi de démontrer. Disons qu'une maison de classe a une propriété Door.
var door = house.Door;
Vous avez maintenant une variable locale avec une référence à l'instance Door.
Mais considérez ce qui vient de se passer: vous venez de déchirer la porte de la maison, et maintenant vous êtes plutôt heureux de la faire passer, et le reste de votre code ignore que cette porte est en fait attachée à une maison.
Pour moi, c'est fondamentalement faux.
Et oui, je sais, cela est "facilement" résolu au cas par cas - en maintenant une référence inverse de chaque porte vers la maison à laquelle elle est actuellement rattachée. Ceci ouvre évidemment votre modèle aux erreurs, puisqu'il est maintenant de votre devoir de maintenir avec précision deux références inverses, de sorte que vous rendez les propriétés House.Doors et Door.House privées et que vous ajoutez des méthodes telles que House.AddDoor (), House.RemoveDoor ( ), Door.SetHouse () etc., connectez le tout et testez-le à l'unité pour vous assurer qu'il fonctionne réellement.
N'est-ce pas commencer à ressembler à beaucoup de travail pour modéliser une relation aussi simple? Beaucoup de code à maintenir? Beaucoup de code à refactoriser à mesure que le modèle évolue?
Le problème est des pointeurs. Tous les langages OO que j'ai vus souffrent intrinsèquement du fait qu'une référence d'objet est en réalité un pointeur, car c'est ce que les ordinateurs utilisent.
Les pointeurs ne sont pas un bon moyen de modéliser le monde réel. Quel que soit le monde que vous essayez de modéliser, il est presque garanti que toutes les relations dans ce monde seront des relations à double sens. Les pointeurs pointent dans une seule direction.
J'aimerais voir un langage où le modèle de données fondamental est un graphe - où toutes les relations, par défaut, ont deux extrémités. Cela offrirait presque certainement un ajustement beaucoup plus naturel pour modéliser le monde réel, ce qui est vraiment la seule chose pour laquelle nous avons besoin d’ordinateurs au départ. (ça et les jeux vidéo.)
Je ne sais pas du tout à quoi ressemblerait la syntaxe d'un tel langage, ni même si elle pouvait même être exprimée en texte. (Je me suis demandé si un tel langage devrait être graphique, en quelque sorte ...)
J'aimerais aussi voir éliminer toutes les formes d'état accidentel.
Par exemple, dans le développement Web, nous passons beaucoup de temps à façonner des données à partir de bases de données, dans des modèles commerciaux, des modèles de vues pour présentation ... certaines de ces données sont ensuite présentées sur des formulaires, ce qui n’est en réalité qu’une autre transformation. .. et state proviennent des formulaires, puis nous remodelons ces données et les projetons sur le modèle de vue, par exemple, des classeurs de modèle de vue, etc., puis nous projetons à partir du modèle de vue sur l'entreprise. model ... nous utilisons ensuite des mappeurs relationnels-objets (ou grunt work) pour transformer les données du modèle-vue et les projeter sur une base de données relationnelle ...
Est-ce que cela commence à paraître redondant? À quel moment pendant toute cette folie avons-nous vraiment accompli quelque chose d'utile? Et par utile, je veux dire quelque chose de concret - quelque chose que l’utilisateur final peut comprendre et se préoccuper. À la fin de la journée, les heures que vous avez réellement consacrées à la création de quelque chose que les utilisateurs peuvent même comprendre sont réellement les seules heures bien dépensées. Tout le reste est des effets secondaires.
Je voudrais un langage très dynamique. Le cycle écriture / compilation / exécution est une perte de temps fastidieuse. Idéalement, le langage devrait simplement comprendre ce qui a changé et compiler / charger de manière transparente en arrière-plan, selon les besoins.
Idéalement, vous ne devriez même pas avoir à appuyer sur "Exécuter" - les choses doivent apparaître à l'écran, lorsque vous apportez des modifications, reflétant immédiatement les modifications que vous apportez. Le problème du cycle écriture / compilation / exécution, ou même du cycle écriture / exécution plus direct, est que vous êtes trop déconnecté de ce que vous faites. Pour vous sentir connecté à notre travail, nous besoin d'un retour immédiat, de résultats instantanés. Toute attente est trop longue!
Encore une fois, je ne sais même pas si cela pourrait être réalisé avec un IDE traditionnel ou si cela nécessiterait un tout nouveau type d'interface.
Vous devriez pouvoir utiliser un mélange de frappe faible et forte, ce qui convient le mieux au problème sur lequel vous travaillez.
L'état en général devrait être quelque chose que la langue gère entièrement pour vous. Pourquoi devriez-vous avoir besoin d'une base de données pour la persistance? Idéalement, j'aimerais pouvoir spécifier simplement la durée de vie de toute variable du modèle: une requête Web, une session, 24 heures sur 24, en permanence.
Pourquoi devons-nous choisir entre toute une gamme de solutions de stockage pour différents supports et conditions de vie? - sans parler de la transformation et de la mise en forme des données pour s'adapter à chaque média; cache du navigateur, base de données, mémoire, disque, peu importe! Les données sont des données. Où stocker vos données (et pendant combien de temps) devrait être un choix simple, pas une bataille contre les dieux!
Eh bien, bonne chance avec ça.