2011-12-16 11 views
7

Sto cercando di rifattorizzare un progetto in cui ci sono gli stessi metodi che sono distribuiti su varie classi. Per ridurre la duplicazione del codice, dovrei spostare il codice comune in una superclasse astratta o dovrei inserirlo in un metodo statico in una classe di utilità?Devo creare un metodo statico o una superclasse astratta

EDIT Alcuni dei metodi sono per roba generica che ritengo possa essere statica. Mentre ce ne sono altri che si riferiscono agli attributi della classe, nel qual caso penso che abbia più senso farlo diventare una super classe astratta.

+2

Impossibile rispondere senza contesto; molto dipende da quanto strettamente correlate sono le classi esistenti, come vengono utilizzate le classi e i metodi, ecc. –

+1

Devi dirci di più su questi metodi - se condividono lo stesso comportamento e potrebbero agire indipendentemente da qualsiasi classe, quindi avere utilità le lezioni con metodi statici avrebbero senso. Se stai pensando di usare classi astratte/classi di base/interfacce, devi considerare se quella gerarchia di classe avrebbe senso, e se queste funzioni sono realmente comportamentali intrinseche a quelle classi o, come accennato in precedenza, a quei metodi non importa riguardo alla classe di cui fanno parte. – birryree

+0

Puoi spiegare cosa fa il metodo e se tutte quelle classi sono correlate? –

risposta

0

Se non usa alcun membro della classe, potresti farlo statico!

Ma si dovrebbe fare in una classe o madre classe astratta

+3

madre classe ?? Suona bene. –

+0

Qui è piuttosto mattiniero qui: X Non aspettarti troppo: D –

1

altro punto da considerare può essere il tipo di lavoro fanno queste funzioni. Se questo è sparpagliato, dovresti creare una classe facade/helper/util con metodi statici.

2

Dipende da cosa sta facendo il tuo codice. Sono metodi di utilità? Sono metodi di classe specifici/specializzati? È un'applicazione pesante con multithreading?

Ricordare che se li si rende statici e l'applicazione è multithread, è necessario proteggerli. Questo, a sua volta, riduce la concorrenza. In questo caso, a seconda di quanti thread chiamano lo stesso pezzo di codice, potresti prendere in considerazione lo spostamento (il codice) in una super classe.

+1

Hai solo bisogno di bloccare i metodi statici se hanno lo stato – user949300

+1

@ user949300 sono d'accordo. Stavo facendo delle supposizioni. – Adrian

5

Bene, ho seguito una regola: Non utilizzare la classe base per rimuovere la duplicazione del codice, utilizzare la classe di utilità.

Per l'ereditarietà, fare una domanda a te stesso: Esiste una relazione?

Un'altra regola, che il più delle volte è corretto, è: Preferisco composizione per l'eredità

con classe di utilità statica non è vero composizione, ma può essere chiamata una derivazione di esso.

Applicare queste regole ai propri secenrios e prendere una decisione tenendo a mente la manutenzione e la scalabilità. Comunque andrà bene se tu potessi aggiungere più dettagli al tuo quesiton.

+0

Ulteriori dettagli ridurranno le congetture, ma mi piacciono le regole pratiche che hai menzionato. –

0

Se i metodi utilizzano molti campi o metodi della classe, non dovrebbero essere statici. Se sono qualcosa che una sottoclasse potrebbe voler modificare, non dovrebbero essere statici. Se i metodi devono essere parte di un'interfaccia, non possono essere statici.

Altrimenti è la tua chiamata e probabilmente cambierai idea dopo. :-)

1

Come altri hanno già detto, la risposta a questo dipende dal contesto del problema e dal codice duplicato.

Alcune cose da considerare

  • Ha il codice duplicato mutare l'istanza dell'oggetto. In questo caso, un metodo protetto in una comune classe astratta
  • Invece della classe di utilità Statico si consideri un singleton, i metodi statici possono essere problematici per il testing dell'unità pura sebbene i framework di testing stiano migliorando in questo.
  • L'ereditarietà può essere complicato per essere corretto, pensate se questi oggetti delle diverse classi sono realmente correlati e richiedono un ri-factoring OO? oppure sono frammenti di logica di dominio che richiedono bit di codice simili.
0

A prima vista, direi che sarebbe meglio per rendere il codice comune come un metodo statico pubblico in una classe pubblica. Questo renderà il metodo utile a qualsiasi classe semplicemente utilizzando

UtilityClassName.methodName(); 

Questo è meglio allora che lo rende un metodo concreto in un abstract super-classe, perché allora si avrà sempre bisogno di estendere questa super-classe in tutte le classi dove vuoi usare questo unico metodo.

Ma ora, come hai detto tu, il comportamento del metodo dipende da alcune variabili. Ora, se dipende dalle variabili di istanza di classi diverse, è meglio aggiungere questo metodo in un'interfaccia e lasciare che tutte le classi implementino questa interfaccia e abbiano la loro implementazione della stessa.

Ma ancora una volta se queste variabili sono valori costanti, quindi avere questi valori costanti in un'interfaccia. Implementa queste interfacce nella tua classe di utilità. E di nuovo lo rendono un metodo statico in quella classe di utilità che utilizzerà direttamente queste costanti.

Ad es. Si consideri foll. codice comune dell'area di ritorno di un cerchio.

public interface TwoDimensional{ 
     double PI = 3.14; 
    } 

    public class MyUtility implements TwoDimensional{ 
     public static double getCircleArea(double radius){ 
      return PI*radius*radius; 
     } 
    } 

Qui, si può vedere che il metodo getCircleArea() dipende dal raggio che sarà diverso per le classi diverse, ma ancora posso passare questo valore per il metodo statico della classe myUtility.

Problemi correlati