Migration and Refactoring - Identifying Overly Strong Conditions in Refactoring Implementations
1. Identifying overly strong conditions
in refactoring implementations
Gustavo Soares
Melina Mongiovi
Rohit Gheyi
gsoares@dsc.ufcg.edu.br
Federal University of Campina Grande
terça-feira, 11 de outubro de 2011
2. Employee
...
Salesman Engineer
... ...
name name
Duplicated code
2
terça-feira, 11 de outubro de 2011
3. Pull Up Field Refactoring
Refactoring
Employee engines Employee
... ...
name
Salesman Engineer
... ... Salesman Engineer
name name ... ...
Precondition
The name field is not declared in class Employee
3
terça-feira, 11 de outubro de 2011
4. It’s difficult to specify and
implement preconditions
preconditions
4
terça-feira, 11 de outubro de 2011
5. Problem
Overly
strong
condi0ons
prevent
safe
transforma+ons
Implemented
preconditions
Overly
weak
condi0ons
allow
unsafe
transforma+ons
5
terça-feira, 11 de outubro de 2011
6. Motivating example
A
JRRT
GetF() cannot access
B
variable f
Pull up field
private int f
int getF() : f
6
terça-feira, 11 de outubro de 2011
7. A Overly strong
JRRT
GetF() cannot access
B
variable f
Pull up field
private int f
int getF() : f
A A
protected int f
B B
Pull up field
private int f int getF() : f
int getF() : f
7
terça-feira, 11 de outubro de 2011
8. Identifying overly strong
conditions
An evaluation on 3 refactoring engines
JRRT
8
terça-feira, 11 de outubro de 2011
9. Testing
input
expected
output
9
terça-feira, 11 de outubro de 2011
10. Testing
input engine
expected
output
output
Overly strong
10
terça-feira, 11 de outubro de 2011
11. Exhaustively generating programs
input
Overly
Strong Differential testing
conditions
Overly Strong
Condition
11
terça-feira, 11 de outubro de 2011
12. 2 Class, 2 Method, 2 Field
One subclass declaring a field
12
terça-feira, 11 de outubro de 2011
13. 2 Class, 2 Method, 2 Field
One subclass declaring a field
Java Meta model Alloy Solutions Java programs
public class Class0 {
public int method2(){ { {
public class Class0
public class Class0
public int method2(){
return 10;
public int method2(){
} return 10;
return 10;
} }}
}
class Class1 extends Class0 {
}
class Class1 extends Class0 {
public int method1(){ Class0 {
class Class1 extends
public int method1(){
return 20; method1(){
public int
} return 20;
} return 20;
public int method2(){
}
public int method2(){
super.k(); method2(){
public int
} super.k();
super.k();
} }}
}
}
13
terça-feira, 11 de outubro de 2011
14. Exhaustively generating programs
input
expected
output Differential testing
Overly Strong
Condition
14
terça-feira, 11 de outubro de 2011
15. B.getF
A A
protected int f
B B
0/4 0/4
private int f int getF() : f
int getF() : f 4
No behavioral change was found
15
terça-feira, 11 de outubro de 2011
16. Classifying
overly strong
preconditions
Technique
Differential
testing
16
terça-feira, 11 de outubro de 2011
SPEC
18. Evaluation
18
terça-feira, 11 de outubro de 2011
19. Up to 10 refactorings
Refactoring Eclipse JRRT NetBeans
Rename Class X X X
Rename Method X X X
Rename Field X X X
Push Down Method X X X
Push Down Field X X X
Pull Up Method X X X
Pull Up Field X X X
Encapsulate Field X X
Move Method X X
Add Parameter X X
2 Packages, 3 classes, 4 methods, 2 fields
19
terça-feira, 11 de outubro de 2011
20. Results
Rejected Beh. Pres. Overly Strong Condition
Refactoring Program
Ecl JRRT NetB Ecl JRRT NetB
Rename Class 4660 446 0 0 2 0 0
Rename Method 4752 4802 419 0 4 1 0
Rename Field 3168 200 0 0 2 0 0
Push Down Method 9366 59 40 0 1 1 0
Push Down Field 4800 0 0 0 0 0 0
Pull Up Method 10322 251 398 0 2 2 0
Pull Up Field 4320 744 584 0 1 1 0
Encapsulate Field 900 176 1536 - 1 1 -
Move Method 3002 367 135 - 2 1 -
Add Parameter 4279 79 0 - 2 0 -
Total 42774 7124 3112 0 17 7 0
20
terça-feira, 11 de outubro de 2011
21. JRRT feedback
Refactoring Strong conditions
Rename Method overriding
has
changed
Push Down Method cannot
access
method
method
is
used
Pull Up Method
cannot
access
method
Pull Up Field cannot
access
variable
Encapsulate Field cannot
insert
method
here
Move Method cannot
inline
ambiguous
method
call
21
terça-feira, 11 de outubro de 2011
22. JRRT feedback
Refactoring Strong conditions Cause
Rename Method overriding
has
changed precondi+on
Push Down Method cannot
access
method incorrect
analysis
method
is
used incorrect
analysis
Pull Up Method
cannot
access
method incorrect
analysis
Pull Up Field cannot
access
variable
feature
not
implemented
Encapsulate Field cannot
insert
method
here feature
not
implemented
Move Method cannot
inline
ambiguous
method
call incorrect
analysis
22
terça-feira, 11 de outubro de 2011
23. Conclusions
Differential
Testing
+ Implemented
preconditions
overly strong conditions + overly weak conditions
23
terça-feira, 11 de outubro de 2011
24. Identifying overly strong conditions
in refactoring implementations
Gustavo Soares
Melina Mongiovi
Rohit Gheyi
gsoares@dsc.ufcg.edu.br
Federal University of Campina Grande
24
terça-feira, 11 de outubro de 2011