2011-01-13 5 views
2

Ich habe zwei Datenzugriffsobjekte, die umgekehrt generiert und für die Verwendung durch meine Anwendung jar'ed. Sie repräsentieren sehr ähnliche Tabellen. Eine Tabelle hat ein paar zusätzliche Spalten als die andere. Dies liegt außerhalb meiner Kontrolle aufgrund der Bedenken hinsichtlich der Geschäftseignung von Datenbanken.Entfernen von kopierten/eingefügten Code ohne eine Schnittstelle

Die Anwendung verfügt derzeit über zwei Implementierungen eines Repository, das auf diesen DAOs ausgeführt wird. Die Implementierungen sind sehr ähnlich. Es gibt einige zusätzliche Operationen, die den zusätzlichen Spalten auf dem zweiten DAO entsprechen. Eine Implementierung ist jedoch mit nur wenigen Ausnahmen ein Kopieren und Einfügen des anderen. Die Implementierungen sind Hunderte von Zeilen lang.

Also wollte ich den Copy/Paste Job entfernen. Idealerweise könnte ich einfach eine Schnittstelle vor die DAOs kleben und dann vielleicht eine abstrakte Klasse verwenden, um den gemeinsamen Code zu halten (fast alles). Ich kann jedoch keine Schnittstelle vor den DAOs setzen. Denken Sie daran, dass sie umgekehrt generiert werden, und ohne die ORM-Software zu aktualisieren, halte ich dies nicht für eine vernünftige Wahl (Kodo 3.x, glaube ich, dies zu ändern ist nicht im Umfang).

Das einzige, was ich mir vorstellen kann, dass sogar funktionieren würde, ist etwas Gemeinheit mit Reflexion, aber das führt zu etwas viel schlimmer als ich jetzt habe.

Irgendwelche cleveren Lösungen?

bearbeiten: Hier wird sehr verwässerte Codebeispiel

package one.dao 
//reverse generated 
class UserDao { 
    getFirstName(..); 
    setFirstName(..); 
    getLastName(..); 
    .... 50 more just like this 
} 

package two.dao 
//reverse generated 
class UserDao { 
    getFirstName(..); 
    setFirstName(..); 
    getLastName(..); 
    .... the same 50 more as above 

    getSomethingElse(..); //doesn't exist in one.dao.UserDao 
    setSomethingElse(..); //doesn't exist in one.dao.UserDao 
} 

class RepositoryOne(one.dao.UserDao userDao) { 
    //insert code here. perform operations on nearly all methods, lots of code 
} 

class RepositoryTwo(two.dao.UserDao userDao) { 
    //insert code here. same as Repository one 

    //some extra code that isn't above, maybe 10 lines 
} 
+1

Können Sie ein einfaches \ verwässertes Codebeispiel posten? – javamonkey79

Antwort

2

Ich gehe davon aus Sie eine gewisse Kontrolle über die duplizierten Code haben. Wenn Ihr Code-Generator alles erzeugt, müssen Sie nach Lösungen innerhalb seiner API-Konfiguration suchen, vermute ich.

Wenn die Vererbung nicht funktioniert, versuchen Sie Composition. Machen Sie eine dritte Klasse für den geteilten Code (SharedCode). Geben Sie jeder der beiden vorhandenen Klassen eine private Memberinstanz der SharedCode-Klasse, und sorgen Sie dafür, dass alle in SharedCode implementierten Routinen Methoden an die Memberinstanz übergeben.

+0

Nun, das Problem ist, dass der Code nur annähernd "liest". Technisch funktioniert es in verschiedenen Klassen. Ich habe nach deinem Post ein Beispiel hinzugefügt, ich denke, es klärt es ein wenig auf. – emulcahy

+0

Es klingt wie, was Sie wollen, ist Duck Typing. Ich werde nicht so tun, als ob ich weiß, wie man das in Java macht, aber es sieht so aus, als würde es hier eine solide Diskussion geben: http://StackOverflow.com/Questions/4330330/simulating-Duck-Typing-in-Java –

Verwandte Themen