Item | Descrição |
---|---|
Grupos | Três alunos |
Linguagem | Uma dentre aquelas listadas |
Problema | Um dentre aqueles sugeridos |
Implementação | Duas: OO e funcional |
Relatório | Um com os requisitos obrigatórios (latex e bibtex ) – Modelo |
Submissão | ZIP ou TAR.GZ, por e-mail, com FileSender da RNP |
Os prazos são até às 23:59 do dia informado.
Item | Prazo |
---|---|
Anúncio (Início do TF) | 2018-03-15 |
Escolha da LP, Problema, Grupos | 2018-03-22 |
Projeto inicial | 2018-04-03 |
Entrega parcial | 2018-05-10 |
Entrega final | 2018-06-21 |
Apresentações Sessão #1 | 2018-07-03 |
Apresentações Sessão #2 | 2018-07-05 |
O objetivo deste trabalho consiste em fornecer aos alunos a oportunidade de estudar uma linguagem de programação moderna com características híbridas (i.e., multiparadigma). O trabalho permitirá aos alunos demonstrarem que aprenderam os princípios de programação relacionados com os diferentes paradigmas estudados ao longo do semestre, demonstrando, ainda, a capacidade de analisar e avaliar linguagens de programação, seguindo os critérios abordados em aula.
Cada grupo deve selecionar uma linguagem de programação da lista abaixo. Cada linguagem poderá ser escolhida por no máximo dois grupos. A ordem de preferência da escolha da linguagem será por sorteio, no cenário onde mais de dois grupos estejam interessados na mesma linguagem. A escolha do grupo deve ser realizada dentro do prazo estabelecido.
C++17 | ISO-CPP |
Clojure | http://clojure.org/ |
Erlang | http://www.erlang.org/ |
Groovy | http://www.groovy-lang.org/ |
Julia | http://julialang.org/ |
Kotlin | https://kotlinlang.org |
Objective CAML | http://ocaml.org/ |
R | https://www.r-project.org/ |
Ruby | http://ruby-lang.org/ |
Rust | https://www.rust-lang.org/ |
Scala | http://www.scala-lang.org/ |
Swift | http://swift.org/ |
TypeScript | https://www.typescriptlang.org/ |
A tarefa principal do trabalho consiste em experimentar e comparar as características e funcionalidades orientadas a objeto e funcionais da linguagem de programação escolhida. Após definir um grupo e selecionar uma linguagem, é necessário escolher um problema a ser solucionado com ela. O problema será, então, implementado duas vezes na mesma linguagem: uma delas usando somente Orientação a Objetos e a outra usando somente características funcionais. Interfaces (gráficas ou textuais) podem ser feitas em qualquer paradigma ou plataforma, podendo inclusive serem compartilhadas entre as duas versões, visto que o foco não está na interface do programa.
Cada grupo é formato com três participantes e elege um líder. O líder informa ao professor, via formulário abaixo, qual o problema escolhido, a linguagem, e os membros do grupo. Grupos com outra quantidade de membros são aceitos somente para fins de arrendondamento da turma (converse com o professor antes).
Formulário de definição dos grupos |
---|
A ideia é desenvolver um jogo de batalha por turnos estilo o jogo americano Risk, a versão Brasileira War. A fim de tornar o jogo menos complexo e menos demorado, sua versão pode envolver somente dois adversários (seja outro ser humano ou o computador). Preferencialmente, o jogo pode utilizar os tiles do OpenStreetMap para desenhar o mapa e posicionar exércitos.
A ideia consiste em desenvolver um software (bot ou agente) que controle um exército para competir no jogo Starcraft Broodwar. Maiores detalhes em: http://sscaitournament.com/ e https://github.com/bwapi/bwapi.
Ou seja, desenvolver um simulador capaz de aceitar definições de subprogramas e variáveis locais, utilizando uma pseudolinguagem simples. Com base nisso, demonstrar como ficaria sua pilha de chamadas (call-stack) e o conteúdo das variáveis locais a cada passo de execução.
Implementar um simulador de partículas, considerando forças físicas de repulsão e atração. Uma possibilidade é utilizar as leis gravitacionais para construir um simulador de órbitas para estrelas e planetas. Outra possibilidade é utilizar uma força elétrica de repulsão (todas as partículas com carga positiva, por exemplo), e forças de atração baseadas em molas. Deve-se ter cuidado com a escalabilidade do algoritmo utilizando, dando preferências para o algoritmo de Barnes-Hut. Um exemplo utilizando a linguagem C já está disponível em http://github.com/schnorr/viva/tree/master/src/libtupi, e pode ser utilizado como inspiração para o projeto.
Frogger é um jogo arcade de 1981 onde o objetivo é realizar o cruzamento de sapos (a partir da parte inferior da tela) em uma estrada e depois em um rio até ocupar todos os espaços (na parte superior da tela). Existem vários obstáculos que devem ser evitados (ou utilizados para se atingir o objetivo) como carros, pedaços de madeira, tartarugas, jacarés, etc. Os obstáculos se movem com diferentes velocidades. Mais informações aqui e na Wikipedia Frogger (entrada em inglês mais completa).
O jogo expõem o jogador como uma espaçonave que deve destruir as espaçonavas inimigas que querem invadir o planeta do jogador. Na medida que elas avançam na tela (de cima para baixo), o jogador guia sua espaçonave (de maneira livre na tela mas sempre realizando disparos em direção ao alto da tela), para destruir todas as ondas de inimigos que se seguem. Mais informações aqui e na Wikipedia Space Invaders.
Construir um editor de polígonos interativo parecido com a ferramenta vetorial de código aberto Inkscape. O editor deve permitir ao usuário editar polígonos através de todos os pontos do seu perímetro, assim como realizar operações clássicas como alinhamento de objetos, centralização, cálculo de área e extensão do perímetro.
Construir um programa de mineração ou processamento de dados, onde os dados são colocados na entrada de maneira continua e o sistema deve realizar operações estatísticas sobre eles.
No caso, o grupo deve encaminhar sua ideia ao professor, descrita em detalhes, que avaliará sua viabilidade.
O trabalho realizado deve considerar os aspectos especificados nesta seção, sendo um conjunto específico de recursos para a solução orientada a objetos e outro para a solução funcional. Caso um recurso não esteja disponível na linguagem, explique e justifique no relatório os motivos para ele não existir e utilize um mecanismo alternativo.
- Especificar e utilizar classes (utilitárias ou para representar as estruturas de dados utilizadas pelo programa).
- Fazer uso de encapsulamento e proteção dos atributos, com os devidos métodos de manipulação (setters/getters) ou propriedades de acesso, em especial com validação dos valores (parâmetros) para que estejam dentro do esperado ou gerem exceções caso contrário.
- Especificação e uso de construtores-padrão para a inicialização dos atributos e, sempre que possível, de construtores alternativos.
- Especificação e uso de destrutores (ou métodos de finalização), quando necessário.
- Organizar o código em espaços de nome diferenciados, conforme a função ou estrutura de cada classe ou módulo de programa.
- Usar mecanismo de herança, em especial com a especificação de pelo menos três níveis de hierarquia, sendo pelo menos um deles correspondente a uma classe abstrata, mais genérica, a ser implementada nas classes-filhas.
- Utilizar polimorfismo por inclusão (variável ou coleção genérica manipulando entidades de classes filhas, chamando métodos ou funções específicas correspondentes).
- Usar polimorfismo paramétrico
- através da especificação de \textit{algoritmo} (método ou função genérico) utilizando o recurso oferecido pela linguagem (i.e., generics, templates ou similar)
- e da especificação de \textit{estrutura de dados} genérica utilizando o recurso oferecido pela linguagem.
- Usar polimorfismo por sobrecarga (vale construtores alternativos).
- Especificar e usar delegates.
- Priorizar o uso de elementos imutáveis e funções puras (por exemplo, sempre precisar manipular listas, criar uma nova e não modificar a original, seja por recursão ou através de funções de ordem maior).
- Especificar e usar funções não nomeadas (ou lambda).
- Especificar e usar funções que usem currying.
- Especificar funções que utilizem pattern matching ao máximo, na sua definição.
- Especificar e usar funções de ordem superior (maior) criadas pelo programador.
- Usar funções de ordem maior prontas (p.ex., map, reduce, foldr/foldl ou similares).
- Especificar e usar funções como elementos de 1ª ordem.
- Usar recursão como mecanismo de iteração (pelo menos em funções de ordem superior que manipulem listas).
O grupo deve apresentar um relatório técnico com os itens descritos
abaixo. O relatório deve ser escrito utilizando a linguagem LaTeX
. O
modelo do relatório pode ser obtido aqui:
Segue a lista dos itens obrigatórios para o relatório:
- Capa: com identificação do grupo, da linguagem e do problema escolhidos.
- Visão geral da Linguagem: Apresentação da linguagem escolhida, descrevendo suas características, fundamentos, funcionalidades, benefícios e principais aplicações (inclusive com discussão de sua aplicabilidade em questões práticas).
- Recursos: esta seção deve descrever cada um dos recursos que foram
empregados nas duas soluções (OO e Funcional), incluindo trechos de
código implementados pelo grupo e utilizados na solução
final. Recomenda-se o uso do pacote
listings
(Latex) para a inclusão de código no relatório. - Análise Crítica: uma análise crítica da linguagem estudada, envolvendo uma tabela com os critérios e propriedades estudados em aula (i.e. simplicidade, ortogonalidade, expressividade, adequabilidade e variedade de estruturas de controle, mecanismos de definição de tipos, suporte a abstração de dados e de processos, modelo de tipos, portabilidade, reusabilidade, suporte e documentação, tamanho de código, generalidade, eficiência e custo, e outros que o grupo achem convenientes), com notas/valores justificados (ilustrando com exemplos utilizados no código ou descrevendo situações que contariam como pontos favoráveis ou desfavoráveis para cada critério ou propriedade). Indicar qual paradigma foi mais adequado para resolver o problema e por que.
- Conclusão: descrevendo as facilidades e dificuldades encontradas, benefícios, problemas e limitações da linguagem estudada.
- Referências: todo material consultado, incluindo livros, artigos,
páginas na Internet, etc., que tenha relação com o
assunto. Elaborar a lista usando
bibtex
.
Não serão aceitos trabalhos com indícios de plágio (cópia integral ou parcial de outros trabalhos). Utilizar trechos e exemplos, mesmo que em forma de paráfrase, é permitido e estimulado, desde que a menção (citação) ao autor do original seja feita corretamente.
Sugere-se adoção destas técnicas para a execução deste trabalho.
- GIT: para gerenciar o desenvolvimento em grupo e manter um repositório único de código, permitindo não só gerenciar versões, mas também controlar a contribuição de cada participante.
- Máquina Virtual: para que você possa configurar todas as bibliotecas, plug-ins e componentes necessários para o desenvolvimento e a execução de seu software.
Todas as etapas de entrega deverão ser encaminhados até a data estipulada pelo professor por e-mail, e são obrigatórias. As entregas devem ser realizadas através de um arquivo compactado (ZIP ou TAR.GZ), contendo o relatório (em PDF) e os códigos-fontes desenvolvidos (não incluir os códigos binários). Utilize o serviço FileSender da RNP para envio de arquivos grandes, mediante login utilizando o cartão do aluno da UFRGS.
O projeto inicial, uma etapa obrigatória, deve vir acompanhada apenas da capa, introdução e da apresentação da linguagem escolhida e do problema. Sugere-se que uma estrutura completa do relatório já esteja igualmente presente.
A entrega parcial, uma etapa obrigatória, deve vir acompanhada da implementação e relatório a respeito da solução utilizando um dos paradigmas (OO ou funcional), a critério do grupo. O professor utilizará esta oportunidade para formar um parecer rápido do relatório e da implementação; sugerindo ao grupo melhorias caso necessário.
A entrega final incorpora os comentários do parecer do professor das entregas anteriores e a implementação e relatório nos dois paradigmas (OO e funcional). É a entrega final que será utilizada para a avaliação, conforme método descrito abaixo.
A apresentação do trabalho prático será feita diante da turma e do professor nas aulas especificadas no cronograma da disciplina. Cada grupo terá 10 minutos para a apresentação. Dentro desse tempo, os alunos deverão: apresentar o problema, apresentar a linguagem escolhida para a implementação, apresentar quais foram as vantagens e desvantagens da abordagem OO e da funcional para a implementação da solução do problema e, por fim, fazer uma breve demonstração. O professor fará perguntas pontuais direcionadas para cada um dos membros do grupo. A apresentação faz parte da nota. Pontualidade também.
A avaliação geral do trabalho incluirá os seguintes critérios: desenvolvimento e detalhamento dos itens do relatório, aplicação dos conceitos de programação estudados, utilização correta dos recursos da linguagem escolhida, correção, legibilidade, confiabilidade e originalidade, uso de referências, formatação e estilo do texto. Outros aspectos de avaliação poderão ser incluídos a critério do professor. O peso deste trabalho corresponde ao valor especificado no plano da disciplina disponível na plataforma de apoio pedagógico.
Atenção: conforme instruções presentes no plano de ensino da disciplina, todas as etapas do trabalho devem ser cumpridas para que a sua nota de trabalho seja contabilizada!