Crea una nuova variabile o effettua più chiamate concatenate?

3

Qual è il modo migliore per ottenere questi attributi, pensando in termini di prestazioni e qualità del codice?

Utilizzo di chiamate concatenate:

    name = this.product.getStock().getItems().get(index).getName();
    id = this.product.getStock().getItems().get(index).getId();

Creazione di una nuova variabile:

    final item = this.product.getStock().getItems().get(index);
    name = item.getName();
    it = item.getId();

Preferisco il secondo modo, per rendere il codice più pulito. Ma mi piacerebbe vedere alcune opinioni a riguardo.

Grazie!

    
posta Rodrigo 08.06.2012 - 16:32
fonte

4 risposte

8

Il tuo approccio incatenato non è poi così male (ammetto di averlo fatto per catene brevi e semplici) ma la domanda è: cosa succede quando uno degli elementi nel mezzo di questa catena che stai cercando di ottenere restituisce null?

Recentemente ho dovuto eseguire il debug di qualcosa di simile ed è stato un dolore. Alla fine ho diviso in qualcosa di simile:

a = incomingObject.getA();
b = a.getB();
c = b.getC();

... beh, in realtà la catena con cui avevo a che fare era 7 diventa profonda. E poi una volta risolto (provato e preso) ho scoperto che un metodo diverso (non un get, ma usato come uno) stava generando un'eccezione webservice. Riscrivendolo come affermazioni multiple era noioso ma molto più facile eseguire il debug quando le cose andavano male.

    
risposta data 08.06.2012 - 16:41
fonte
6

Mi piace niether, personnaly.

Se qualcuno di essi restituisce un valore null, si ottiene un'eccezione nullpointer sulla linea ...

Ora ... quale di questi è andato storto?

Ora il metodo di concatenamento può essere ed è molto utile con alcuni schemi di utilizzo specifici. Dì ad esempio in un'interfaccia di tipo fluente (la maggior parte delle strutture di derisione lo farà, almeno quelle che ho visto).

Idealmente si dovrebbe cercare di ridurre l'accoppiamento e questo modello fa esattamente il contrario.

Dall'esperienza in cui mi trovo a dover scavare in profondità nella struttura degli oggetti per svolgere un'attività, di solito è un indicatore del fatto che la mia struttura di oggetti o la mia logica aziendale non sono corretti. Forse il lavoro potrebbe essere sepolto più in profondità attraverso una specie di oggetto / facciata / delegato del wrapper e chiamarlo invece. Forse la tua funzione o metodo sta facendo troppo e dovrebbero essere suddivisi in blocchi più piccoli e più specializzati. Forse l'oggetto ha bisogno di esporre le proprietà degli oggetti all'interno invece di esporre l'oggetto nel suo insieme. Tutto dipende dalla tua architettura e dai casi d'uso.

Detto questo, il software deve essere spedito e questo di solito significa che alcune parti saranno più hacker di altre, Idealmente queste dovrebbero essere ben isolate e incatenate e il concatenamento di metodi come questo tempo fatto attraverso assegnazioni variabili successive o direttamente tende a rompere questi confini che riducono la stabilità complessiva.

    
risposta data 08.06.2012 - 19:08
fonte
0

Preferisco la seconda strada perché mostra intento . Stai ottenendo il name e il it di sconto di un singolo elemento che hai recuperato.

Nel primo modo, potrebbe esistere una possibilità (ad esempio attraverso un altro thread) che .get(index) restituisca un elemento diverso tra le due chiamate? Se ciò potrebbe accadere ora, o in qualche futura iterazione del software, il secondo modo non solo ha il vantaggio di cui parlo sopra, ma potrebbe diventare necessario .

    
risposta data 08.06.2012 - 17:30
fonte
0

Beh, penso che la seconda opzione che hai postato sia più pulita, ea volte il compilatore potrebbe farlo per te in background come ottimizzazione. Perché un salto del puntatore (o chiamata di funzione) è migliore di 5. Quindi il codice è più pulito e più veloce.
Quindi l'unica domanda che dovresti porci è: Could it be that one object in the chain changes its result? Se la risposta è No , vai con il modo breve e carino. Se è Yes , è semplicemente la correttezza del programma.

Modifica

Stavo solo studiando per un esame e mi sono imbattuto nel refactoring Introduci spiegando variabili , che mi ha ricordato la tua domanda. Penso che troverai la discussione interessante. I punti principali sono:

  • La tua seconda opzione è quella preferita.
  • Se è applicabile Metodo di estrazione , fallo invece. E creare un metodo generale di accesso per gli oggetti desiderati. (In questo modo hai un codice più leggibile e meno codice copia-incolla)
risposta data 08.06.2012 - 16:53
fonte