Navrhli jste API, chcete v něm provést změny a děsí
vás, co to způsobí s programy, které toto API
používají? V tomto článku si na jednoduchém příkladu
ukážeme, jak vám může pomoci RefactoringNG.

Mějme třídu Ship s metodou dock:

public class Ship {

public void dock() { ... }

...

}



V rámci evoluce API metodu dock
přesuneme do třídy Harbour a uděláme
ji statickou:

public class Harbour {

public static void dock(Ship s) { ... }

...

}



Po této změně je potřeba všechna volání metody
dock na instancích třídy Ship nahradit voláním statické metody dock ze třídy Harbour. Např.,
je-li s proměnná typu Ship, musíme

s.dock();

změnit na

Harbour.dock(s);

Běžný postup je, že metodu dock ve
třídě Ship označíme @Deprecated a počkáme, až programátoři
začnou používat novou metodu ve třídě Harbour. Pomocí RefactoringNG lze přechod k
nové metodě zautomatizovat. Stačí, když definujeme
pravidlo, které nahradí volání s.dock() voláním Harbour.dock(s):

 MethodInvocation {

List<Tree> { },

MemberSelect [identifier: "dock"] {

Identifier [id: s, instanceof: "navy.Ship"]

},

List<Expression> { }

} ->

MethodInvocation {

List<Tree> { },

MemberSelect [identifier: "dock"] {

Identifier [name: "Harbour"]

},

List<Expression> {

Identifier [ref: s]

}

}



Pomocí tohoto skriptu pak programátoři mohou snadno
upgradovat svůj kód na novou verzi API.

Chcete-li se o použití RefactoringNG při evoluci
API dozvědět více, podívejte se na tento článek.