V dnešním článku se seznámíme s novým
nástrojem pro refaktorování javovského kódu. Jmenuje
se RefactoringNG a jde o modul do NetBeans 6.9.
Ve srovnání s jinými nástroji nabízí RefactoringNG
velkou flexibilitu, protože refaktorizační pravidla
si zde definujeme sami. Každé refaktorizační pravidlo
popisuje transformaci nějakého abstraktního
syntaktického stromu na jiný. Např. pravidlo pro
přepis výrazu x = x + 1
na x++
vypadá takto:
// x = x + 1 -> x++
Assignment {
Identifier [name: "x"],
Binary [kind: PLUS] {
Identifier [name: "x"],
Literal [kind: INT_LITERAL, value: 1]
}
} ->
Unary [kind: POSTFIX_INCREMENT] {
Identifier [name: "x"]
}
Názvy a struktura abstraktních syntaktických stromů
jsou stejné jako v sunovském překladači Javy. Nástroj
používá Compiler Tree API (com.sun.*), formální model
jazyka v JDK API (javax.lang.model.*) a
infrastrukturu NetBeans.
K čemu se to dá použít? Např. pokud potřebujete
nahradit volání konstruktoru voláním tovární metody:
// new Position(<args>) -> Position.create(<args>)
NewClass {
null,
List<Tree>,
Identifier [name: "Position"],
List<Expression> [id: args],
null
} ->
MethodInvocation {
List<Tree> { },
MemberSelect [identifier: "create"] {
Identifier [name: "Position"]
},
List<Expression> [ref: args]
}
Nebo když do každého volání metody potřebujete
přidat argument:
// plus (<expr1>, <expr2>) -> plus (<expr1>, <expr2>, 5)
MethodInvocation {
List [size: 0],
Identifier [name: "plus"],
List<Expression> [id: args, size: 2]
} ->
MethodInvocation {
List<Tree> [size: 0],
Identifier [name: "plus"],
List<Expression> {
ListItems [ref: args],
Literal [kind: INT_LITERAL, value: 5]
}
}
Více informací můžete najít na http://kenai.com/projects/refactoringng. Modul
ke stažení je na http://kenai.com/projects/refactoringng/downloads