Programowanie aspektowe - cwiczenia 2008/2009

Z JASR Wiki

<<< Powrót do Tworzenie aplikacji wielowarstowych 2008/2009

Spis treści

Trochę teorii

...

Ćwiczenia

Ćwiczenie 1

Przygotuj aspect przyspieszający wyliczanie liczb Fibonacciego przez podany poniżej naiwny algorytm.

public class Fib {
   static long compute(int n) {
      if (n == 0)
         return 0;
      else if (n == 1)
         return 1;
      else
         return compute(n-1)+compute(n-2); 
   }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class RunFib {
   static BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
	
   static public int readN() {
      int liczba;
      while (true) {
         System.out.println("Podaj liczbę całkowitą: ");
         try {
            liczba = new Integer(r.readLine());
            return liczba;
         } catch (IOException e) {
            System.out.println("Błąd we/wy!");
         } catch (NumberFormatException e) {
            System.out.println("Nie rozpoznano formatu liczby!");
         }
      }
   }

   public static void main(String[] args) {
      boolean finish = false;

      while (!finish) {
         int liczba = readN();
         System.out.printf("Fib(%d)=%d\n", liczba, Fib.compute(liczba));
      }
   }
}

Wskazówka

Rozwiązanie

Ćwiczenie 2

Przerób swoje poprzednie rozwiązanie tak, aby advice był wykonywany jedynie dla nierekrurencyjnych wywołań.

Wskazówka A

Rozwiązanie A

Wskazówka B

Rozwiązanie B

Ćwiczenie 3

Przygotuj aspekt wypisujący informację o wszystkich joinpointach zachodzących w kodzie podanej niżej klasy Test, gdy jest ona wykonywana.

public class Test {
   int x;

   void f() {
      System.out.println("f();");
      System.out.println("f();");
      x = 1;
   }

   public static void main(String[] args) {
      Test t = new Test();
      t.f();
   }
}

Wskazówka

Rozwiązanie

Ćwiczenie 4

Jaka jest różnica między call() i execution()? Przygotuj przykład pokazujący tą różnicę.

Wskazówka 1

Wskazówka 2

Rozwiązanie

Ćwiczenie 5

Przygotuj aspekt wypisujący coś przy pomocy System.out.println(), gdy dochodzi do wywołania System.out.println().

Wskazówka

Rozwiązanie

Ćwiczenie 6

Przygotuj aspekt zliczający nowo tworzone obiekty klasy A.

Wskazówka

Rozwiązanie

Ćwiczenie 7

Wymyśl, rozwiąż i prześlij do prowadzącego nowe ćwiczenie pasujące do tych zajęć.

Osobiste