Ho una classe incaricata di chiamare un servizio e restituire una risposta.
Il contratto è come questo
interface ServiceClient {
ServiceResponse process(ServiceSubmissionParams params);
}
ServiceSubmissionParams
e ServiceResponse
sono semplici POJO che fanno parte dell'applicazione che chiama il servizio (e non fa parte dell'API di servizio).
ServiceSubmissionParams
ha un gruppo di membri di dati necessari per chiamare un'API del servizio e ServiceResponse
ha dati che interpretati dalla risposta del servizio.
La classe di implementazione è così
class ServiceClientImpl implements ServiceClient {
private Client client; //JAXRS client
ServiceResponse process(ServiceSubmissionParams params) {
//1
HttpHeaders headers = createHeaders(params);
//2
Response response = //call service with the above headers
//3 - Build reponse
if (response.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL) {
// Build ServiceResponse
}
//4
throw handleErrorResponse(response);
}
HttpHeaders createHeaders(ServiceSubmissionParams params) {
//Builds HttpHeaders from ServiceSubmissionParams fields
}
RuntimeException handleACAPIErrorResponse(Response response) {
/*
Interprets the response to throw a (custom) subclass of RuntimeException
if response == 503, return ServiceUnavailableException
if response == 408, return RequestTimeoutException
....
if response == 500, return ServerException
else return UnknownException
*/
}
}
La ragione per lanciare RuntimeException specifiche (o diverse) è quella basata sul tipo che alcuni vengono ripetuti (ServiceUnavailable o RequestTimeout) mentre altri non lo fanno.
La mia domanda:
Sento che questa classe ha un sacco di lavoro. Prepara intestazioni, chiama il servizio, interpreta la risposta. Quindi, viola l'SRP? Oppure funziona solo considerando il livello di astrazione di prendere un ServiceSubmissionParams
e restituire un ServiceResponse
.
Più di una violazione di SRP, ho bisogno di cambiare questa classe ogni volta che ho bisogno di gestire una risposta di errore dal servizio cioè, ho bisogno di leggere il corpo della risposta in caso di codice di risposta 500 o 400 e interpretarlo per popolare un %codice%. Quindi, dovrei prendere in considerazione la divisione di questa classe in più classi?