タイトルの通り,ラムダ式を使ったリファクタリング方法を紹介している.
プログラミング言語は日々進化している. オブジェクト指向として設計されているJavaは,2014年に関数型言語の特徴を取り入れた. その一つがラムダ式である. Java内ではラムダ式は主に匿名関数の糖衣構文として使え,使うことで可読性の向上に繋がると考えられる. そのため,ラムダ式を用いてリファクタリングを行うことは有効である.
一方で,手動でのリファクタリングは誤ってバグを混入させてしまう可能性が指摘されている. その為,リファクタリングを行う際には,IDEなどを用いて自動で行うのが望ましい. しかし,それ以前に提案されてきたラムダ式でのリファクタリング手法はIDEではサポートされていない. 一方で,IDEですでにサポートされているリファクタリング手法は,実証的な評価がなされていない. そこで本論文では,リファクタリングカタログとしてすでに存在している,あるいは新たに提案する10個のリファクタリング手法を紹介し,その有効性を実験し,さらにEclipseのプラグインとして実装している.
紹介しているリファクタリング手法は以下の通りである.
// Before
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
print("Hello");
}
}
// After
ActionListener al = e -> print("Hello");
// Before
Collection<Person> people = ...;
for (Person person : people) {
print(person.getName());
}
// After
Collection<Person> people = ...;
people.forEach(person -> print(person.getName()));
// Before
Collections.sort(people,
new Comparator<Person> {
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
})
// After
people.sort((person) -> p1.getName().compareTo(p2.getName()));
// Before
for (Person person : people) {
if (person.isMale()) {
print(person.getName());
}
}
// After
people.stream()
.filter(Person::isMale)
.forEach(person -> print(person.getName()));
// Before
public interface Listener {
void select(Object object);
}
// After
public interface Consumer<T> {
void accept(T t);
}
// Before
List<Person> list = ...;
list.sort((p1, p2) -> p1.getName().compareTo(p2.getName()));
public class Person {
...
}
// After
List<Person> list = ...;
list.sort(Person::compareName);
public class Person {
...
public static int compareName(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
こういうリファクタリングカタログ系の論文が増えてくれると嬉しい.