Modo per organizzare il testo ripetitivo in Java

0

Alcune volte ho testi che appaiono in posti diversi, come commenti, messaggi ... Per esempio se ho un'eccezione personalizzata, probabilmente doc di classe, i messaggi che passano come parametro al suo costruttore avranno le stesse frasi (qui This exception throws under situation1 ):

/**
 * This exception throws under situation1 ...
 *
 */
public class SomeException extends Exception {

    public static class Builder{
        String message = "This exception throws under situation1. So ... ";

        public Builder(String message) {
            this.message = this.message + "\r\n" + message;
        }
        public SomeException build(){
            return new SomeException(this);

        }
    }

    private SomeException(String detailMessage) {
        super(detailMessage);
    }

    public SomeException(Builder builder) {
        this(builder.message);
    }
}

E anche i documenti di ciascun metodo che genera un'eccezione avranno la stessa frase:

/**
 * @throws SomeException
 *             This exception throws under situation1 ...
 */
private void test() throws SomeException {
    throw new SomeException.Builder("message").build();
}

Se faccio copia / incolla frase, la manutenzione dei documenti sarà difficile (è necessario trovare e aggiornare tutte le ripetizioni su ogni modifica).

Per risolvere questo, posso usare una stringa costante che il suo valore e il suo commento siano quei termini ripetitivi

 /**
  * exception throws under situation1
  */
public static final String CONSTANT = "exception throws under situation1";

e riferimento ad esso (ed è un commento):

/**
 * {@link MyClass#CONSTANT}
 */
String message = MyClass.CONSTANT;

Ma come organizzare le costanti quando ne esistono più di una? Per quanto riguarda questa risposta e questo , sembra che il modo migliore per organizzarli sia utilizzare Enum :

public enum Meta {
    /**
     * exception throws under situation1
     */
    CONSTANT("exception throws under situation1");

    private String text;

    Meta(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }

}

Ma c'è un modo migliore di questo? Soprattutto complica il codice.

    
posta hasanghaforian 08.06.2015 - 13:49
fonte

2 risposte

2

È ripetitivo perché è ridondante.

Il modo giusto per "organizzarlo" è rimuovendolo.

/**
 * This exception throws under situation1 ...
 */
public class SomeException extends Exception {

"Questo"? So che Javadoc si riferisce a questa classe e non a un'altra.

"Eccezione"? Posso benissimo vedere che questa è un'eccezione.

"Lanci"? Va da sé che si devono gettare le eccezioni.

/**
 * Stuff went bad as in [situation1]
 */
public class SomeException extends Exception {

Questo è abbastanza Taglia l'ovvio.

/**
 * @throws SomeException
 *             This exception throws under situation1 ...
 */
private void test() throws SomeException {
    throw new SomeException.Builder("message").build();
}

E qual è il punto di copia-incolla le stesse cose qui?

Posso cercare Javadoc per SomeException . Questo è esattamente ciò che è per.

Non ripetere le informazioni generali su di esso.

Se c'è qualcosa di specifico su SomeException nel contesto del tuo metodo test , mettilo in Javadoc, con ogni mezzo!

Ma allora sarebbe un'informazione unica, per definizione.

E se si tratta semplicemente di copia-pasta, allora lasciala.

Tutto ciò che fa è sparpagliare il tuo codice con rumore.

So che molti programmatori pensano di servire una nobile causa cercando di ottenere una copertura al 100% Javadoc e sono orgogliosi di produrre codice come:

/**
 * Sets name
 * @param name - name 
 */
public void setName(String name) {
    this.name = name;
}

Basta fermarlo. È inutile.

Ok, è un po 'diverso se stai scrivendo una libreria (il più delle volte non è così, e nulla nella tua domanda indica che questo è ciò che stai facendo). Ma comunque, solo un po 'diverso. La ridondanza è una bandiera rossa. Le informazioni preziose sono specifiche. Se le informazioni fornite non lo sono, probabilmente non è così prezioso. Quindi è meglio lasciarlo fuori o renderlo più contestuale.

    
risposta data 08.06.2015 - 20:32
fonte
2

Metti le tue stringhe in un oggetto ResourceBundle, come se tu stessi internazionalizzando l'applicazione . Ci sono un certo numero di tutorial là fuori per fare questo genere di cose, ma per la maggior parte si riducono esattamente al problema che stai descrivendo: mettere il testo in una posizione comune, dove in seguito puoi fare riferimento ad esso con un identificatore di di qualche tipo.

Spesso le persone pensano a questo solo in termini di semplificare la traduzione di un'applicazione in altre lingue, ma è anche utile in situazioni come questa, dove devi ripetere lo stesso messaggio molte volte. Come ulteriore vantaggio, quando e fai deciderai di internazionalizzare l'app, l'infrastruttura di base sarà già presente. Tutto quello che dovrai fare è aggiungere più lingue.

    
risposta data 08.06.2015 - 14:29
fonte

Leggi altre domande sui tag