16

Questa domanda è un follow-up for this.Refactoring semplice personalizzato in IntelliJ

Dire che ho qualche classe Foo.

class Foo { 
    protected String x = "x"; 

    public String getX() { 
     return x; 
    } 
} 

Ho un programma che utilizza Foo e viola Lod (Law of 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(); 
} 

Posso refactoring questo codice per utilizzare LoD in due passaggi.

  1. mbar.getFoo().getX() ->getFooX(bar) (estratto di metodo, di trovare anche e sostituire le occorrenze)
  2. F6getFooX(bar) ->bar.getFooX() (passaggio al metodo di istanza, anche trovare e sostituire occorrenze)

Il programma che utilizza Bar non è più viola LO STATO.

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(); 
} 

Mi chiedo se c'è un modo per rendere un metodo di refactoring personalizzato in IntelliJ che consolidare questi due passaggi in una sola.

EDIT Ho ricevuto una risposta da JetBrains con un collegamento a una richiesta di funzione preesistente. Per favore vota se lo trovi utile!

Ciao Michael,

sembra che abbiamo richiesta simile in YouTrack: https://youtrack.jetbrains.com/issue/IDEA-122400. Sentiti libero di votare e lasciare commenti.

Con i migliori saluti, Yaroslav Bedrov JetBrains

EDIT C'è almeno un modo per verificare la presenza di Legge di Demetra problemi. screenshot http://i59.tinypic.com/2s80ft0.png

Here is a gist che contiene un profilo di ispezione che cercherà solo le violazioni di LoD. È possibile import it into IntelliJ.

+0

Mi chiedo se è possibile eseguire in un solo passaggio con la versione corrente IDEA (v14), non ho trovato alcun comando singolo appropriato. Potrebbe essere una buona idea inviare una richiesta di funzione se questa funzione è davvero mancante. – erkfel

+1

@erkfel I è attualmente in fase di revisione. Il link non sembra ancora attivo, ma dovrebbe essere qui: https://intellij-support.jetbrains.com/hc/en-us/requests/66429 – michaelsnowden

+1

@erkfel Vedi la mia modifica e checkout https: // youtrack .jetbrains.com/problema/IDEA-122400 – michaelsnowden

risposta

1

Dopo aver aggiunto il metodo getFooX()-Bar, vorrei utilizzare Modifica>Trova>Sostituire Strutturalmente con le seguenti espressioni:

Ricerca modello:

$instance$.getFoo().getX() 

modello di sostituzione:

$instance$.getFooX() 

Fa perfettamente il lavoro. Forse puoi aggiungere alcuni vincoli alla variabile $instance$ per restringere la ricerca, ma ciò sarebbe utile solo se avessi più classi con quel nome di metodo.

Problemi correlati