2011-01-04 14 views
14

Sto utilizzando PMD per analizzare il codice e produce alcuni avvisi ad alta priorità che non so come risolvere.PMD - Code Analyzer warnings

1) Avoid if(x!=y)..; else...; Ma cosa devo fare se ho bisogno di questa logica? Cioè, ho bisogno di controllare se x!=y? Come posso refactoring?

2) Use explicit scoping instead of the default package private level. Ma la classe è effettivamente utilizzata solo all'interno del pacchetto. Quale modificatore di accesso dovrei usare?

3) Parameter is not assigned and could be declared final. Devo aggiungere la parola chiave finale a tutti i luoghi indicati da PMD con questo avviso?

risposta

30

Evitare la negazione: Invece di if(x!=y) doThis() else doThat(), verificare prima il caso positivo, perché le persone/gli utenti tendono ad apprezzare le cose positive più che negative. Torce il cervello di dover invertire la logica in mente durante la lettura del codice sorgente.Così, invece, scrivono:

if (x!=y) doThis() else doThat()  // Bad - negation first 
if (x==y) doThat() else doThis()  // Good - positive first 

scoping esplicito: Secondo PMD website, si tratta di una regola discutibile. Potresti odiarlo, a qualcuno piace. Quello che dovresti fare è rendere privati ​​tutti i campi all'interno delle tue classi. Sembra esserci un campo o un metodo (non una classe) con visibilità del pacchetto, ad es. qualcosa di simile:

class Foo { 
    /* private missing */ Object bar; 
} 

parametri finale: parametri metodo deve essere finale per evitare la riassegnazione accidentale. Questa è solo una buona pratica. Se utilizzi Eclipse, il servizio di assistenza dei contenuti fornisce anche un quickfix chiamato "Cambia i modificatori sul finale dove possibile". Basta selezionare tutto il codice nell'editor con Ctrl-a e quindi premere Ctrl-1.

4

Questi sembrano tutti avvertimenti secondari che potrebbero essere disattivati.

1) Vuole di capovolgere la logica

if(x==y) { 
    //old else clause 
} else { 
    //old if clause 
} 

2) Se il pacchetto è in realtà il corretto accesso che si desidera, non v'è alcun modificatore di accesso da aggiungere. Non ho abbastanza familiarità per sapere se esiste un modo per sopprimere quell'avvertimento specifico.

3) Un problema di stile. Alcune persone vogliono la finale su tutto ciò che potrebbe essere. Altri pensano che aggiunga troppa confusione a poche informazioni. Se ti trovi nell'ultimo campo, disattiva l'avviso.

4

Per quanto riguarda il primo elemento (la disuguaglianza) ci sono due problemi:

1) leggibilità della doppia negazione.

Diciamo che avete:

if(x!=y) { false clause } else { true clause } 

La seconda clausola viene eseguito se "non x non è uguale ay".

Questo può essere riscritta come:

if (x==y) {true clause } else {false clause}. 

2) Correttezza: se xey sono non-primitive, usando if(!x.equals(y)) è più sicuro. Questo è l'equivalente dell'uso di == invece di .equals() e può portare a bachi molto gravi.

6

Non è necessario abilitare tutte le regole. Scegli alcune delle regole che accetti e ridigita il tuo codice fino a quando tutti gli avvisi non vengono cancellati.

- Riforma su una logica if (x == y) ... else .... Basta evitare le condizioni negative in se le dichiarazioni, rendono il codice più difficile da capire

- Non consentire questa regola.

- Un sacco di persone dichiarano un sacco di campi e variabili finali. Soprattutto quando vogliono assicurarsi o esprimere che il valore di una variabile non deve essere cambiato nel metodo. Se non ti piace, disabilita questa regola.

1

È inoltre possibile utilizzare // NOPMD alla fine di qualsiasi riga in cui non si desidera controllare le regole PMD.

Ad esempio per il dato codice di cui sopra è possibile sopprimere controllo PMD dando,

class Foo { 
    /* private missing */ Object bar; // NOPMD 
} 

Si prega di essere consapevole del fatto che il commento di cui sopra può silenziosamente sopprimere altri avvisi nella stessa linea .