Tópicos

  • Diagramas de sequência UML
  • O exercício de C++ deve ser entregue, em papel, nos horários de dúvidas da semana de 2014/12/15 - ex13cpp.pdf

    Exercício 1

    Desenhe o diagrama de sequência UML correspondente à execução do programa abaixo, incluindo as etapas de criação dos objectos. O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as correspondentes ao retorno).

    import java.util.ArrayList;

    abstract class Printable {

       public abstract String show();

       public void add(Printable p) { throw new UnsupportedOperationException(); }

    }

    class Paragraph extends Printable {

       public String show() { return "[paragraph]"; }

    }

    class Image extends Printable {

       public String show() { return "[image]"; }

    }

    class Album extends Printable {

       public ArrayList<Printable> _printables = new ArrayList<Printable>();

       public void add(Printable p) { _printables.add(p); }

       public String show() {

        String s = "[";

         for (Printable p: _printables) s += p.show();

          s += "]";

          return s;

        }

    }

    class Page extends Album {}

    class Book extends Album {}

    public class App {

       public static void main(String args[]) {

        Page page1 = new Page();

        page1.add(new Paragraph());

        page1.add(new Image());

        Page page2 = new Page();

        page2.add(new Paragraph());

        page2.add(new Image());

        Book book = new Book();

        book.add(page1);

        book.add(page2);

        System.out.println(book.show());

      }

    }


    [ resolução (parcial): procurar resolver antes de consultar ]

    Exercício 2

    Desenhe o diagrama de sequência UML correspondente à execução do programa abaixo, incluindo as etapas de criação dos objectos. O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as correspondentes ao retorno).

    public abstract class Ghost {

       public Ghost() { System.out.println(getClass().getName()); }

       public abstract void tick(Shell shell);

       public void tock(Shell shell) {}

    }

    public class A extends Ghost {

       public void tick(Shell shell) { shell.use( new C()); }

    }

    public class B extends Ghost {

       public void tick(Shell shell) { shell.use( new A()); }

       public void tock(Shell shell) { shell.use( new A()); }

    }

    public class C extends Ghost {

       public void tick(Shell shell) { shell.use( new B()); }

       public void tock(Shell shell) { shell.use( new A()); }

    }

    public class Shell {

       Ghost _ghost = new A();

       public void tick() { _ghost.tick( this); }

       public void tock() { _ghost.tock( this); }

       public void use(Ghost ghost) { _ghost = ghost; }

    }

    public class GhostInTheShell {

       public static void main(String args[]) {

         Shell shell = new Shell();

         shell.tick();

         shell.tick();

         shell.tock();

         shell.tick();

       }

    }


    [ resolução (parcial): procurar resolver antes de consultar ]