Our study focused on the placement of contracts. We refactored all the
JC.requires, JC.ensures, and JC.invariant calls in the selected portions of the selected
target system to aspects. These methods are declared in the JC class which encapsulate
all the Java contract (assertion) operations. We used the Extract Fragment to
Advice refactoring to move contracts to aspects. Figure 1 illustrates these mechanics.
It shows a trivial example of aspectization of preconditions using a before
advice. Note that since the two methods of the class C have the same precondition ,
we were able to refactor it to single advice, hence exploring reuse opportunities.
Likewise, we modularize the postcondition in a single after returning advice. We use after returning advice since the postcondition should be established
just after the normal termination of a method. In this paper, we do not consider
exceptional postconditions. Regarding invariants, we use both before and
after returning advice for modularizing invariant constraints.
According to the semantics of invariants, they should be established just after
the normal termination of a constructor's execution and before and after execution of
every instance method of a particular class. The left hand side of Fig. 3 illustrates how scattered and tangled a Java implementation of an invariant constraint becomes.