V tomto článku si ukážeme použití RefactoringNG při evoluci rozhraní. Jde o problém, který popisuje Dagi.

Dejme tomu, že ve verzi 1.0 našeho API máme rozhraní Plugin:

 public interface Plugin {
...
}

Ve verzi 2.0 přidáme do tohoto rozhraní metodu go:

 public interface Plugin {
...
void go();
}

Tato změna vyžaduje, aby každý klient, který chce přejít z API verze 1.0 na verzi 2.0, přidal do tříd, jež implementují rozhraní Plugin, implementaci metody go. To můžeme provést buď ručně nebo provedením následujícího pravidla v RefactoringNG:

 Class [id: c, elementKind: CLASS] {
Modifiers [id: mods],
List<TypeParameter> { },
Identifier [id: parent, nullable: true],
List<Tree> [id: implements, minSize: 1, maxSize: *] {
Identifier [elementKind: INTERFACE, qualifiedName: "api.Plugin", pos: *]
},
List<Tree> [id: body]
} ->
Class [elementKind: CLASS, simpleName: c#simpleName] {
Modifiers [ref: mods],
List<TypeParameter> { },
Identifier [ref: parent],
List<Tree> [ref: implements],
List<Tree> {
ListItems [ref: body],
Method [name: "go"] {
Modifiers {
List<Annotation> { },
Set<Modifier> { PUBLIC }
},
List<TypeParameter> { },
PrimitiveType [primitiveTypeKind: VOID],
List<Variable> { },
List<Expression> { },
Block {
List<Statement> { }
},
null
}
}
}

Toto pravidlo přidá do každé třídy, která implementuje rozhraní Plugin, prázdnou metodu go. K přechodu na novou verzi API pak postačuje toto pravidlo provést.