From e81b7e76f0df1119ee8663e9960d53d71a61a243 Mon Sep 17 00:00:00 2001 From: jhugunin Date: Wed, 27 Aug 2003 20:35:31 +0000 Subject: revised section 4 (untested) --- docs/teaching/exercises/index.html | 68 +++++++++++++++----------------------- 1 file changed, 26 insertions(+), 42 deletions(-) (limited to 'docs/teaching/exercises/index.html') diff --git a/docs/teaching/exercises/index.html b/docs/teaching/exercises/index.html index c69192e46..20671cdcf 100644 --- a/docs/teaching/exercises/index.html +++ b/docs/teaching/exercises/index.html @@ -638,50 +638,32 @@ handle those points contained in Lines and Boxes only if time permits.

a. Make a constant override

+

Problem: Pass tests.Test4a.

+ +

Tools: around, + FigureElement.MAX_BOUNDS +

+

Group's getBounds() method could be understood to be a conservative approximation of the bounding box of a group. If that is true, then it would be a legal (and much faster) implementation of getBounds() to simply always return a -rectangle consisting of the entire canvas, that is +rectangle consisting of the entire canvas. The entire canvas is returned +by the static method FigureElement.MAX_BOUNDS.

-
-new Rectangle(FigureElement.MIN_VALUE, FigureElement.MIN_VALUE, 
-              FigureElement.MAX_VALUE - FigureElement.MIN_VALUE,
-              FigureElement.MAX_VALUE - FigureElement.MIN_VALUE)
-
-

Write an aspect to implement this change. You can override Group's getBounds() method entirely with around advice intercepting the method.

-

Your code should pass the JUnit test case -tests.Test4a with this change. -

+

b. Make a constant cache

-

Answer: +

Problem: Pass tests.Test4b.

-
-package answers;
-
-import figures.*;
-import java.awt.Rectangle;
-
-aspect Answer4a {
-    private Rectangle wholeCanvas =
-        new Rectangle(FigureElement.MIN_VALUE, FigureElement.MIN_VALUE, 
-                      FigureElement.MAX_VALUE - FigureElement.MIN_VALUE,
-                      FigureElement.MAX_VALUE - FigureElement.MIN_VALUE);
-
-    Rectangle around(): execution(Rectangle Group.getBounds()) {
-        return wholeCanvas;
-    }
-}
-
- -

b. Make a constant cache

+

Tools: private Rectangle Group.mumble; +

Instead of making the (very) conservative approximation of getBounds() from part (a), write an aspect instead that @@ -693,25 +675,27 @@ call.

Hint: You can use an inter-type declaration to keep some state for every Group object.

-

Your code should pass the JUnit test case -tests.Test4b with this change. -

-

c. Invalidate, part 1

+

Problem: Pass tests.Test4c. +

+ +

Tools: before +

+

While caching in this way does save computation, it will lead to incorrect bounding boxes if a Group is ever moved. Change your aspect so that it invalidates the cache whenever the move() method of Group is called.

-

Your code should pass the JUnit test case -tests.Test4c with this change. -

-

d. Invalidate, part 2

+

Problem: Pass tests.Test4d.

+ +

Tools: your solution to 3c

+

Of course, part (c) didn't really solve the problem. What if a Point that is part of a Group moves? Whenever either of a Point's fields are set it should invalidate the @@ -720,12 +704,12 @@ modify your invalidation criteria in this way, but note that this is slightly different than the problem in 3c: Here you care about fields, where there you cared about method calls.

-

Your code should pass the JUnit test case -tests.Test4d with this change. -

-

e. Invalidate, part 3

+

Problem: Pass tests.Test4e.

+ +

Tools: You're on you're own

+

Did you really do part (d) correctly? Run the JUnit test tests.Test4e to see. If you pass, congratulations, now go help other people. Otherwise, you have fallen prey to our cruel -- cgit v1.2.3