S03 - Atividade em Grupo: Design do Programa de Memorização de Escrituras
Visão Geral
Reúna-se com seu grupo e prepare um design para a tarefa de programação desta semana.
Sobre “Orientações do Instrutor"
Lembre-se de que, durante toda a atividade, você receberá Orientações de um Instrutor. Primeiro, vocês devem responder às perguntas em grupo e, depois, consultar a seção Orientações do Instrutor para ter certeza de que estão no caminho certo.
Não deixe de expandir e ler cada seção da Orientações do Instrutor à medida que avança na atividade.
Agenda
Use o seguinte como agenda para sua reunião em grupo. Quem for designado para ser o estudante líder desta reunião deve ajudar a guiar o grupo através destas etapas e fazer as perguntas listadas aqui.
Antes da reunião: verifique o horário, o local e o estudante líder
Isso pode ser tão simples quanto publicar uma mensagem no seu canal do Microsoft Teams dizendo algo como: "Olá, pessoal, ainda estamos planejando nos encontrar amanhã às 19h, Horário de Brasília? Vamos usar o recurso de vídeo do Microsoft Teams de novo." Ou, se outra pessoa já publicou uma mensagem como essa, pode ser tão simples quanto "curtir" a mensagem dela.
Certifique-se de identificar quem será o estudante líder de cada semana. Por exemplo, “Emília, você ainda pode ser a estudante líder desta semana?"
Comece com uma oração
Discuta a atividade de aprendizagem de preparação
Reserve um tempo para falar sobre a atividade de aprendizagem da semana. Fale sobre quaisquer dificuldades que as pessoas tiveram para entender o material ou concluir a atividade.
- Qual parte da atividade de aprendizagem foi a mais difícil para você?
Orientações do Instrutor
Lembre-se:
- Cada variável membro deve ser privada. Getters e Setters devem ser usados para acessar os dados, se necessário.
- Os getters não devem ter nenhum parâmetro e não devem solicitar nada ao usuário, mas, em vez disso, simplesmente retornar um valor.
- Os setters devem aceitar um único parâmetro e ter um tipo de retorno
void.
Reveja a especificação do programa
Consulte a Especificação do Programa de Memorização de Escrituras. Em grupo, revisem os requisitos do programa e como ele deve funcionar.
- O que o programa faz?
- Quais são as entradas do usuário?
- Que saída ele produz?
- Como o programa termina?
Orientação do Instrutor
- O programa pode terminar de duas maneiras: ou o usuário digita sair ou todas as palavras na escritura foram escondidas.
Determine as classes
O primeiro passo para projetar um programa como esse é pensar nas classes que você precisará. Ao pensar em classes, muitas vezes é útil considerar os substantivos fortes na descrição do programa.
- Quais são bons candidatos para classes neste programa?
- Quais são as principais responsabilidades de cada classe?
Orientações do Instrutor
As seguintes são boas opções de classes, listadas com suas responsabilidades:
Escritura: Mantém o controle tanto da referência quanto do texto da escritura. É possível esconder palavras e obter a exibição renderizada do texto.Referencia: Mantém o controle das informações do livro, capítulo e versículo.Palavra: Mantém o controle de uma única palavra e se ela está exibida ou escondida.
Avalie o Design
- Você pode considerar a criação de uma classe
Esconderque tenha a responsabilidade de esconder as palavras nas escrituras. Quais seriam as desvantagens de criar uma classeEsconderem vez de deixar essa responsabilidade para as classesEscrituraePalavra?
Defina os comportamentos das classes
Agora que você decidiu quais classes serão necessárias e suas responsabilidades, o próximo passo é definir os comportamentos dessas classes. Eles se tornarão métodos para as classes.
Passe por cada uma de suas classes e pergunte:
- Quais são os comportamentos que esta classe terá para cumprir suas responsabilidades? (Em outras palavras, o que essa classe deveria fazer?)
Orientações do Instrutor
Os principais comportamentos da classe Escritura são esconder palavras aleatórias
e também obter o texto de exibição como uma string. (O "texto de exibição" refere-se ao texto
com algumas palavras exibidas normalmente e outras substituídas por sublinhados.) Também seria interessante ter
um comportamento para verificar se a escritura está completamente escondida, para que você saiba
quando encerrar o programa.
Os principais comportamentos da classe Palavra são esconder e
exibir uma palavra e verificar se uma palavra está escondida ou não. Além
disso,
uma Palavra deve ter um comportamento para obter o texto de exibição dessa palavra, que seria a
própria palavra (por exemplo, "oração") ou, se a palavra estivesse escondida, esse comportamento retornaria
sublinhados (por exemplo, "______").
A classe Referencia é bem simples no que diz respeito a comportamentos. Ela deve ter a capacidade
de obter o texto de exibição da referência, que é apenas uma sequência de caracteres que
combina o livro, o capítulo e o versículo (ou versículos). Você pode considerar ter getters e setters para cada
um dos elementos de dados que esta classe armazena, mas pode ser ainda melhor usar um construtor para
defini-los. O construtor será discutido com mais detalhes abaixo.
Converter essas ideias em nomes de métodos concisos nos dá o seguinte (observe que os tipos de variáveis e os
tipos de retorno são mostrados após o caractere de dois-pontos : ):
-
EscrituraEsconderPalavrasAleatorias(numeroParaEsconder : int) : voidObterTexto() : stringEstaCompletamenteEscondida() : bool
-
PalavraEsconder() : voidExibir() : voidEstaEscondida() : boolObterTexto() : string
-
ReferenciaObterTexto() : string- Possíveis getters e setters
Avalie o Design
- Quais outros métodos devem ser chamados pelo método
EsconderPalavrasAleatoriasda classeEscriturapara ajudar em seu trabalho? - Qual é o benefício da classe
Referenciaconter seu próprio métodoObterTextoem vez de fazer com que a classe Escritura exiba o capítulo e o versículo do livro diretamente?
Defina os atributos das classes
Agora que você definiu as classes, suas responsabilidades e seus comportamentos, o próximo passo é determinar quais atributos as classes devem ter ou quais variáveis precisam armazenar.
Passe por cada uma de suas classes e pergunte:
- Quais atributos essa classe precisa para cumprir seus comportamentos? (Em outras palavras, quais variáveis esta classe deve armazenar?)
- Quais são os tipos de dados dessas variáveis membro?
Orientações do Instrutor
A classe Escritura precisará de variáveis membro para uma referência e uma lista de todas as
palavras da escritura. O tipo de dados para a referência é Referencia, a classe personalizada
definida acima. O tipo de dados para a lista de palavras seria List<Palavra> (observe que é
uma lista de objetos Palavra, em vez de uma lista de strings.)
A classe Palavra precisará armazenar o texto da palavra em si (uma string) e uma variável para
indicar se essa palavra está exibida ou escondida (um booleano).
A classe Referencia precisará armazenar uma variável para o livro (string), o capítulo (inteiro) e
o versículo (inteiro). Então, também precisará armazenar uma variável adicional para o segundo, ou "fim",
versículo do intervalo para lidar com o caso de Provérbios 3:5-6.
A seguir são mostradas todas as variáveis-membro:
-
Escritura_referencia : Referencia_palavras : List<Palavra>
-
Palavra_texto : string_estaEscondida : bool
-
Referencia_livro : string_capitulo : int_versiculo : int_ultimoVersiculo : int
Avalie o Design
- Qual é o benefício de
Escrituraconter uma lista de objetosPalavraem vez de uma lista de strings?
Definir Construtores
Agora que você definiu as classes, incluindo seus comportamentos e atributos, o próximo passo é pensar nos construtores que serão usados para criar novas instâncias dessas classes. Lembre-se de que você pode criar vários construtores com parâmetros diferentes para facilitar o trabalho com suas classes.
Lembre-se de que os construtores ajudam a configurar o estado inicial do objeto, então você deve considerar quais dados são necessários para esse estado inicial.
-
Quais construtores cada classe deve ter?
- Em outras palavras, quais parâmetros você deve passar ao criar um objeto desse tipo.
-
Que outro trabalho precisa ser feito para configurar esses objetos?
- Por exemplo, o construtor precisa executar código para executar tarefas de configuração, como criar listas, percorrer por variáveis, etc.
Orientações do Instrutor
Uma classe para uma Escritura precisará de um construtor que aceite tanto uma referência quanto o
texto da escritura. Se a classe Escritura armazena internamente uma Lista de objetos
Palavra, a primeira ideia seria passar uma variável List<Palavra> para o
construtor. Embora isso pudesse funcionar, teria algumas desvantagens. Em primeiro lugar, isso exporia o
armazenamento interno das escrituras para a pessoa que usa a classe (perdendo os benefícios do encapsulamento).
Em segundo lugar, exigiria que a pessoa que usa a classe fizesse o trabalho de dividir o texto na lista, da
maneira que essa classe espera. Isso não só representa trabalho extra, mas também quebra o princípio do
encapsulamento e limita sua capacidade de alterar sua classe no futuro.
Em vez de passar uma lista de palavras, seria melhor se o princípio de encapsulamento fosse seguido passando
uma string que fosse o texto da escritura. Então, o construtor teria a responsabilidade de criar a lista e
dividir as palavras na string para criar objetos Palavra para cada uma e colocá-las na lista.
Embora incluir a lógica de criação da lista de palavras possa parecer muito trabalho para o construtor, é útil
encapsular essa lógica na classe Escritura para que outro código não precise se preocupar com o
armazenamento interno do Escritura. Isso permitiria que o programa fosse facilmente alterado no
futuro, caso uma escolha de implementação diferente fosse feita.
Uma classe para uma Palavra também precisará de um construtor. Este construtor deve aceitar o
texto da palavra para salvá-lo como um atributo. Além disso, o construtor precisará definir a visibilidade
inicial da palavra (se ela será mostrada ou escondida). Observe que você não precisa passar a visibilidade da
palavra. Ela pode ser definida para ficar visível por padrão.
Uma classe para uma Referencia deve ter dois construtores diferentes para dar conta de casos em
que há um único versículo ou vários versículos. Observe que você pode ter dois construtores diferentes, desde
que o conjunto de parâmetros seja diferente. O primeiro construtor receberia apenas um livro, capítulo e
versículo, enquanto o segundo receberia um livro, capítulo, versículo inicial e versículo final. (Essa
capacidade de ter várias versões de uma função, desde que o conjunto de parâmetros sejam diferentes, é chamada
de Sobrecarga de Função (overloading) e é possível com qualquer função, não apenas com construtores.)
Avalie o Design
- Qual é o benefício de passar a string do texto do versículo para o construtor
Escrituraem vez de passá-la para uma Lista de objetosPalavra?
Revise o design
Reserve um minuto para revisar seu design final.
- Há alguma classe, método ou variável que você não entende?
Orientações do Instrutor
A seguir está um diagrama de classe final para cada uma das classes que você pode usar como um guia enquanto escreve seu código.
Conclusão
Neste ponto, você tem o design das classes que precisará para este projeto. Se o seu design não estiver "perfeito" ou precisar mudar quando você começar a trabalhar no projeto, tudo bem! À medida que você aprender mais detalhes, naturalmente precisará ajustar seu planejamento. É por isso que os princípios da programação com classes são tão valiosos. Eles permitem que seu programa mude facilmente.
No final da sua reunião:
- Determine quem será o estudante líder na próxima reunião.
Após a reunião: inicie o código
Após a atividade em grupo, cada pessoa precisa fazer individualmente os seguintes passos:
-
Abra o projeto no VS Code. Crie novos arquivos que contenham os protótipos ou código vazio para todas as classes, variáveis membro e funções em seu design.
- Neste ponto, o corpo dos métodos pode estar vazio, exceto as instruções de retorno necessárias.
- Cada classe deve estar em seu próprio arquivo e o nome do arquivo deve corresponder ao nome da classe.
- Certifique-se de que seu programa possa ser compilado sem erros.
- Confirme (commit) e envie (push) seu código para seu repositório GitHub.
Envio
Assim como fez anteriormente, após concluir esta atividade retorne ao Canvas para responder a dois questionários associados a ela:
- S03 - Atividade em Grupo: Design do Programa de Memorização de Escrituras
- S03 - Atividade em Grupo: Relatório da Participação