Perché Java usa così tanti intermediari? [chiuso]

7

Ad esempio per leggere i dati da un sito Web che facciamo:

HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

Il metodo che esegue la richiesta HTTP, restituisce una risposta, quindi trasformiamo la risposta in un'entità, quindi trasformiamo l'entità in un flusso di input, quindi devi usare altri due oggetti, un lettore di buffer e un generatore di stringhe , per trasformarlo in una stringa. Sembra solo un sacco di codice ripetitivo. Perché HttpResponse non può avere un metodo che restituisce un InputStream o, meglio ancora, una stringa?

P.S. Non sto dicendo necessariamente che Java sia sbagliato, voglio scoprire qual è la ragione alla base, se esiste.

    
posta Siavash 19.04.2013 - 03:02
fonte

5 risposte

2

Il suo semplice design OO, con oggetti separati a un livello di grana abbastanza fine.

HttpResponse incapsula l'intera risposta. È composto da uno stato, intestazioni e oggetti entità. Questi oggetti incapsulano più dettagli a grana fine, ad esempio l'entità è costituita da informazioni sul tipo di codifica, lunghezza, codifica e un flusso del contenuto stesso.

Questo design evita di avere un oggetto dio HttpResponse che fa tutto, finisce per essere enorme e perde la sua riusabilità.

    
risposta data 19.04.2013 - 12:00
fonte
12

Sì, hai ragione - in generale Java richiede molte cerimonie per situazioni sorprendentemente semplici *. L'ovvio vantaggio è che vedi ogni passo verso il tuo obiettivo, in modo da avere un maggiore controllo. Le comunicazioni di rete vengono eseguite avvolgendo i messaggi all'interno degli inviluppi, quindi sei esposto a questa stratificazione: la tua libreria nasconde già molti livelli per te, ma mantiene visibili i livelli HTTP (l'intestazione e l'entità).

Se puoi fare ipotesi semplificative sulla sequenza di operazioni che devi eseguire (ad esempio, non vuoi controllare il codice di stato di HttpResponse), dovresti semplicemente estrapolarlo in un metodo di supporto che fa ciò che vuoi, e chiamalo invece.

In effetti, esiste una libreria client HTTP Apache che fa proprio questo. Dai un'occhiata a questa domanda StackOverflow per due esempio di passaggio dall'URL al flusso di testo. (Sospetto che potresti già utilizzare questa libreria, ma non ne sono sicuro.)

* Provenendo da Python e Perl, la costruzione di una HashMap in Java è davvero prolissa. Fortunatamente Google Guava semplifica la notazione.

    
risposta data 19.04.2013 - 04:07
fonte
6

Java è stato creato in un mondo in cui voleva per vedere tutti i passaggi, spesso era necessario ottenere il controllo sulla rete (o su qualsiasi altro aspetto relativo alla gestione degli I / O).

Personalmente ritengo che non sia affatto male che gli sviluppatori siano almeno consapevoli del fatto che tale complessità esiste, trovo che troppi sviluppatori accettano ciecamente che "Magic accade" e quindi non possono eseguire il debug / investigare un problema. Sì, sì, scendi dal mio prato, lo so.

Chiaramente il mondo è andato avanti e le astrazioni più semplici possono e devono essere utilizzate come impostazione predefinita. Apache HttpClient è la lib di fatto da usare per questo in Java e puoi usare anche linguaggi come JRuby, Jython, Groovy, Scala, Clojure tutti sulla JVM per fare questo tipo di lavoro in modo più conciso.

    
risposta data 19.04.2013 - 10:02
fonte
2

Il livello di controllo offerto non fa male, puoi sempre costruire un'astrazione che soddisfi le tue esigenze. Sarebbe male se non fosse offerto alcun controllo o controllo non sufficiente.

Se desideri semplicemente la risposta come stringa direttamente, puoi fare ciò:

String result = httpClient.execute(httpPost, new BasicResponseHandler());

Questo non è un esempio specifico, di solito puoi trovare una libreria o una documentazione di ricerca per fare qualcosa in modo relativamente semplice se trovi le impostazioni predefinite e la mancanza di controllo accettabili.

    
risposta data 19.04.2013 - 13:20
fonte
-1

Penso che sia una combinazione di alcune cose.

  • per essere in grado di testare l'unità correttamente devi essere in grado di iniettare le tue dipendenze nell'unità sotto test
  • Java non ha funzioni di prima classe, quindi gli oggetti sono l'unico modo per iniettare le dipendenze
  • La filosofia di Java è che il codice sia per lo più banale e noioso che tutti possano capire
risposta data 19.04.2013 - 12:23
fonte

Leggi altre domande sui tag