Problema di progettazione OOP con Java

0

Ho una parte del sistema che assomiglia a questo:

Fondamentalmente,ilclientdecidequalechiamataAPIinvocaresulserverinbasealflagfornitoinprecedenza.Conosceinanticipoqualetipodirispostaaspettarsi.Quindiilcodicesarebbesimileaquesto:

if(flagOn){Response1=ApiCall1();Process1(Response1);}else{Response2=ApiCall2();Process2(Response2);}

Nonsonoabbastanzasoddisfattodelmodoincuifunziona,primadituttoperchéilflagchedecidequaleAPIchiamarenonappartienealclient,madovrebbeesserepartedelserver.ClientnondovrebbesaperenullasuqualiAPIsonochiamateinbackground,dovrebbesoloinoltrarelarichiestaalserverchedecidesutalicose.Quindi,hoiniziatoadisegnareunaversionemigliorataehotrovatoquesto:

In questa versione, Client riguarda solo l'inoltro della richiesta a Server , dove viene deciso il flusso. Tuttavia, con questo design, c'è un problema principale che deve essere risolto: tipo di risposta di ProcessRequest() . Pertanto, poiché ProcessRequest() può chiamare entrambe le API e ricavare da esse due risposte completamente diverse, non sono in grado di rappresentare entrambi i tipi di risposte con lo stesso tipo di dati. Non saprei quale tipo di struttura dati utilizzare sul client per rappresentare la risposta da ProcessRequest() . Qualcuno può aiutarmi con questo problema di progettazione, o magari suggerire un design / soluzione alternativa?

??? response = server.processRequest();
    1.
posta Zed 05.11.2018 - 18:45
fonte

2 risposte

1

se il client è un componente (classe, più classi) allora IMO dovresti spostare la decisione fuori dal client e dal server e creare due client separati o un client con due metodi. Non passare il flag al client, basta chiamare un client specifico o un metodo specifico sul client:

o

EDIT:

Sehocapitobene,vuoiavereuncodicegenericoperchiamarequalsiasiAPIesternaeperelaborarelasuarisposta.Inquestocaso,puoiutilizzareigenerici:

public class SomeService { public SommeService(ApiClient apiClient, ResponseProccessor responseProcessor) { _apiClient = apiClient; _responseProcessor = responseProcessor; } public TResponse CallApi<TRequest,TResponse>(TRequest request){ var respose = _apiClient.Call<TRequest>(request); _responseProcessor.Process<TResponse>(response); } }     
risposta data 05.11.2018 - 20:14
fonte
0

Un'opzione è che, come notato da Winston Ewert nei commenti, si usa sempre l'approccio asincrono. Con la semantica standard POST , si POST a un URI che creerà una sotto-risorsa di quell'URI. La risposta POST contiene la posizione di tale URI.

Puoi ancora fare questo switch internamente se ha senso. L'API client sarà coerente e il client sarà sempre POST e quindi eseguirà un GET sull'URI restituito. La differenza sarà se la risorsa sarà presente prima che il client invii la risposta o se ci sarà qualche tempo dopo. Affinché il cliente sia agnostico dei dettagli, dovrebbe solo sapere che sarà disponibile nella posizione della risorsa secondaria a un certo punto dopo la chiamata, probabilmente subito.

Non è completamente chiaro dalla tua domanda che il cliente abbia bisogno anche della risposta. Se è solo la responsabilità è quella di ottenere la richiesta al server, questo sembra un ottimo compromesso per ciò che si vuole fare.

    
risposta data 05.11.2018 - 21:32
fonte

Leggi altre domande sui tag