2010-08-02 9 views
11

Parece que debería ser bastante directo, pero no puedo ver nada obvio. Lo que básicamente quiero hacer es señalar un método y refactorizar una clase. Esto llevaría el método en cuestión a una nueva clase con ese método como API pública de nivel superior. La refactorización también arrastraría los métodos y variables necesarios junto con ella a la nueva clase, eliminándolos de la clase anterior si nada más en la clase anterior lo está utilizando.¿Puede eclipsar convertir/refactorizar un método a una clase?

Esta es una tarea repetitiva que a menudo encuentro al refacturar el código heredado. De todos modos, actualmente estoy usando Eclipse 3.0.2, pero aún estaría interesado en la respuesta si está disponible en una versión más reciente de eclipse. ¡Gracias!

+0

Aparentemente no realmente, al menos no desde hace 6 meses - http://stackoverflow.com/questions/1806393/is-there-a-way-to-extract-a-class-with-methods-in- eclipse ¡Lo siento! – Stephen

Respuesta

10

No creo que este tipo de refactorización exista todavía.

Bug 225716 ha sido registrar para ese tipo de característica (desde principios de 2008).
Bug 312347 también sería una buena implementación de dicha refactorización.

"Crear una nueva clase y mover los campos pertinentes y métodos de la clase de edad en la nueva clase."

Menciono una solución en este SO answer.

+0

+1 para las referencias de errores. Espero que se pongan a implementar uno de ellos pronto. El error 312347, especialmente, proporciona un buen argumento para esta característica. –

1

¿Ha probado la función Move del grupo Refactor? Puede crear una clase auxiliar y mover allí lo que desee.

+0

Hmm, tal vez esto funcione mejor con versiones posteriores de eclipse, pero solo obtengo tipos aleatorios procedentes de variables como tipos de recepción de mi método Move. gracias por la sugerencia sin embargo. –

3

esto parece que debe ser bastante recta hacia adelante ...

En realidad, el extracto de clase es una de las más difíciles refactorizaciones. Incluso en el ejemplo simple de mover un solo método y sus dependencias, existen posibles complicaciones:

  1. Si el método movida podría ser utilizado en código que no sabe acerca, es necesario tener un método proxy en el clase original que delegará (llamará) el método movido. (Si su aplicación es autónoma o si conoce todos los clientes del método movido, entonces el código de refactorización podría actualizar el código de llamada.)
  2. Si el método movido es parte de una interfaz o si el método movido es heredado , entonces también necesitarás tener un "método proxy".
  3. Su método puede llamar a un método/campo privado que algunas otras llamadas de método. Debe elegir una clase para el miembro llamado (tal vez en la clase que más lo usa). Deberá cambiar el acceso de "privado" a algo más general.
  4. Según la cantidad que la clase original y la clase extraída necesiten conocerse entre sí, una o ambas pueden necesitar tener campos inicializados que apunten a la otra.
  5. Etc.

Esto es por lo que animo a todos a votar para el bug 312347 de ser arreglados.

+0

Grandes puntos. Con respecto a los puntos 1 y 2, estos se aplican a los métodos no privados, mientras que en su mayoría estoy buscando la refactorización de clase de extracto privado (¿cuál esperaría que fuera el caso habitual?). Tampoco había pensado en los desafíos de la refacturación de métodos privados que tienen muchos efectos secundarios. ¡Eso sería una lata de gusanos! –

7

En Eclipse 3.7.1 hay una opción para mover métodos y campos fuera de una clase.Para hacerlo:

  1. Asegúrese de que exista la clase de destino (la clase vacía está bien, siempre que exista en el proyecto).
  2. En la clase de origen, seleccione los métodos que se desea eliminar (la vista de esquema funciona muy bien para esto), haga clic derecho en la selección y elija Mover
  3. Seleccione la clase de destino en el menú desplegable/Navegar

Sus miembros ahora se extraen. Corrija cualquier problema de visibilidad (Source> Generate Getters and Setters es muy útil para esto) y ya está todo listo.

+0

Dulce, lo intentaré. –

Cuestiones relacionadas