aboutsummaryrefslogtreecommitdiffstats
path: root/docs/teaching/exercises
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2003-08-27 20:35:31 +0000
committerjhugunin <jhugunin>2003-08-27 20:35:31 +0000
commite81b7e76f0df1119ee8663e9960d53d71a61a243 (patch)
treedf74946b8dbdd8c30cc33fbe3af8cb0fb2076add /docs/teaching/exercises
parent9ae0cfecd5fa4cc15c30c2231ba5b7de2a86e882 (diff)
downloadaspectj-e81b7e76f0df1119ee8663e9960d53d71a61a243.tar.gz
aspectj-e81b7e76f0df1119ee8663e9960d53d71a61a243.zip
revised section 4 (untested)
Diffstat (limited to 'docs/teaching/exercises')
-rw-r--r--docs/teaching/exercises/answers/Answer4a.java7
-rw-r--r--docs/teaching/exercises/answers/Answer4b.java3
-rw-r--r--docs/teaching/exercises/answers/Answer4c.java3
-rw-r--r--docs/teaching/exercises/answers/Answer4d.java6
-rw-r--r--docs/teaching/exercises/answers/Answer4e.java6
-rw-r--r--docs/teaching/exercises/figures/FigureElement.java4
-rw-r--r--docs/teaching/exercises/index.html68
-rw-r--r--docs/teaching/exercises/tests/Test.java1
-rw-r--r--docs/teaching/exercises/tests/Test4a.java12
-rw-r--r--docs/teaching/exercises/tests/Test4b.java14
-rw-r--r--docs/teaching/exercises/tests/Test4c.java7
-rw-r--r--docs/teaching/exercises/tests/Test4d.java4
-rw-r--r--docs/teaching/exercises/tests/Test4e.java4
13 files changed, 45 insertions, 94 deletions
diff --git a/docs/teaching/exercises/answers/Answer4a.java b/docs/teaching/exercises/answers/Answer4a.java
index fd0e2e684..e99eb1266 100644
--- a/docs/teaching/exercises/answers/Answer4a.java
+++ b/docs/teaching/exercises/answers/Answer4a.java
@@ -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;
}
}
diff --git a/docs/teaching/exercises/answers/Answer4b.java b/docs/teaching/exercises/answers/Answer4b.java
index 4fd5354c1..33649c4e1 100644
--- a/docs/teaching/exercises/answers/Answer4b.java
+++ b/docs/teaching/exercises/answers/Answer4b.java
@@ -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);
}
diff --git a/docs/teaching/exercises/answers/Answer4c.java b/docs/teaching/exercises/answers/Answer4c.java
index 35f4b90af..75e1123dd 100644
--- a/docs/teaching/exercises/answers/Answer4c.java
+++ b/docs/teaching/exercises/answers/Answer4c.java
@@ -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);
}
diff --git a/docs/teaching/exercises/answers/Answer4d.java b/docs/teaching/exercises/answers/Answer4d.java
index f2127836a..58d31d44c 100644
--- a/docs/teaching/exercises/answers/Answer4d.java
+++ b/docs/teaching/exercises/answers/Answer4d.java
@@ -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);
}
diff --git a/docs/teaching/exercises/answers/Answer4e.java b/docs/teaching/exercises/answers/Answer4e.java
index bab9e2afd..2a6e0aefd 100644
--- a/docs/teaching/exercises/answers/Answer4e.java
+++ b/docs/teaching/exercises/answers/Answer4e.java
@@ -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);
}
diff --git a/docs/teaching/exercises/figures/FigureElement.java b/docs/teaching/exercises/figures/FigureElement.java
index 22bb579a9..26cbed272 100644
--- a/docs/teaching/exercises/figures/FigureElement.java
+++ b/docs/teaching/exercises/figures/FigureElement.java
@@ -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);
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.
<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
diff --git a/docs/teaching/exercises/tests/Test.java b/docs/teaching/exercises/tests/Test.java
index 17d8b12e6..d6d3bb4e6 100644
--- a/docs/teaching/exercises/tests/Test.java
+++ b/docs/teaching/exercises/tests/Test.java
@@ -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);
diff --git a/docs/teaching/exercises/tests/Test4a.java b/docs/teaching/exercises/tests/Test4a.java
index 7e8f0f234..f3644765f 100644
--- a/docs/teaching/exercises/tests/Test4a.java
+++ b/docs/teaching/exercises/tests/Test4a.java
@@ -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);
}
}
diff --git a/docs/teaching/exercises/tests/Test4b.java b/docs/teaching/exercises/tests/Test4b.java
index 31bea5209..adc891008 100644
--- a/docs/teaching/exercises/tests/Test4b.java
+++ b/docs/teaching/exercises/tests/Test4b.java
@@ -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());
}
}
diff --git a/docs/teaching/exercises/tests/Test4c.java b/docs/teaching/exercises/tests/Test4c.java
index 1f30a9ae3..c4c5928ce 100644
--- a/docs/teaching/exercises/tests/Test4c.java
+++ b/docs/teaching/exercises/tests/Test4c.java
@@ -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());
}
diff --git a/docs/teaching/exercises/tests/Test4d.java b/docs/teaching/exercises/tests/Test4d.java
index c1871cfd0..234422235 100644
--- a/docs/teaching/exercises/tests/Test4d.java
+++ b/docs/teaching/exercises/tests/Test4d.java
@@ -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());
}
diff --git a/docs/teaching/exercises/tests/Test4e.java b/docs/teaching/exercises/tests/Test4e.java
index 91710b0ea..3fe4689ee 100644
--- a/docs/teaching/exercises/tests/Test4e.java
+++ b/docs/teaching/exercises/tests/Test4e.java
@@ -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());
}