Subject: Re: progress on integration
From: Gregor Kiczales (gregor@cs.ubc.ca)
Date: Fri Feb 22 2002 - 01:47:56 EST
I'm only looking at the part of this that is the code you really want to
write. I want to to understand that before thinking about the current
implementation.
// a separate file containing traversals and class graphs
// and references to visitor interfaces
WHY IS THIS IN A SEPARATE FILE? i ASSUME THAT'S JUST A
TEMPORARY IMPLEMENTATION ISSUE?
aspect traversals {
declare salaryTraversal : "from Company to Salary";
WHY IS THE TRAVERSAL SPEC IN A STRING? IS THAT IMPORTANT?
(I ASSUME THE FACT THAT THE TRAVERSAL KEYWORD IS MISSING
AFTER DECLARE IS JUST A TYPO?)
}
// AspectJ's syntax for doing visitors
aspect Summing {
static int total;
pointcut init(): target(Company) && traversal(salaryTraversal);
I'M NOT SURE WHAT IS GAINED BY CODING INIT THIS WAY, AS OPPOSED TO
JUST SETTING TOTAL TO 0 BEFORE CALLING THE TRAVERSAL. ONE THING
THAT MIGHT BE LOSE IS THAT IT ASSUMES (IN THIS SEPARATE FILE) THAT
THE TRAVERSAL WILL NEVER TAKE US TO A COMPANY IN THE MIDDLE.
pointcut summing(Salary s): target(s) && traversal(salaryTraversal);
before():init() {total=0;}
before(Salary s):summing(s) {total += s.v;}
HOW IMPORTANT TO YOU IS IT THAT SALARY IS AN OBJECT? DOES YOUR
TRAVERSAL STUFF NOT SUPPORT VISITING NON-OBJECTS? I CAN'T IMAGINE
THAT IN THIS EXAMPLE PEOPLE WOULD ACTUALLY HAVE A SALARY OBJECT,
MOST PEOPLE WOULD USE AN INT WOULDN'T THEY?
int around(): init() {
proceed();
return total;
}
}
// totalSalaries
class Company {
int totalSalaries() {
this.SalaryTraversal(); // advised by Summing aspect
return 0;
}
}
// calling totalSalaries
class Main { ...
System.out.println("result = " + company.totalSalaries());
}
LET ME TRY MY CODE AGAIN, ADJUSTING FOR THE BIGGEST DIFFERENCE I
CAN SEE IN THE TWO, WHICH IS WHETHER SALARY IS AN OBJECT. I DID
THAT MY MAKING TWO ALTERNATIVE VERSIONS OF THE TRAVERSAL.
I'D LIKE TO KNOW WHETHER THESE FIT YOUR MODEL.
ps i'LL BE OFFLINE TOMORROW, SO I WON'T BE ABLE TO READ EMAIL AGAIN
UNTIL AT LEAST SATURDAY.
aspect SalaryTotaling {
static int total = 0;
declare traversal: visitSalaries1(int s)
Company to int s:salary via Employee;
before(int s): traverse(visitSalaries1(s)) {
total+= s;
}
declare traversal: visitSalaries2
Company to Salary;
before(Salary s): traverse(visitSalaries) && target(s) {
total+= s.intValue;
}
static int totalSalaries(Employees employees) {
total = 0;
visitSalaries(employees);
return total;
}
}
This archive was generated by hypermail 2b28 : Fri Feb 22 2002 - 01:45:18 EST