Re: progress on integration


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