È migliore pratica creare una nuova variabile solo per dimostrare che qualcosa è definitivo?

1

Recentemente ho riscontrato una situazione in un progetto Java in cui ho scritto un blocco come questo:

    String user = System.getProperty("user.home").toUpperCase();
    user = user.substring(user.lastIndexOf(File.separator) + 1);

    final String path1 = "C:\first\path";
    final String path2 = "C:\second\path";
    final String uniquePath = "C:\users\" + user + "\unique\path";

Mi sto solo abituando a contrassegnare le variabili come final per lo stile, ma non sono sicuro di come gestire questo tipo di esempio. A quanto ho capito, final è spesso usato non solo per impedire che un valore venga modificato, ma per indicare al lettore che la variabile è immutabile. In questo esempio, qualcuno vede che path1 , path2 e uniquePath non cambieranno e questo cambia radicalmente il modo in cui pensano a tali variabili.

La mia preoccupazione è che, nell'esempio sopra, i percorsi siano chiaramente final , e user chiaramente no. Non è troppo difficile (penso) per capire che user probabilmente non verrà manipolato, e l'unica ragione per cui non è anche final è perché non può essere ottenuto in una sola espressione. Tuttavia, se vedessi questo codice, sarebbe davvero difficile per me raggruppare mentalmente user con i percorsi. Ovviamente il coder ha voluto indicare quali variabili erano final e non hanno contrassegnato user .

Sembra quindi che qualcosa del genere renderebbe le cose più chiare:

    String temp = System.getProperty("user.home").toUpperCase();
    temp = temp.substring(temp.lastIndexOf(File.separator) + 1);

    final String user = temp;

    final String path1 = "C:\first\path";
    final String path2 = "C:\second\path";
    final String uniquePath = "C:\users\" + user + "\unique\path";

Ma non sono sicuro che questo valga lo spazio extra e la variabile necessaria.

Esiste un consenso su quale di questi approcci è una pratica migliore? C'è un'opzione migliore che non ho considerato?

    
posta Lord Farquaad 13.07.2017 - 21:36
fonte

3 risposte

8

Una soluzione a questo è invece estrarre il codice in un metodo e quindi chiamarlo semplicemente. In questo modo non avrai bisogno di avere la variabile temp nello scope del metodo principale e non la "inquinerà". Di seguito è riportato un esempio di metodo refactored

final String user = getUser();

final String path1 = "C:\first\path";
final String path2 = "C:\second\path";
final String uniquePath = "C:\users\" + user + "\unique\path";

/* you could use a more descriptive name */
private String getUser() {
    String userHome = System.getProperty("user.home").toUpperCase();
    return userHome.substring(userHome.lastIndexOf(File.separator) + 1);
}
    
risposta data 13.07.2017 - 22:23
fonte
2

Il mio problema con il tuo codice è che non è system independent . Dovresti sempre utilizzare la denominazione UNC per i percorsi (utilizzando / anziché \ ). Javas (N) classi IO con cura della conversione specifica del sistema.

Ma c'è di più:

String user = System.getProperty("user.home").toUpperCase();

Converti il nome utente in maiuscolo. Questo potrebbe non essere un problema nel tuo ambiente di destinazione se (e solo se) tutti i nomi utente sono in maiuscolo per impostazione predefinita. Ma se hai un utente Strauß la stringa risultante sarà STRAUSS . In questo caso, il tuo codice fallirà perché anche windows non "retranslate" STRAUSS a Strauß .

Inoltre: La posizione della home dell'utente può essere modificata da un criterio nella directory attiva. La posizione predefinita che prevedi funzionerà per il 99,9% dei tuoi utenti, ma per alcuni non lo farà, perché se gli amministratori spostano le case degli utenti, molto probabilmente limitano anche l'accesso in scrittura a C:\ in modo che il programma non riesca a crea quella cartella ...

Quindi sorge la domanda:

 System.getProperty("user.home")

ti fornisce già il percorso corretto al 100% per la cartella home degli utenti. Perché lo costruisci da solo?

    
risposta data 14.07.2017 - 13:26
fonte
2

Hai scritto:

String user = System.getProperty("user.home").toUpperCase();
user = user.substring(user.lastIndexOf(File.separator) + 1);

Ma la prima espressione non è "utente", è qualcos'altro. Basta scrivere:

final String userHomeUpperCase = ...
final String user = ...

NB. Timothy Truckle ha ragione, questo è terribile codice Java perché funzionerà solo su Windows. La libreria Java ha metodi per raggiungere i tuoi obiettivi senza i percorsi Windows di hard-coding.

    
risposta data 14.07.2017 - 18:43
fonte

Leggi altre domande sui tag