Je démarre un projet de groupe scolaire à Java, en utilisant Swing. Il s'agit d'une interface graphique simple sur l'application de bureau de base de données.
Le professeur nous a donné le code du projet de l'année dernière afin que nous puissions voir comment il fait les choses. Mon impression initiale est que le code est beaucoup plus compliqué qu'il ne devrait l'être, mais j'imagine que les programmeurs pensent souvent cela en regardant du code qu'ils n'ont pas simplement écrit.
J'espère trouver des raisons pour lesquelles son système est bon ou mauvais. (J'ai demandé au professeur et il m'a dit que je verrais plus tard pourquoi c'est mieux, ce qui ne me satisfait pas.)
Fondamentalement, pour éviter tout couplage entre ses objets persistants, ses modèles (logique métier) et ses vues, tout se fait avec des chaînes. Les objets persistants qui sont stockés dans la base de données sont des tables de hachage de chaînes, et les modèles et les vues "s'abonnent" les uns aux autres, fournissant des clés de chaîne pour les "événements" auxquels ils s'abonnent.
Lorsqu'un événement est déclenché, la vue ou le modèle envoie une chaîne à tous ses abonnés qui décident quoi faire pour cet événement. Par exemple, dans l'une des méthodes d'écoute d'action des vues (je crois que cela définit simplement le BicycleMakeField sur l'objet persistant):
else if(evt.getSource() == bicycleMakeField)
{
myRegistry.updateSubscribers("BicycleMake", bicycleMakeField.getText());
}
Cet appel arrive finalement à cette méthode dans le modèle de véhicule:
public void stateChangeRequest(String key, Object value) {
... bunch of else ifs ...
else
if (key.equals("BicycleMake") == true)
{
... do stuff ...
Le professeur dit que cette façon de faire est plus extensible et plus facile à entretenir que le simple fait que la vue appelle une méthode sur un objet logique métier. Il dit qu'il n'y a pas de couplage entre les points de vue et les modèles parce qu'ils ne connaissent pas l'existence les uns des autres.
Je pense que c'est un pire type de couplage, car la vue et le modèle doivent utiliser les mêmes chaînes pour fonctionner. Si vous supprimez une vue ou un modèle ou effectuez une faute de frappe dans une chaîne, vous n'obtenez aucune erreur de compilation. Cela rend également le code beaucoup plus long que je ne le pense.
Je veux en discuter avec lui, mais il utilise son expérience de l'industrie pour contrer tout argument que moi, l'étudiant inexpérimenté, pourrais faire. Y a-t-il un avantage à son approche qui me manque?
Pour clarifier, je veux comparer l'approche ci-dessus, avec le fait que la vue soit évidemment couplée au modèle. Par exemple, vous pouvez passer l'objet de modèle de véhicule à la vue, puis pour modifier la "marque" du véhicule, procédez comme suit:
vehicle.make = bicycleMakeField.getText();
Cela réduirait 15 lignes de code actuellement utilisées UNIQUEMENT pour définir la marque du véhicule en un seul endroit, en une seule ligne de code lisible. (Et puisque ce type d'opération est effectué des centaines de fois dans l'application, je pense que ce serait une grande victoire pour la lisibilité et la sécurité.)
Mise à jour
Mon chef d'équipe et moi avons restructuré le cadre de la façon dont nous voulions le faire en utilisant la frappe statique, en avons informé le professeur et nous avons fini par lui faire une démonstration. Il est assez généreux pour nous permettre d'utiliser notre framework tant que nous ne lui demandons pas d'aide, et si nous pouvons tenir le reste de notre équipe au courant - ce qui nous semble juste.