Java, exercício de análise

assunto: máquina de estados, padrão comando

ou

pergunta: qual o output do seguinte:

package recursopa2;

class Semaforo {

    static final int TEMPO_VERDE = 4, TEMPO_VERMELHO = 4, TEMPO_AMARELO = 1;
    private int tempo;
    private String estado;
    private String estadoAoLigar;

    public Semaforo() {
        tempo = 0;
        estado = "desligado";
        estadoAoLigar = "vermelho";
    }

    public void passaTempo() {
        if (estado.equalsIgnoreCase("desligado")) {
            return;
            //se for igual a desligado, não faz nada
        }
        tempo--;
        //se for diferente a desligado
        if (tempo > 0) {
            return;
            //se fo tempo for positivo, não faz mais nada
        }
        //se for == 0, então..
        if (estado.equalsIgnoreCase("vermelho")) {
            estado = "verde";
            tempo = TEMPO_VERDE;
        } else if (estado.equalsIgnoreCase("verde")) {
            estado = "amarelo";
            tempo = TEMPO_AMARELO;
        } else if (estado.equalsIgnoreCase("amarelo")) {
            estado = "vermelho";
            tempo = TEMPO_VERMELHO;
        }
    }

    public void desliga(String ligarEm) {
        if (estado.equalsIgnoreCase("desligado")) {
            return;
        }
        //se estiver ligado, então..
        estadoAoLigar = ligarEm;
        estado = "desligado";
        tempo = 0;
    }

    public void liga() {
        if (!estado.equalsIgnoreCase("desligado")) {
            return;
        }
        //se estiver desligado, então..
        estado = estadoAoLigar;
        if (estado.equalsIgnoreCase("vermelho")) {
            tempo = TEMPO_VERMELHO;
        } else if (estado.equalsIgnoreCase("verde")) {
            tempo = TEMPO_VERDE;
        } else if (estado.equalsIgnoreCase("amarelo")) {
            tempo = TEMPO_AMARELO;
        }
    }

    public String toString() {
        return estado + "   " + tempo;
    }
}

//para testar
public class main {

    public static void main(String[] args) {
        Semaforo s = new Semaforo();
        s.desliga("ligado");
        s.liga();
        s.passaTempo();
        System.out.println(s.toString());
    }
}

perguntas, parte I:
____ É suficiente definir três classes concretas e tipo(s) base destas classes (classe e/ou interface)
resposta: não, temos quatro estados

____ É suficiente definir quatro classes concretas sem qualquer característica em comum
resposta: não, são derivadas na mesma base

____ Conceitos como “Vermelho” ou “Verde” representam métodos
resposta: não, são classes

____ Conceitos como “PassaTempo”, “Liga” ou “Desliga” representam métodos
resposta: sim

____ Todas as classes que representam os estados dispõem de implementações (vazias ou não) de todos os métodos que representam as acções a que o semáforo tem que responder
resposta: ou seja em todos os estados temos implementações vazias ou não, de liga ou desliga, sim verdadese não temos o que interessa, temos estão o return this (o vazio)

____ Três é o número mais adequado de métodos declarados na classe abstracta de base ou na interface comum
resposta: verdade, são três

____ As implementações dos métodos definidos na classe abstracta de base ou na interface comum podem modificar os dados e/ou devolver uma referência para o objecto que representa o estado actual
resposta: é verdade. “podem modificar os dados, e não retornam o estado em que ficamos”

____ Apenas um dos métodos (representando uma transição na máquina de estados) declarados na classe abstracta de base ou na interface comum necessita de receber um argumento
resposta: é verdade, que é o String ligarEm

perguntas, parte II:
Conceitos como “PassaTempo”, “Liga” ou “Desliga” representam ____________________ (métodos/classes)
resposta: na máquina de estados eram métodos, no padrão comando são classes
arranjam-se objectos que embrulham estas acções (classes que representam comandos simples, para haver uma evolução), logo elas vão ser classes

As classes que representam os comandos concretos implementam um interface ou derivam de uma mesma classe abstracta. Indique os métodos desse tipo base abstracto ____________________________________
resposta: os métodos são o execute (executar) e o undo (refazer)

O membro “estadoAoLigar” da classe Semaforo da listagem anterior deveria ser membro de que classe da hierarquia de comandos.
resposta: no comando correspondente ao desligar

O argumento “ligaEm” da classe Semaforo da listagem E deveria ser membro da classe ____________ da hierarquia de comandos.
resposta: “ligaEm” vai ser gravado na classe desliga
quando queremos por em padrão comando um método que leva argumentos, esses argumentos também são passados ao construtor do comando e são membros do objeto comando, e ficam lá gravados dentro
“os argumentos com que as funções são chamadas, quando embrulhamos a função com um comando, esses argumentos ficam gravados na classe que representa aquela acção, que representa aquele comando”

perguntas, parte III:
a classe semáforo deve implementar a interface PropertyChangeListener
resposta: não, pois a classe semáforo é a nossa lógica/dados. Os observadores (objectos da vista) que estão do lado da vista é que implementam o PropertyChangeListener

a classe semáforo deve ser derivada de PropertyChangeSupport ou referida por uma classe derivada de PropertyChangeSupport
resposta: verdade, a classe semáforo vai ser derivada de PropertyChangeSupport

o objecto painel desenho pode ser uma instância de uma classe derivada de PropertyChangeSupport
resposta: não, o painel de desenho não tem nenhum membro de PropertyChangeSupport, ele regista-se como observador, ele tem um observador lá dentro

o objecto painelDesenho pode ser instância de uma classe que não implementa a interface PropertyChangeListener, desde que tenha definida o método propertyChange
resposta: se ele tem um método propertyChange e não tem registo como observador, então não recebe ordens de actualização

o local mais apropriado para colocar código que trata da representação gráfica do semáforo é um método designado propertyChange
resposta: sim, os objetos gráficos são actualizados no propertyChange

o objecto painelDesenho, se tiver uma referência para a classe que deriva de PropertyChangeSupport (modelo), já não precisa de se registar como listener modelo.addProppertyChangeListener(this))
resposta: falso, pode ter uma referência, mas se não tiver um registo como listener/observador, não sabe se existem actualizações, quando os dados se alterarem

a classe que deriva PropertyChangeSupport (a classe observável) deve ter métodos, como passaTempo e desliga, que permitem alterar a informação encapsulada pelo modelo. Nestes métodos, é necessário chamar o método firePropertyChange antes de fazer as alterações ao semáforo
resposta: falso, o firePropertyChange é chamado depois. primeiro mudamos os dados, depois o firePropertyChange vai mandar os observadores fazer a actualização da vista

Tags : ,

0 thoughts on “Java, exercício de análise”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.