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.