rimuovere il codice duplicato in java
-
19-09-2019 - |
Domanda
class A extends ApiClass
{
public void duplicateMethod()
{
}
}
class B extends AnotherApiClass
{
public void duplicateMethod()
{
}
}
Ho due classi che estendono diverse classi API. I due di classe ha qualche duplicato metodi (stesso metodo ripetuto in entrambi classe) e come rimuovere questa duplicazione?
Modifica
Sia ApiClass e AnotherApiClass non sono sotto il mio controllo
Soluzione
suona come un caso per il "modello di strategia".
class A extends ApiClass {
private ClassContainingDupMethod strategy;
}
class N extends AnotherApiClass {
private ClassContainingDupMethod strategy;
public methodCallingDupMethod(){
strategy.dupMethod();
}
}
class ClassContainingDupMethod{
public dupMethod(){;}
}
O è il dupMethod inherted dalle classi API?
Altri suggerimenti
A seconda di ciò che il codice è che si potrebbe fare qualcosa di simile:
public class Util
{
public static void duplicateMethod()
{
// code goes here
}
}
e poi basta avere gli altri due duplicateMethods chiamano quello. Quindi il codice non sarebbe stato duplicato, ma il nome del metodo e la chiamata alla Util.duplicateMethod sarebbe.
Se il codice nella Util.duplicateMethod necessaria per accedere alle variabili istanza / classe di A e di classe B che non avrebbe funzionato così bene, ma potrebbe potenzialmente essere fatto (fatemi sapere se avete bisogno di questo).
EDIT (sulla base di un commento):
Con variabili di istanza si ottiene meno abbastanza ... ma può essere fatto. Qualcosa di simile:
interface X
{
int getVar();
void setVar(A a);
}
class A
extends ApiClass
implements X
{
}
class B
extends AnotherApiClass
implements X
{
}
class Util
{
public static void duplicateMethod(X x)
{
int val = x.getVal();
x.setVal(val + 1);
}
}
Quindi, per ogni variabile è necessario accedere si farebbe un metodo per get (e impostare se necessario). Non mi piace questo modo dal momento che rendono i metodi get / set pubblico che può significare che si stanno facendo le cose a disposizione che non si vuole essere a disposizione. Un'alternativa sarebbe quella di fare qualcosa con la riflessione, ma mi piacerebbe che anche meno: -)
Duplica metodi che si basano su variabili membro implica variabili membro duplicati, anche - e che inizia a puzzare come troppo-grandi classi. Quali sarebbero queste variabili membro specifici, con il metodo (s), sembrano, se si dovesse estrarli nella loro classe, e poi comporre quella classe nelle vostre altre classi? Preferisco composizione per l'eredità .
class BaseApiClass
{
public void duplicateMethod()
{
}
}
class ApiClass extends BaseApiClass
{
}
class AnotherApiClass extends BaseApiClass
{
}
class A extends ApiClass
{
}
class B extends AnotherApiClass
{
}
È necessario combinare le classi in un unico oggetto e poi tutte le classi Uso delle altre due classi, modificare il proprio codice per utilizzare la singola classe.