Nascondere l'utilizzo della framework di implementazione in un'API

0

Sto attualmente cercando di creare un'API per un framework UI, per una nuova applicazione. Questo framework UI è implementato internamente usando un framework esistente, diciamo JavaFX. Voglio nascondere i dettagli dell'implementazione all'utente (lo sviluppatore che utilizza l'API), quindi ad esempio, quando l'utente indirizza un'immagine, voglio che lui / lei usi la mia interfaccia, chiamiamola ImageResource . In questo modo le specifiche di JavaFX non sono esposte all'utente, e mi rimane la libertà di modificare il framework dell'interfaccia utente nella mia implementazione in un momento successivo, o semplicemente di creare una nuova implementazione dell'API in cui viene utilizzato un framework diverso .

L'utente dovrebbe caricare una risorsa immagine tramite un caricatore di risorse, che fa parte dell'API. La risorsa caricata potrebbe quindi essere passata a diverse funzioni o contenitori, che quindi lavorerebbero sull'immagine, sia visualizzandola o elaborandola.

// Load a resource using a resource id, which would probably be a file name or url.
ImageResource resource = resourceLoader.loadImage("some/image/id");
// Add the image to some container, which would then have the image displayed. The container
// is also of an API interface type.
someContainer.addImageResource(resource);

Il problema è che l'utente gestisce le istanze ImageResource e le passa ad altre funzioni API che dovrebbero quindi visualizzare l'immagine o in qualsiasi altro modo lavorare con l'immagine. Quindi internamente il framework dovrebbe prendere un'istanza di ImageResource e fare qualcosa di significativo con l'immagine. Dal momento che non voglio esporre il javafx.scene.image.Image attraverso l'interfaccia e non voglio fare un controllo instanceof . Trovo che il controllo instanceof sia brutto e davvero distruttivo per l'intero pensiero di dividere l'API in interfacce più piccole.

Ma come faccio a estrarre l'immagine interna dall'interfaccia, finora ho considerato:

  • Aggiunta di un metodo all'interfaccia che restituisce un'istanza di javafx.scene.image.Image , che mi fornisce tutto ciò di cui avevo bisogno, ma al costo di bloccare l'API per le specifiche di JavaFX, che speravo davvero di evitare.
  • Lasciando il ImageResource in possesso di una chiave, ad esempio un identificatore di stringa di un'immagine, e quindi in qualche classe di modello interno cenral, avere una mappa che ha tradotto l'id della stringa in un'immagine. Questo potrebbe potenzialmente essere usato per aggiungere un po ', possibilità di liberare memoria dalle immagini usate di rado. Allo stesso tempo, però, renderebbe complicata la pulizia della mappa. Quando un ImageResource viene raccolto dal garbage collector, perderebbe un riferimento all'immagine JavaFX se lo mantenesse internamente, ma come potrei sapere quando rilasciare se dalla mappa, se l'immagine era posizionata centralmente? Usare metodi release manuali sarebbe solo una fonte di perdite.

Non sono sicuro che esista anche una buona soluzione a questo, in questo momento sto considerando semplicemente di andare con il primo approccio ed esporre le classi JavaFX dalle interfacce, ma mi piacerebbe molto tenere fuori queste specifiche di implementazione dell'API. C'è qualche schema o pensiero generale che potrebbe essere utile per risolvere questo?

    
posta Tommy Andersen 22.03.2018 - 10:14
fonte

2 risposte

4

Il problema che vedo con il tuo approccio, che vuoi ottenere l'immagine di implementazione interna dell'oggetto ImageResource . In pratica, non stai assegnando sufficienti responsabilità a ImageResource per essere in grado di fare il suo lavoro, è per questo che devi scavare e fare il tuo lavoro da solo.

Quindi il problema non è come accedere a quell'immagine, ma il tuo design che deve accedervi in primo luogo.

Ok, quindi come eviterai questo? Di solito ogni singolo Component in un framework UI dovrebbe sapere come visualizzare se stesso. AWT ha paint() , Wicket ha render() e così via. Quindi il tuo ImageResource dovrebbe sapere come visualizzare se stesso su uno schermo. In questo modo non devi sapere cosa c'è dentro.

    
risposta data 22.03.2018 - 11:04
fonte
1

Puoi creare la tua API come façade di un'altra struttura dell'interfaccia utente. Assicurati semplicemente di avvolgere l'oggetto per nascondere la sua implementazione. Se vuoi supportare parte di questo framework come input, crea un metodo che lo prende come parametro ma restituisce l'oggetto spostato.

    
risposta data 22.03.2018 - 13:22
fonte

Leggi altre domande sui tag