J'ai une question sur la meilleure façon d'exposer une interface distante asynchrone.Affichage d'une interface distante ou d'un modèle d'objet
Les conditions sont les suivantes:
- Le protocole est asynchrone
- un tiers peut modifier les données à tout moment
- La commande aller-retour peut être importante
- Le modèle devrait convient bien pour l'interaction de l'interface utilisateur
- Le protocole prend en charge les requêtes sur certains objets, tout comme le modèle.
Afin d'améliorer mon manque de compétences dans ce domaine (et de rafraîchir mon Java en général), j'ai démarré un project pour créer un frontal basé sur Eclipse pour xmms2 (décrit ci-dessous).
Donc, la question est; comment dois-je exposer l'interface distante comme un modèle de données soigné (dans ce cas, la gestion des pistes et la gestion des événements)?
Je me félicite tout de discussions génériques à motif name-dropping ou des exemples concrets et patches :)
Mon objectif principal ici est l'apprentissage de cette classe de problèmes en général. Si mon projet peut en tirer profit, c'est bien, mais je le présente strictement pour avoir quelque chose pour lancer une discussion. J'ai implémenté une abstraction de protocole que j'appelle 'client' (pour des raisons héritées) qui me permet d'accéder aux fonctionnalités les plus exposées en utilisant des appels de méthodes dont je suis content même si c'est loin d'être parfait. Les fonctionnalités fournies par le démon xmms2 sont la recherche de pistes, la récupération et la manipulation de métadonnées, la modification de l'état de la lecture, le chargement de listes de lecture et ainsi de suite.
Je suis en train de mettre à jour la dernière version stable de xmms2, et j'ai pensé que je pourrais aussi bien corriger certaines des faiblesses flagrantes de mon implémentation actuelle.
Mon plan est de construire une meilleure abstraction au-dessus de l'interface de protocole, une qui permet une interaction plus naturelle avec le démon. L'implémentation actuelle de 'model' est difficile à utiliser et franchement assez moche (pour ne pas mentionner le code UI qui est vraiment horrible atm).
Aujourd'hui, j'ai l'interface Tracks que je peux utiliser pour obtenir des instances de classes Track en fonction de leur identifiant. La recherche est effectuée via l'interface Collections (malheureux conflit d'espace de noms) que je préfère passer à Tracks, je pense.
Toutes les données peuvent être modifiées par un tiers à tout moment, et cela devrait être dûment prises en compte dans le modèle et changement des notifications distribuées
Ces interfaces sont exposées lors de la connexion, en retournant une hiérarchie d'objets qui ressemble ceci:
- connexion
- lecture getPlayback()
- Play, pause, saut, piste en cours etc
- Expose état lecture change
- Tracks getTracks()
- piste getTrack (id) etc
- Expose les mises à jour de piste
- Collections getCollection()
- Charger et manipuler des listes de lecture ou nommées collections
- Recherche médiathèque
- Expose les mises à jour de collecte
- lecture getPlayback()