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:
-Simulador
Criou-se um simulador como aquele em Java, o resultado foi o seguinte:
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.







