Lab4 Douglas Bokliang

aluno: Douglas Bokliang Ang Cunha
ano/sem: 2008/2o.
data do laboratório (num. da semana) : ???

Introdução

Neste laboratório foi feito um aplicativo equivalente àquele feito no lab 2, sendo que a diferença foi apenas a linguagem utilizada. Desta vez, o programa foi feito em Ruby, uma linguagem dinâmica, diferentemente da linguagem Java utilizada anteriormente. O principal objetivo deste lab foi a introdução de uma linguagem dinâmica.

Desenvolvimento

Foi criado as mesmas classes criadas no lab 2, praticamente apenas “traduzindo” de uma linguagem para a outra. Em Ruby, foi possível criar apenas três arquivos que englobam toda a prática: um arquivo com todas as classes, um com os testes e um com o simulador.

Além das diferenças de sintaxe entre Java e Ruby, o programa desenvolvido neste laboratório apresentou uma outra diferença significativa no que refere às classes: não foi criado a classe RelaQueue. Como Ruby já possui uma classe Queue implementada, e nesta fila é possível colocar objetos de qualquer classe, decidi utilizar esta ferramenta para colocar os relatórios dos alunos, não sendo necessário criar uma das classes criadas em Java.

A seguir, estão todas as classes do arquivo Classes.rb. Note que, apesar de estar apresentado todas as classes utilizadas nos testes e no simulador, o tamanho do código é bem reduzido.

class Relatorio
  attr_accessor :aluno
  attr_reader :originalidade, :qualidade

  def initialize(qualidade, originalidade, aluno)
    @aluno = aluno
    @originalidade = originalidade
    @qualidade = qualidade
  end
end

class Professor
  def initialize (queue)
    @queue = queue
  end

  def corrigir_relatorio (rela)
    fator_aleatorio = rand
    (rela.qualidade + rela.originalidade + fator_aleatorio)/3*10
  end

  def corrigir_relatorios
    while !@queue.empty?
      rela = @queue.pop
      nota = corrigir_relatorio(rela)
      puts "#{rela.aluno.nome}: #{nota}"      
    end
  end
end

class Aluno
  attr_reader :conhecimento, :nome
  attr_writer :comportamento

  def initialize (nome, queue)
    @nome = nome
    @queue = queue
    @comportamento = Esforcado.new(self)
    @conhecimento = 0
  end

  def faz_e_entrega_relatorio
    qualidade = (2 * self.dedicacao + 1 * inteligencia ) / 3
    originalidade = (1 * self.dedicacao + 2 * self.inteligencia ) / 3
    rela = Relatorio.new(qualidade, originalidade, self)
    @queue.push(rela)
    @conhecimento += 1
  end

  def dedicacao
    @comportamento.dedicacao
  end

  def inteligencia
    @comportamento.inteligencia
  end
end

class AlunoITA < Aluno
  def initialize (nome, queue)
    super
  end

  def comportamento=(comportamento)
    raise "Impossivel! Aluno do ITA nao eh burro!!" if Burro === comportamento
    super
  end
end

class AlunoUSP < Aluno
  def initialize (nome, queue)
    super
  end

  def comportamento=(comportamento)
    raise "Impossivel! Aluno da USP nao pode ser Summa!!" if Summa === comportamento
    raise "Impossivel! Aluno da USP nao pode ser safo!!" if SafoPreguicoso === comportamento
    super
  end
end

class AlunoUnicamp < Aluno
  def initialize (nome, queue)
    super
  end

  def comportamento=(comportamento)
    raise "Impossivel! Aluno da Unicamp nao pode ser Summa!!" if Summa === comportamento
    raise "Impossivel! Aluno da Unicamp nao pode ser safo!!" if SafoPreguicoso === comportamento
    super
  end
end

class Comportamento
  def initialize(aluno)
    @aluno = aluno
  end
end

class Summa < Comportamento
  def initialize(aluno)
    super
  end

  def inteligencia
    1
  end

  def dedicacao
    1
  end
end

class SafoPreguicoso < Comportamento
  def initialize (aluno)
    super
  end

  def inteligencia
    1
  end

  def dedicacao
    0.5*rand
  end
end

class Esforcado < Comportamento
  def initialize(aluno)
    super
  end

  def inteligencia
    0.5
  end

  def dedicacao
    1
  end
end

class Imprevisivel < Comportamento
  def initialize(aluno)
    super
  end

  def inteligencia
    rand
  end

  def dedicacao
    rand
  end
end

class Pemba < Comportamento
  def initialize(aluno)
    super
  end

  def inteligencia
    0.5*rand
  end

  def dedicacao
    0.5*rand
  end
end

class Burro < Comportamento
  def initialize(aluno)
    super
  end

  def inteligencia
    0
  end

  def dedicacao
    0
  end
end

Os códigos dos testes e da simulação estão em anexo.

Resultados

-Testes
Foi necessária algumas mudanças nos testes em relação àquele utilziado em Java. Mas novamente as mudanças foram meramente de sintaxe. Veja a saída dos testes:

teste.jpg

-Simulador
Criou-se um simulador como aquele em Java, o resultado foi o seguinte:

simulador.jpg

Conclusão

Este laboratório foi bem interessante para termos contato com uma linguagem do tipo dinâmica: Ruby. Os problemas encontrados foram praticamente apenas relacionados à linguagem em si, uma vez que o desenvolvimento do lab já havia sido feito em Java. Considero que foi bom o aprendizado da linguagem Ruby, visto que com ela podemos diminuir significativamente o tamanho do código, sendo bem mais agradável de programar nela pois ela é bem mais versátil. No entanto, também há o lado negativo desta característica de Ruby: ao programar, muitas vezes deixei passar alguns erros que não foram apontados pelo NetBeans, uma vez que a linguagem é bem flexível e permite muitas variações, dessa forma tive que encontrar mais erros que o normal ao tentar executar os testes.

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