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.