java intellij-idea refactoring automated-refactoring law-of-demeter

java - Refactorización simple personalizada en IntelliJ



intellij-idea refactoring (1)

Esta pregunta es un seguimiento de esto .

Di que tengo algo de clase Foo.

class Foo { protected String x = "x"; public String getX() { return x; } }

Tengo un programa que usa Foo y viola LoD ( Ley de Demeter ).

class Bar { protected Foo foo; public Bar() { this.foo = new Foo(); } public Foo getFoo() { return foo; } } public static void main(String [] args) { Bar bar = new Bar(); String x = bar.getFoo().getX(); }

Puedo refactorizar este código para usar LoD en dos pasos.

  1. bar.getFoo().getX() m bar.getFoo().getX() -> getFooX(bar) (extraer al método, también encontrar y reemplazar las ocurrencias)
  2. F6 getFooX(bar) -> bar.getFooX() (pasar al método de instancia, también buscar y reemplazar ocurrencias)

El programa que usa Bar ya no viola LoD.

class Bar { protected Foo foo; public Bar() { this.foo = new Foo(); } public Foo getFoo() { return foo; } public String getFooX() { return foo.getX(); } } public static void main(String [] args) { Bar bar = new Bar(); String x = bar.getFooX(); }

Me pregunto si hay una manera de hacer un método de refactorización personalizado en IntelliJ que consolide estos dos pasos en uno.

EDITAR Recibí una respuesta de JetBrains con un enlace a una solicitud de función preexistente. Por favor, vote sobre esto si le parece útil.

Hola Michael,

Parece que tenemos una solicitud similar en YouTrack: https://youtrack.jetbrains.com/issue/IDEA-122400 . Siéntete libre de votar y dejar comentarios.

Saludos cordiales, Yaroslav Bedrov JetBrains

EDITAR Hay al menos una forma de inspeccionar los problemas de la Ley de Demeter. captura de pantalla http://i59.tinypic.com/2s80ft0.png

Aquí hay un resumen que contiene un perfil de inspección que solo buscará violaciones de LoD. Puedes importarlo en IntelliJ .


Después de agregar el método getFooX() a la Bar , usaría Edición > Buscar > Reemplazar estructuralmente con las siguientes expresiones:

Plantilla de búsqueda:

$instance$.getFoo().getX()

Plantilla de reemplazo:

$instance$.getFooX()

Hace el trabajo perfectamente. Tal vez puede agregar algunas restricciones a la variable $instance$ para limitar la búsqueda, pero eso solo sería útil si tuviera varias clases con ese nombre de método.