Lab4 Maykon Bergamaschi

aluno: Maykon Bergamaschi
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 05/11/2008 (6)

Introdução

Este laboratório foi desenvolvido com o objetivo de tornar mais familiar o Ruby, explicitando as diferenças entre essa linguagem e o Java. Ambas são linguagens orientadas a objetos, porém Ruby é de tipagem dinâmica, ao passo que Java é estática.
Para atingir esse objetivo, foi proposta a tarefa de reescrever em Ruby o segundo laboratório.

Desenvolvimento

O funcionamento do programa já foi bem explorado no segundo laboratório. Por esse motivo, o enfoque deste relatório será nas diferenças da implementação em Ruby em comparação com Java.

O programa está distribuído em três arquivos:

  • minhas_classes.rb, contendo as classes desenvolvidas para o programa;
  • simulador.rb, contendo uma simulação em modo texto para acesso do usuário;
  • testes.rb, contendo alguns testes relativos a tratamento de exceções, entre outros.

Foram notadas algumas diferenças mais gerais entre as duas implementações, além das diferenças de sintaxe entre as linguagens:

  • a tipagem dinâmica presente em Ruby permite que uma mesma variável possa assumir valores de tipos distintos definidos em tempo de execução, sem a necessidade prévia de declaração do tipo da variável em Java;
  • o padrão para getters e setters em Ruby é diferente, e pode ser implementado com mais concisão por meio de attribute accessors como attr_reader;
  • em relação ao tratamento de exceções, ambas as linguagens não têm isso como uma necessidade. Isso será detalhado posteriormente.

A seguir, serão analisadas algumas classes que foram significativamente alteradas após a passagem para Ruby.

Classe Relaqueue

A classe Relaqueue, apesar do nome, poderia ser utilizada para armazenar em fila elementos de qualquer classe. Ela é, de fato, um Array. A princípio, foi retirada a limitação do número de elementos dessa fila. Abaixo, o código de Relaqueue.

#classe Rela_queue
class Relaqueue
  attr_reader :queue
  def initialize
    @queue = []
  end
 
  def queue(rela)
    @queue.push(rela)
  end
 
  def dequeue()
    @queue.shift
  end
 
  def size()
    return @queue.length
  end  
end

Classes Aluno_ITA, Aluno_USP e Aluno_Unicamp

Essas classes foram mantidas como subclasses de Aluno. É chamado o construtor da superclasse em cada uma das subclasses (super). Em Ruby, não se faz necessário deixar explícito na definição dos métodos que poderá haver durante sua execução o lançamento de exceções.

Para exemplificar o que foi citado, o código de Aluno_Unicamp está mostrado abaixo.

class Aluno_Unicamp < Aluno
 
      def initialize (nome, queue)
      super(nome,queue)
      end
 
      def comportamento=(comport)
      if (comport.instance_of?(Summa) || comport.instance_of?(Safo_preguicoso))
        raise "Comportamento incompativel."
      end
    end
  end

Classes Burro, Esforcado, Pemba, Safo_preguicoso, Summa e Imprevisivel

Em Java, todas essas classes eram subclasses da classe abstrata Comportamento. Pelo fato de Ruby ser uma linguagem de tipagem dinâmica, os comportamentos dos alunos podem assumir valores de qualquer classe. Por isso, não é necessário em Ruby definir Comportamento. Cada uma dessas classes não se relaciona com as demais - e isso acaba por criar uma pequena redundância no código.

Por algumas das características serem determinadas por meio de variáveis aleatórias, não se pôde utilizar os attribute accessors sempre. Quando isso não podia ser feito, bastou criar getters e setters como se fazia anteriormente.

Está mostrada abaixo a classe Safo_preguicoso, para exemplificar o que foi explicado.

class Safo_preguicoso 
    attr_reader :inteligencia
    def initialize (aluno)
      @aluno = aluno
      @dedicacao = rand()/2.0
      @inteligencia = 1.0     
    end
 
    def dedicacao
      @dedicacao = rand()/2.0
    end
  end

Classe Simulador

A classe Simulador teve diversas alterações devido à sintaxe de Ruby. Além disso, foi alterada também a forma de atuação quando o operador entrava com uma informação que leva a exceções (por exemplo, um aluno do ITA burro): na implementação em Ruby, o programa retorna à leitura de um novo aluno.

Algum tempo foi dispendido na procura de métodos relacionados a strings, como chomp, utilizado no tratamento da string lida do teclado.

Resultados

Inicialmente, foram feitos alguns testes manuais com o simulador. Foi testada a leitura de três alunos, como se vê a seguir.

testes01.JPG

Figura 1 - Testes manuais com o simulador

A seguir, foi testado o tratamento de exceções. Além disso, também foi testado o caso de um aluno que não entrega o relatório.

testes02.JPG

Figura 2 - Testes manuais com o simulador: tratamento de exceções e casos de não-entrega de relatório

Além desses testes mostrados, foram realizados outros. Para tornar o relatório mais sintético, foram omitidos esses testes.

A classe de testes fornecida no segundo laboratório foi inteiramente convertida para Ruby. Foi uma tarefa que se baseou principalmente na conversão para a sintaxe de Ruby. O programa foi testado com essa nova classe, e os resultados obtidos mostram que a implementação foi bem sucedida.

testes04.JPG

Figura 3 - Testes com a classe de testes fornecida no segundo laboratório convertida para Ruby

Com isso, está concluído o quarto laboratório de CES-22.

Conclusão

Com a realização desta atividade, ficou claro que Ruby é uma linguagem de sintaxe mais intuitiva para o programador do que Java. Isso permite um grande nível de concisão do código. Entretanto, Ruby requer uma capacidade maior de processamento - isso pode ser um fator-chave em sistemas de grande complexidade, para este laboratório não é possível perceber a diferença de velocidade, dado o tamanho da aplicação.

Além disso, Ruby possui uma quantidade enorme de comandos e de possibilidades de escrever um mesmo comando: isso pode tornar a busca por possíveis erros no código uma tarefa complexa para os programadores, em especial os iniciantes.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License