J'ai une collection de classes concrètes qui définissent une API, et j'aimerais extraire l'interface de ces classes (c'est-à-dire: essentiellement la hiérarchie de type et les méthodes publiques) de la mise en œuvre effective de l'API.
Donc, par exemple, si l'une des classes publiques de l'API est p> Je voudrais casser une interface et une implémentation p> p > et p> existe un outil que je peux utiliser pour faire cette séparation de manière automatisée, ou je vais devoir faire rouler mon propre programme pour faire le travail ? Il doit être un outil qui nécessite une interaction minimale. P> p>
4 Réponses :
Plusieurs idées, comme Intellij, ont une commande "Interface d'extraction" qui effectue une refactorisation pour vous: http://www.jetbrains.com/idea/features/refactoring.html#extract_interface p>
peut-il fonctionner sur plusieurs fichiers à la fois? Disons que vous sélectionnez toutes les classes dans un package et effectuez l'extraction de l'interface?
Si vous faites cela à tous les fichiers pour la "pureté", je vous suggère de repenser quel avantage vous gagnez. Personnellement, j'extraînerais l'interface où et quand il ait du sens et laissé tout le reste tel qu'il est. Mais alors, je ne connais pas votre raisonnement.
Ce n'est pas pour l'amour de "pureté" et ce ne sera pas pour chaque classe, mais ce serait trop fastidieux de faire un par un.
Je suis à peu près sûr que vous devrez rouler votre propre outil pour faire ce travail; Ce n'est pas quelque chose que de nombreux développeurs utiliseraient et ceux qui l'utilisaient ne l'utiliseraient pas souvent. L'interface d'extraction, à faire correctement, a vraiment besoin d'intelligence (le genre réel) le guidant. Un outil qui extrait aveuglément tous les éléments publics et protégés, et a construit aveuglément une hiérarchie d'interface pour refléter une hiérarchie de mise en œuvre, est loin d'être intelligente et le produit final ne serait pas joli. Développer l'intelligence (artificielle) pour prendre de bonnes décisions sur ce qu'il faut inclure et ce qu'il faut diriger - ce serait un outil utile, mais je confesse inimaginablement difficile pour moi. Quels IDes actuels offrent - une assistance guidée - est probablement le meilleur compromis. Réconforter; Il est massivement moins fastidieux que de faire chaque étape à la main! P>
Je suis d'accord en général la sortie ne serait pas jolie, mais c'est un point de départ et il se trouve qu'il s'agissait d'être ce dont j'ai besoin dans cette situation particulière (l'API que je souhaite réfracteur est effectivement autogogéné dans un autre outil afin que la structure soit réellement bien défini et donc l'outil de refactoring peut être assez intelligent dans ce cas)
J'ai trouvé la solution! p>
Eclipse, a pris en charge les scripts de refactoring, les scripts sont en XML mais pas très sympathiques, mais j'ai généré les scripts de toute façon que l'éclipse effectue tout le refactoring. P>
Pour plus de détails sur le refactoring de script Eclipse, regarde ici et utilisez Eclipse pour générer quelques exemples pour vous afin que vous sachiez ce que le script devrait ressembler à p>
C'est précisément ce que je cherchais (j'ai le scénario exact que vous mentionnez)! Toute chance que vous puissiez partager le script de refactorisation que vous avez utilisé? Je vais Spelunk à Eclipse pour comprendre cela, mais je pourrais utiliser une aide. Merci d'avance!
Wow, le XML généré dans le "script" n'est pas joli (à partir de Eclipse Indigo). Fera rapport si je reçois quelque chose d'utile de cela.
Javap , un outil dans le JDK, vous obtiendrez la plupart de ce que vous voulez. Cependant, soyez prêt à ne pas gérer certaines choses correctement - désolé, j'oublie quoi, peut-être des annotations, des classes intérieures, quelque chose comme ça.
Si l'intégration JavaP dans votre propre application Java vous aiderait, vous pouvez faire quelque chose comme ceci: P>
import sun.tools.javap.Main; ... void javap(String className) throws IOException { bos = new ByteArrayOutputStream(); ourOut = new PrintStream(bos); PrintStream oldOut = System.out; System.setOut(ourOut); String[] params = new String[] {"-public", className}; Main.main(params); System.setOut(oldOut); String str = bos.toString(); }