Download Slides - TAIC PART 2010

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Mining API Popularity
# projects using an API element
40
35
30
junit.framework.TestSuite
javax.swing.JScrollPane
javax.swing.border.Border
25
20
15
10
junit.framework.AssertionFailedError
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
time span
Jan 2009
Yana Mileva,Valentin Dallmeier, Andres Zeller
Saarland University, Germany
Mining API Popularity
java.io.StringBufferInputStream
API
java.io.StringReader
java.io.PrintStream
...
Mining API Popularity
popular/used
unpopular/unused
Mining API Popularity
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class BcelTypeMunger extends ConcreteTypeMunger {
import java.util.Iterator;
import java.util.List;
private boolean mungeNewParent(BcelClassWeaver weaver)
import java.util.Set;
import java.util.Iterator;
{
import java.util.List;
LazyClassGen
target = weaver.getLazyClassGen();
public class
BcelTypeMunger
extends ConcreteTypeMunger
{
import
java.util.Set;
boolean cont = true;
cont = weaver)
enforce_abstractMethods(weaver);
private
boolean
public
classmungeNewParent(BcelClassWeaver
BcelTypeMunger extends ConcreteTypeMunger
{
{
List methods = newParent.getWithoutIter(true);
LazyClassGen
target =mungeNewParent(BcelClassWeaver
weaver.getLazyClassGen();
private boolean
weaver)
for (int i = 0; i < method.size(); i++){
boolean
cont = true;
{
import
java.util.Iterator;
ResolvedMember
superMethod = iter.next();
cont = enforce_abstractMethods(weaver);
LazyClassGen target = weaver.getLazyClassGen();
import java.util.List;
}
boolean cont = true;
import
java.util.Set;
}
List methods
= newParent.getWithoutIter(true);
cont
= enforce_abstractMethods(weaver);
for (int i = 0; i < method.size(); i++){
public classsuperMethod
BcelTypeMunger
extends ConcreteTypeMunger {
ResolvedMember
= iter.next();
List methods = newParent.getWithoutIter(true);
}
for (int i = 0; i < method.size(); i++){
private boolean mungeNewParent(BcelClassWeaver weaver)
}
ResolvedMember superMethod = iter.next();
{
}
LazyClassGen target = weaver.getLazyClassGen();
}
import java.util.Iterator;
boolean cont = true;
import java.util.List;
cont
= enforce_abstractMethods(weaver);
import
java.util.Iterator;
import java.util.Set;
import java.util.List;
List
methods
= newParent.getWithoutIter(true);
import
java.util.Set;
public class BcelTypeMunger extends ConcreteTypeMunger
for (int {i = 0; i < method.size(); i++){
superMethod
= iter.next();
publicResolvedMember
class BcelTypeMunger
extends
ConcreteTypeMunger {
private boolean mungeNewParent(BcelClassWeaver
weaver)
}
{
}
private boolean mungeNewParent(BcelClassWeaver weaver)
LazyClassGen target = weaver.getLazyClassGen();
{
boolean cont = true;
LazyClassGen target = weaver.getLazyClassGen();
cont = enforce_abstractMethods(weaver);
boolean cont = true;
cont = enforce_abstractMethods(weaver);
List methods = newParent.getWithoutIter(true);
for (int i = 0; i < method.size(); i++){
List methods = newParent.getWithoutIter(true);
ResolvedMember superMethod = iter.next();
for (int i = 0; i < method.size(); i++){
}
ResolvedMember superMethod = iter.next();
}
}
}
Mining API Popularity
• API quality
• API usability
• API compatibility
• ...
How was it till now?
bug-tracking systems
forums
• API quality
• API usability
• API compatibility
• ...
documentation
emails and groups
Mining API Popularity
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class BcelTypeMunger extends ConcreteTypeMunger {
import java.util.Iterator;
import java.util.Iterator;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
private boolean mungeNewParent(BcelClassWeaver weaver)
{
LazyClassGen target = weaver.getLazyClassGen();
boolean cont = true;
cont = enforce_abstractMethods(weaver);
public class BcelTypeMunger extends ConcreteTypeMunger
{
public class BcelTypeMunger extends
List methods = newParent.getWithoutIter(true);
private boolean
mungeNewParent(BcelClassWeaver
weaver)
ConcreteTypeMunger
{
for (int i = 0; i < method.size(); i++){
import java.util.Iterator;
ResolvedMember superMethod = iter.next();
LazyClassGen target = weaver.getLazyClassGen();
ts
{
ResolvedMember superMethod = iter.next();
{
LazyClassGen target = weaver.getLazyClassGen();
boolean cont = true;
cont
= enforce_abstractMethods(weaver);
import
java.util.Iterator;
0
}
}
import java.util.Iterator;
import java.util.List;
import java.util.Set;
Pr
oj
ec
java.util.List;
}
private boolean import
mungeNewParent
boolean cont = true;
import java.util.Set;
}
= enforce_abstractMethods(weaver);
(BcelClassWeaver cont
weaver)
public class BcelTypeMunger extends ConcreteTypeMunger {
{
List methods = newParent.getWithoutIter(true);
for (int
i < method.size(); i++){
LazyClassGen target
= i = 0;
private
boolean mungeNewParent(BcelClassWeaver weaver)
20
import java.util.List;
List
methods
= newParent.getWithoutIter(true);
import
java.util.Set;
public class BcelTypeMunger extends ConcreteTypeMunger
for (int {i = 0; i < method.size(); i++){
superMethod
= iter.next();
publicResolvedMember
class BcelTypeMunger
extends
ConcreteTypeMunger {
private boolean mungeNewParent(BcelClassWeaver
weaver)
}
{
}
private boolean mungeNewParent(BcelClassWeaver weaver)
LazyClassGen target = weaver.getLazyClassGen();
{
boolean cont = true;
LazyClassGen target = weaver.getLazyClassGen();
cont = enforce_abstractMethods(weaver);
boolean cont = true;
cont = enforce_abstractMethods(weaver);
List methods = newParent.getWithoutIter(true);
for (int i = 0; i < method.size(); i++){
List methods = newParent.getWithoutIter(true);
ResolvedMember superMethod = iter.next();
for (int i = 0; i < method.size(); i++){
}
ResolvedMember superMethod = iter.next();
}
}
}
Jan’08
Jan’09
Mining API Popularity
import java.util.Iterator;
import java.util.List;
import java.util.Set;
40
import java.util.Iterator;
import java.util.Iterator;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
private boolean mungeNewParent(BcelClassWeaver weaver)
{
LazyClassGen target = weaver.getLazyClassGen();
boolean cont = true;
cont = enforce_abstractMethods(weaver);
public class BcelTypeMunger extends ConcreteTypeMunger
{
public class BcelTypeMunger extends
List methods = newParent.getWithoutIter(true);
private boolean
mungeNewParent(BcelClassWeaver
weaver)
ConcreteTypeMunger
{
for (int i = 0; i < method.size(); i++){
import java.util.Iterator;
ResolvedMember superMethod = iter.next();
LazyClassGen target = weaver.getLazyClassGen();
import
java.util.List;
}
mungeNewParent
boolean cont = true;
import java.util.Set;
}
cont = enforce_abstractMethods(weaver);
ts
{
{
ResolvedMember superMethod = iter.next();
LazyClassGen target = weaver.getLazyClassGen();
boolean cont = true;
cont
= enforce_abstractMethods(weaver);
import
java.util.Iterator;
0
}
}
import java.util.Iterator;
import java.util.List;
import java.util.Set;
Pr
oj
ec
private boolean
(BcelClassWeaver weaver)
public class BcelTypeMunger extends ConcreteTypeMunger {
{
List methods = newParent.getWithoutIter(true);
for (int
i < method.size(); i++){
LazyClassGen target
= i = 0;
private
boolean mungeNewParent(BcelClassWeaver weaver)
20
import java.util.List;
List
methods
= newParent.getWithoutIter(true);
import
java.util.Set;
public class BcelTypeMunger extends ConcreteTypeMunger
for (int {i = 0; i < method.size(); i++){
ResolvedMember
superMethod
= iter.next();
public class BcelTypeMunger
extends
ConcreteTypeMunger {
private boolean mungeNewParent(BcelClassWeaver
weaver)
}
{
}
private boolean mungeNewParent(BcelClassWeaver weaver)
LazyClassGen target = weaver.getLazyClassGen();
{
boolean cont = true;
LazyClassGen target = weaver.getLazyClassGen();
cont = enforce_abstractMethods(weaver);
boolean cont = true;
cont = enforce_abstractMethods(weaver);
List methods = newParent.getWithoutIter(true);
for (int i = 0; i < method.size(); i++){
List methods = newParent.getWithoutIter(true);
ResolvedMember superMethod = iter.next();
for (int i = 0; i < method.size(); i++){
}
ResolvedMember superMethod = iter.next();
}
}
}
Jan’08
Jan’09
# projects using an API element
public class BcelTypeMunger extends ConcreteTypeMunger {
35
30
junit.framework.TestSuite
javax.swing.JScrollPane
javax.swing.border.Border
25
20
15
10
junit.framework.AssertionFailedError
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
time span
usage trends
Jan 2009
Who would benefit?
# projects using an API element
40
35
30
junit.framework.TestSuite
javax.swing.JScrollPane
javax.swing.border.Border
25
20
15
10
junit.framework.AssertionFailedError
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
API users
time span
Jan 2009
API producers
API users
always want to use the best product
want free of defects software
don’t want to waste time
API producers
want to produce good product
want feedback from the users
Examples
junit.framework.AssertionFailerError
compatibility problems
# projects using an API element
40
35
30
junit.framework.TestSuite
javax.swing.JScrollPane
javax.swing.border.Border
25
java.io.StringBufferInputStream
code defect
20
15
10
junit.framework.AssertionFailedError
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
time span
Jan 2009
java.lang.String - code smell
Hypothesis
The past usage trend of an API element is
predictive of the future usage trend of the
same element.
Evaluation Scenario
junit.framework.AssertionFailerError
35
30
Oct 2008
junit.framework.TestSuite
javax.swing.JScrollPane
javax.swing.border.Border
25
Jan 2009
8 months
20
15
10
junit.framework.AssertionFailedError
40
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
# projects using an API element
Jan 2008
# projects using an API element
40
35
30
junit.framework.TestSuite
time
span
javax.swing.JScrollPane
Jan 2009
javax.swing.border.Border
13 months
25
20
15
10
junit.framework.AssertionFailedError
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
time span
Jan 2009
Evaluation Results
Trends
67%
33%
0%
1%
98%
1%
0%
18%
82%
Restrictions
• The approach might cancel itself? No.
• Unused imports remain in code? No.
• Works only for Java? No.
Future Work
• Find reasons behind a decline in usage.
• Target the recommendations better.
• Analyze more data.
• Make user surveys.
How was it till now?
bug-tracking systems
forums
• API quality
• API usability
• API compatibility
• ...
documentation
emails and groups
# projects using an API element
40
35
30
junit.framework.TestSuite
javax.swing.JScrollPane
javax.swing.border.Border
25
20
15
10
junit.framework.AssertionFailedError
java.io.StringBufferInputStream
java.lang.String
5
Jan 2008
Evaluation Results
Trends
67%
33%
0%
1%
98%
1%
0%
18%
82%
22
time span
Future Work
• Find reasons behind a decline in usage.
• Target the recommendations better.
• Analyze more data.
• Make user surveys.
Jan 2009
Related documents