Classe con un solo metodo statico

1

Sto usando Java per creare un'applicazione per Android (quindi posso usare molte delle opzioni di Java 7 , ma non posso usarle tutte). Ho due classi:

class A{
    static String getScript(String input){
        return "result of functionality_1 on input";
    }
    ...
}

class B{
    static String getScript(String input){
        return "result of functionality_1 on input";
    }
    ...
}

Entrambe le classi A , B hanno getScript() metodi che hanno la stessa funzionalità e lo stesso scopo. Posso spostare quel metodo in un'altra classe per evitare di dover cambiare il codice in due punti quando devo cambiare quella funzionalità. Ho visto questa domanda e so che non è una cattiva pratica avere una classe con solo metodi statici. Ma creare una classe con un solo metodo statico sembra strano. Voglio sapere è davvero strano? e anche cattive pratiche? C'è un modo per evitarlo?

    
posta hasanghaforian 07.04.2017 - 20:19
fonte

2 risposte

3

Direi che è una cosa migliore per non avere funzionalità duplicate che galleggiano nella tua base di codice. Che cosa succede se devi aggiornare getScript in A e dimenticarti di farlo in B ?

Una classe separata (chiamata C ) potrebbe probabilmente contenere questo metodo, ma dal momento che questa funzione è in qualche modo correlata a A e B , è possibile portarla a una (nuova) classe astratta. Il refactoring potrebbe essere simile a questo:

public abstract class ScriptRetrieval
{

    static String getScript(String input)
    {
        return "result of functionality_1 on input";
    }
}
public class A
{
    // No more getScript in here
}
public class B
{
    // No more getScript in here
}

e ora invece di questo:

String s1 = A.getScript("test1");
String s2 = B.getScript("test1");
assert(s1.equals(s2));

Fai questo:

String s1 = ScriptRetrieval.getScript("test1");
String s2 = ScriptRetrieval.getScript("test1");
assert(s1.equals(s2));

Il vantaggio è che nel primo esempio di codice, hai due classi con (presumibilmente) la stessa implementazione di getScript . Il problema è che se c'è qualche cambiamento in A.getScript , l'asserzione fallirà. Nel secondo esempio, c'è solo un'implementazione one della funzione, quindi l'asserzione non dovrebbe mai fallire.

    
risposta data 07.04.2017 - 20:57
fonte
1

Java 8 consente metodi statici in un'interfaccia e, se queste due classi condividono qualche comportamento, sembra che possano implementare almeno un'interfaccia comune.

Dato che stai usando Java 7, sono d'accordo con la risposta accettata: è bello creare una classe con un singolo metodo per evitare la duplicazione.

Tuttavia, queste domande non sono prive di contesto. Guardando il codice mock che dice "risultato di funzionalità_1" puoi puntare a un'opzione generica, ma guardare il codice effettivo potrebbe portare a una risposta diversa.

Alcune domande si potrebbero chiedere sul codice: qual è il tipo di codice in quella funzione ... quanto è grande ... quanto è complesso ... quanto è probabile che cambi .. e quali sono le tue alternative. A volte c'è una parte che si adatta naturalmente a una classe di costanti esistente e puoi lasciare una certa duplicazione del codice.

L'ASCIUTTO è un principio chiave, sicuramente. Quindi la duplicazione di solito è cattiva. Tuttavia, la duplicazione evita l'unico livello di riferimento indiretto nel chiamare qualcosa che si trova in un altro pezzo di codice. Ogni volta che crei una classe e un metodo, stai creando nuovi nomi e verbi per qualcuno che comprenderà il codice in seguito. Quindi, ogni nuova classe aggiunge massa concettuale al codice. Il trucco è minimizzare il mas concettuale, rispettando la motivazione che sta alla base di DRY.

    
risposta data 08.04.2017 - 13:14
fonte

Leggi altre domande sui tag