Utilizzo dell'operatore di incremento prefisso / postfisso per un semplice accesso incrementale all'array anziché numeri di indice effettivi

1

Non riesco a decidere quale metodo sia migliore considerando sia la leggibilità che la tolleranza d'errore.

Metodo 1:

Object[] objects = getArrayOfKnownLength();
int i = -1;
someMethod(objects[++i], objects[++i], objects[++i], objects[++i]);

Metodo n. 2:

Object[] objects = getArrayOfKnownLength();
someMethod(objects[0], objects[1], objects[2], objects[3]);

Ho sempre fatto il secondo metodo, ma ci sono stati diversi casi in cui ho ottenuto IndexOutOfBoundsException perché ho apportato alcune modifiche che hanno influito sulla posizione dell'elemento dell'array previsto. Quindi ho pensato di utilizzare il primo metodo per prevenire questo problema. La mia unica preoccupazione è che potrebbe essere meno leggibile.

So che questa è una cosa molto secondaria da mettere in discussione, ma sono curioso di sapere quale sia l'opinione della maggioranza.

    
posta Jon McPherson 21.05.2015 - 01:44
fonte

3 risposte

6

Per quanto posso vedere, quando scrivi:

I made some changes which affected the expected array element position

Il vantaggio su cui ti stai concentrando è in Metodo # 1 , la posizione iniziale si trova solo in un punto (il valore iniziale di i ) mentre in Metodo # 2 , tali informazioni sono implicitamente contenute in tutti e quattro gli indici di array.

Visto in questo modo, il secondo metodo è una violazione del principio "Non ripetere te stesso" (DRY), come stai ripetendo la conoscenza. Quello che hai descritto è esattamente il risultato atteso quando violerai DRY: quando la conoscenza ripetuta cambia, hai un processo difficile e soggetto a errori di aggiornarlo in tutti i posti in cui è contenuto.

Tuttavia, penso che possiamo fare anche meglio del primo metodo. Invece dell'operatore di incremento inutilmente ingannevole, perché non dire direttamente cosa intendiamo:

Object[] objects = getArrayOfKnownLength();
int start = 0;
someMethod(objects[start], objects[start+1], objects[start+2], objects[start+3]);

Ora abbiamo tutti i vantaggi del primo metodo, senza la bruttezza e la difficoltà di leggere.

    
risposta data 21.05.2015 - 14:29
fonte
5

Il tuo primo metodo ha 4 effetti collaterali (i pre-incrementi) mentre il secondo ne ha nessuno.

In generale dovresti evitare gli effetti collaterali se puoi.

Inoltre, il secondo è più chiaro sul tuo intento. Se vedessi il primo nel codice di qualcun altro, mi chiederei se ci fosse qualche motivo per eseguire i pre-incrementi.

Quindi, continua con la seconda opzione.

    
risposta data 21.05.2015 - 08:53
fonte
3

Il primo metodo è orribile nella mia visione e non impedisce "Eccezione". Gli stessi sentimenti che provo quando vedo "numeri magici"! XD

Se possibile, è necessario modificare l'architettura, qualcosa non va! Oppure è necessario controllarlo prima di usarlo nel metodo! O abbia ragione che quei parametri arrivano sempre con i loro valori pieni e nello stesso ordine!

Hai cambiato la posizione dei parametri? Refactoring o modifica del design ...!

    
risposta data 21.05.2015 - 07:50
fonte

Leggi altre domande sui tag