È generalmente riconosciuto che sovraccaricare un metodo non dovrebbe cambiare il suo comportamento, ma quanto del comportamento di un metodo dovrebbe essere mantenuto coerente?
Prendi ad esempio un client API REST che è responsabile dell'interazione con due diversi endpoint. Entrambi utilizzano una richiesta POST, condividono lo stesso URL di base e accettano le stesse intestazioni. L'unica differenza è il carico utile (e ovviamente gli endpoint stessi). Se si dovesse seguire rigorosamente la suddetta regola di incapsulare un singolo comportamento sotto lo stesso nome del metodo, si potrebbe creare un client simile a quello sottostante:
public class RestClient {
private final String API_A = "http://api.somecompany.com/a";
private final String API_B = "http://api.somecompany.com/b";
RestTemplate restTemplate;
public ResponseA postA(RequestA request) {
HttpHeaders headers = getHeaders();
HttpEntity<RequestA> request = new HttpEntity<>(request, headers);
return postForObject(API_A, request, ResponseA.class);
}
public ResponseB postB(RequestB request) {
HttpHeaders headers = getHeaders();
HttpEntity<RequestB> request = new HttpEntity<>(request, headers);
return postForObject(API_B, request, ResponseB.class);
}
private HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
return headers;
}
}
Questo sembra giusto ma anche un po 'sciocco a causa di quanto simili siano i metodi. Perché non utilizzare lo stesso nome del metodo e modificare semplicemente il tipo di richiesta e risposta? Questo non implica che venga chiamato l'endpoint? dovrebbe esserci un client separato per ciascun endpoint?