]> source.dussan.org Git - aspectj.git/commitdiff
revised section 4 (untested)
authorjhugunin <jhugunin>
Wed, 27 Aug 2003 20:35:31 +0000 (20:35 +0000)
committerjhugunin <jhugunin>
Wed, 27 Aug 2003 20:35:31 +0000 (20:35 +0000)
13 files changed:
docs/teaching/exercises/answers/Answer4a.java
docs/teaching/exercises/answers/Answer4b.java
docs/teaching/exercises/answers/Answer4c.java
docs/teaching/exercises/answers/Answer4d.java
docs/teaching/exercises/answers/Answer4e.java
docs/teaching/exercises/figures/FigureElement.java
docs/teaching/exercises/index.html
docs/teaching/exercises/tests/Test.java
docs/teaching/exercises/tests/Test4a.java
docs/teaching/exercises/tests/Test4b.java
docs/teaching/exercises/tests/Test4c.java
docs/teaching/exercises/tests/Test4d.java
docs/teaching/exercises/tests/Test4e.java

index fd0e2e684da6eea05ac684e6e386191c86a2361f..e99eb12667ad9fcd2284f544827abadf8405f8e4 100644 (file)
@@ -17,12 +17,7 @@ import figures.Group;
 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;
+        return FigureElement.MAX_BOUNDS;
     }
 }
index 4fd5354c151cb2df77abdc8f16a4acfdd5aeb5f2..33649c4e1be792c227a2ce444a4f1f29c3bc5ba0 100644 (file)
@@ -20,7 +20,8 @@ aspect Answer4b {
     private Rectangle Group.cache = null;
 
     Rectangle around(Group g):
-            execution(Rectangle Group.getBounds()) && this(g) {
+            execution(Rectangle Group.getBounds()) && this(g)
+    {
         if (g.cache == null) {
             g.cache = proceed(g);
         }
index 35f4b90af92734a03e240ff36ad3754f646ee0aa..75e1123dd2c61020510b562e056f6198fcfa5db7 100644 (file)
@@ -20,7 +20,8 @@ aspect Answer4c {
     private Rectangle Group.cache = null;
 
     Rectangle around(Group g):
-            execution(Rectangle Group.getBounds()) && this(g) {
+            execution(Rectangle Group.getBounds()) && this(g)
+    {
         if (g.cache == null) {
             g.cache = proceed(g);
         }
index f2127836ab28ede702c57bcec58190709fd645fb..58d31d44c6cc33f5820525fa5098db8fe5a8177c 100644 (file)
@@ -22,12 +22,14 @@ aspect Answer4d {
     private Group Point.enclosingGroup = null;
 
     before(Point p, Group g):
-        execution(void add(FigureElement)) && args(p) && target(g) {
+        execution(void add(FigureElement)) && args(p) && target(g)
+    {
         p.enclosingGroup = g;
     }
 
     Rectangle around(Group g):
-            execution(Rectangle Group.getBounds()) && this(g) {
+            execution(Rectangle Group.getBounds()) && this(g)
+    {
         if (g.cache == null) {
             g.cache = proceed(g);
         }
index bab9e2afde00235310b69bdc0298dd231ae09c33..2a6e0aefd36c201cccf2f3bcaeee3edfa2c3fe5d 100644 (file)
@@ -22,12 +22,14 @@ aspect Answer4e {
     private Group FigureElement.enclosingGroup = null;
 
     before(FigureElement p, Group g):
-        execution(void add(FigureElement)) && args(p) && target(g) {
+        execution(void add(FigureElement)) && args(p) && target(g)
+    {
         p.enclosingGroup = g;
     }
 
     Rectangle around(Group g):
-            execution(Rectangle Group.getBounds()) && this(g) {
+            execution(Rectangle Group.getBounds()) && this(g)
+    {
         if (g.cache == null) {
             g.cache = proceed(g);
         }
index 22bb579a9a53a9c8db7e01198f9a0b7893bfb318..26cbed272dd663c5803e0cec4266f4c32eb9766a 100644 (file)
@@ -17,8 +17,8 @@ import java.awt.*;
 import java.awt.geom.*;
 
 public interface FigureElement {
-    public static final int MIN_VALUE = 0;
-    public static final int MAX_VALUE = 500;
+    public static final Rectangle MAX_BOUNDS = 
+        new Rectangle(0, 0, 500, 500);
 
     public abstract void move(int dx, int dy);
 
index c69192e46c03d729596da3c854d5f6921e9afc9b..20671cdcfb4b5c7db97942ae81a04947451cae59 100644 (file)
@@ -638,50 +638,32 @@ handle those points contained in Lines and Boxes only if time permits.
 
 <h3>a. Make a constant override</h3>
 
+<p> <strong>Problem:</strong> Pass <code>tests.Test4a</code>.</p>
+
+<p> <strong>Tools:</strong> <code>around</code>, 
+               <code>FigureElement.MAX_BOUNDS</code>
+</p>
+
 <p> <code>Group</code>'s <code>getBounds()</code> 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 <code>getBounds()</code> 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 <code>FigureElement.MAX_BOUNDS</code>.
 </p>
 
-<blockquote><PRE>
-new Rectangle(FigureElement.MIN_VALUE, FigureElement.MIN_VALUE, 
-              FigureElement.MAX_VALUE - FigureElement.MIN_VALUE,
-              FigureElement.MAX_VALUE - FigureElement.MIN_VALUE)
-</PRE></blockquote>
-
 <p> Write an aspect to implement this change.  You can override
 <code>Group</code>'s <code>getBounds()</code> method entirely with
 around advice intercepting the method.  
 </p>
 
-<p> Your code should pass the JUnit test case
-<code>tests.Test4a</code> with this change.
-</p>
+<h3>b. Make a constant cache</h3>
 
-<p> <strong>Answer: </strong>
+<p> <strong>Problem:</strong> Pass <code>tests.Test4b</code>.
 </p>
 
-<blockquote><PRE>
-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;
-    }
-}
-</PRE></blockquote>
-
-<h3>b. Make a constant cache</h3>
+<p> <strong>Tools:</strong> <code>private Rectangle Group.mumble;</code>
+</p>
 
 <p> Instead of making the (very) conservative approximation of
 <code>getBounds()</code> from part (a), write an aspect instead that
@@ -693,25 +675,27 @@ call. </p>
 <p> <em>Hint: You can use an inter-type declaration to keep some
 state for every <code>Group</code> object.</em> </p>
 
-<p> Your code should pass the JUnit test case
-<code>tests.Test4b</code> with this change.
-</p>
-
 
 <h3>c. Invalidate, part 1</h3>
 
+<p> <strong>Problem:</strong> Pass <code>tests.Test4c</code>.
+</p>
+
+<p> <strong>Tools:</strong> <code>before</code>
+</p>
+
 <p> While caching in this way does save computation, it will lead to
 incorrect bounding boxes if a <code>Group</code> is ever moved.
 Change your aspect so that it invalidates the cache whenever the
 <code>move()</code> method of <code>Group</code> is called. 
 </p>
 
-<p> Your code should pass the JUnit test case
-<code>tests.Test4c</code> with this change.
-</p>
-
 <h3>d. Invalidate, part 2</h3>
 
+<p> <strong>Problem:</strong> Pass <code>tests.Test4d</code>.</p>
+
+<p> <strong>Tools:</strong> <code>your solution to 3c</code></p>
+
 <p> Of course, part (c) didn't really solve the problem.  What if a
 <code>Point</code> that is part of a <code>Group</code> 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. </p>
 
-<p> Your code should pass the JUnit test case
-<code>tests.Test4d</code> with this change.
-</p>
-
 <h3>e. Invalidate, part 3</h3>
 
+<p> <strong>Problem:</strong> Pass <code>tests.Test4e</code>.</p>
+
+<p> <strong>Tools:</strong> <em>You're on you're own</em></p>
+
 <p> Did you really do part (d) correctly?  Run the JUnit test
 <code>tests.Test4e</code> to see.  If you pass, congratulations, now
 go help other people.  Otherwise, you have fallen prey to our cruel
index 17d8b12e61a255fe0dd4a0afde38f1b7d95cc94c..d6d3bb4e6e0d5adf83b8c3c6b9d7c198d86f581c 100644 (file)
@@ -18,6 +18,7 @@ import junit.framework.*;
 
 public class Test extends TestCase {
     public Test(String name) { super(name); }
+    public Test() {}
 
     public static void main(String[] args) {
         junit.textui.TestRunner.run(Test.class);
index 7e8f0f2347da060787eed0a75c67909bc0333733..f3644765f95ee79f30037e5e0b71155f12b8cdd3 100644 (file)
@@ -18,21 +18,11 @@ import java.awt.Rectangle;
 import junit.framework.*;
 
 public class Test4a extends Test {
-    Rectangle wholeCanvas =
-        new Rectangle(FigureElement.MIN_VALUE, FigureElement.MIN_VALUE,
-                      FigureElement.MAX_VALUE, FigureElement.MAX_VALUE);
-
-    public Test4a(String name) { super(name); }
-
     public static void main(String[] args) {
         junit.textui.TestRunner.run(Test4a.class);
     }
 
-    public void setUp() {
-        super.setUp();
-    }
-
     public void testGroupBounds() {
-        assertEquals(g.getBounds(), wholeCanvas);
+        assertEquals(g.getBounds(), FigureElement.MAX_BOUNDS);
     }
 }
index 31bea52096ec446319243d0d6b8ba54f8fccf4f2..adc891008cb4c41e0724a2cd7a68fd653ad7a8e8 100644 (file)
@@ -18,17 +18,10 @@ import java.awt.Rectangle;
 import junit.framework.*;
 
 public class Test4b extends Test {
-
-    public Test4b(String name) { super(name); }
-
     public static void main(String[] args) {
         junit.textui.TestRunner.run(Test4b.class);
     }
 
-    public void setUp() {
-        super.setUp();
-    }
-
     public void testBasicEquality() {
         assertTrue(g.getBounds() == g.getBounds());
     }
@@ -58,12 +51,9 @@ public class Test4b extends Test {
 
     public void testNotWholeCanvas() {
         assertTrue("bounds for this group should not be the whole canvas",
-                   g.getBounds().getWidth() <
-                   (FigureElement.MAX_VALUE - FigureElement.MIN_VALUE));
+            g.getBounds().getWidth() < FigureElement.MAX_BOUNDS.getWidth());
         assertTrue("bounds for this group should not be the whole canvas",
-                   g.getBounds().getHeight() <
-                   (FigureElement.MAX_VALUE - FigureElement.MIN_VALUE));
-
+            g.getBounds().getHeight() < FigureElement.MAX_BOUNDS.getHeight());
     }
 }
 
index 1f30a9ae34aaa8ffac7fa53067bd13da5298996e..c4c5928ce83b9381ba310f735a7d1665b3dc02bc 100644 (file)
@@ -18,17 +18,10 @@ import java.awt.Rectangle;
 import junit.framework.*;
 
 public class Test4c extends Test {
-
-    public Test4c(String name) { super(name); }
-
     public static void main(String[] args) {
         junit.textui.TestRunner.run(Test4c.class);
     }
 
-    public void setUp() {
-        super.setUp();
-    }
-
     public void testBasicEquality() {
         assertTrue(g.getBounds() == g.getBounds());
     }
index c1871cfd080dfdd1bba19cfe1e4e3752d40333ea..234422235336449ee1e93fb23f6f19f9757ec5f8 100644 (file)
@@ -25,10 +25,6 @@ public class Test4d extends Test {
         junit.textui.TestRunner.run(Test4d.class);
     }
 
-    public void setUp() {
-        super.setUp();
-    }
-
     public void testBasicEquality() {
         assertTrue(g.getBounds() == g.getBounds());
     }
index 91710b0eac6c7e3adb95af6bd780be1a1dba7ccb..3fe4689ee7723aabdf7036afd9dd498fdca4db17 100644 (file)
@@ -25,10 +25,6 @@ public class Test4e extends Test {
         junit.textui.TestRunner.run(Test4e.class);
     }
 
-    public void setUp() {
-        super.setUp();
-    }
-
     public void testBasicEquality() {
         assertTrue(g.getBounds() == g.getBounds());
     }