S02 - Atividade em Grupo: Design do Programa de Diário
Visão Geral
Esta atividade orientará você no processo de criação de um design para seu programa. É muito importante que você entenda as decisões e concessões que são feitas ao longo do caminho para que, mais tarde, você possa produzir um design por conta própria com menos orientações.
Instruções da Atividade em Grupo
Esta atividade foi projetada para ser concluída em grupo, trabalhando juntos de forma síncrona em uma videochamada.
Para esta e futuras atividades em grupo, vocês deverão escolher alguém para ser o estudante líder. O estudante líder deve ajudar a orientar a discussão e fazer perguntas. A cada reunião vocês deverão escolher uma pessoa diferente para ser o estudante líder.
Esta atividade contém dois tipos de perguntas. As primeiras são perguntas que ajudam você a construir o design. Para garantir que você tenha um design sólido para usar em seu programa, você vai receber "Orientações do Instrutor" para ajudar.
Orientações do Instrutor
Esta atividade foi criada para ajudar você a percorrer o processo de design em grupo. Como as decisões nos primeiros passos determinam muitos passos seguintes, queremos ter certeza de que você não comece por um caminho que levará a problemas mais tarde. Da mesma forma, quando você começar a criar o código do seu programa, é importante que você tenha um design sólido para trabalhar e que reforce os conceitos do curso.
Se estivéssemos juntos em uma sala de conferências em uma empresa, um instrutor poderia observar a discussão sem dizer nada e só intervir se a conversa começasse a tomar um rumo ruim.
No caso desta atividade, como o instrutor não pode estar presente em todas as reuniões do grupo, colocamos seções expansíveis de "Orientações do Instrutor" ao longo do processo de design. Você não deve expandir e analisar essas seções até que tenha feito o melhor que puder em grupo para responder às perguntas. Então, depois de responder às perguntas, você deve verificar estas seções de Orientações do Instrutor para ter certeza de que está indo na direção certa.
Tenha em mente que, muitas vezes, existem vários bons designs para um problema, mas, para este programa, você deve usar o design criado aqui para garantir que você tenha uma boa abordagem que também vai reforçar os princípios da lição.
Não deixe de expandir e ler cada seção da Orientações do Instrutor à medida que avançar na atividade.
Além das perguntas de design que contêm Orientações do Instrutor, você também verá perguntas para ajudá-lo a avaliar o design, conforme mostrado abaixo:
Avalie o Design
- Este é um exemplo de como as perguntas aparecerão.
Essas perguntas lhe darão a oportunidade de examinar o motivo de tomar certas decisões e de comparar várias possibilidades de design. Você deve discutir essas questões em grupo, assim como as outras questões, mas elas não conterão soluções em uma caixa de "Orientações do Instrutor". Em vez disso, no final da atividade (ou durante a atividade, se preferir), você responderá a um questionário com as perguntas do "Avalie o Design". Lembre-se de que você pode responder a esse questionário várias vezes, se desejar.
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 minuto 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ê?
Reveja a especificação do programa
Consulte a Especificação do Programa de Diário. Em grupo, revisem os requisitos do programa e como ele deve funcionar.
- O que o programa faz?
- Quais são entradas do usuário?
- Que saída ele produz?
- Como o programa termina?
Orientações do Instrutor
Uma boa maneira de pensar sobre essas questões é observar as opções de menu do programa. Elas ajudarão você a pensar sobre os vários recursos do programa.
Determine as classes
O primeiro passo para o design de 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
Essas são boas opções de classes, listadas com suas responsabilidades:
Diario: Armazena uma lista de registros do diárioRegistro: Representa um único registro do diário.GeradorDePerguntas: Fornece perguntas de modo aleatório sempre que necessário.
Além disso, seu programa também terá uma classe Program que é o ponto de partida para o programa e
lida com grande parte da interação com o usuário. Devido a todos os programas terem uma classe Program, e como
ela geralmente é simples, contendo apenas alguns métodos estáticos e não precisarmos criar uma instância dela,
você frequentemente verá essa classe ser excluída de listas como esta, onde preferimos focar nas classes que
modelam os componentes do nosso problema específico.
Você também pode ter considerado uma classe “Arquivo", mas neste caso, os principais conceitos a serem
modelados são o diário e o registro. Poder carregar e salvar esses registros de diário pode ser um comportamento
dessas classes, e então você não precisaria de uma classe Arquivo extra. Certamente seria uma
abordagem válida ter uma classe para todas as interações de arquivos com métodos como SalvarNoArquivo e
CarregarDeArquivo. Essas são decisões difíceis que os programadores precisam tomar. Para este programa,
deixaremos a classe Diario cuidar desse comportamento.
O gerador de perguntas realmente precisa ser uma classe própria ou pode ser simplesmente um método? Esta é uma boa pergunta. Mas, ao tornar o gerador de perguntas uma classe, ela pode abstrair quaisquer detalhes associados à geração de perguntas, como se elas fossem carregadas a partir de um arquivo, extraídas de uma fonte da Internet ou mesmo para garantir que perguntas duplicadas não sejam fornecidas. Você talvez não queira todos esses recursos agora, mas a vantagem da abstração é que você pode adicioná-los mais tarde sem alterar o funcionamento do restante do programa. Então, por esse motivo, faz todo o sentido criá-lo como uma classe agora.
Avalie o Design
- Se você seguisse o design da seção "Orientações do Instrutor" e, no futuro, alterasse seu programa para que as perguntas fossem recuperadas diretamente de um banco de dados da Web, quantas classes teriam que ser atualizadas?
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. Esses se tornarão os métodos de cada classe.
Passe por cada uma de suas classes e pergunte:
- Quais são os comportamentos que esta classe precisa ter para cumprir suas responsabilidades? (Em outras palavras, o que essa classe precisa fazer?)
Orientações do Instrutor
Claramente, a classe GeradorDePerguntas precisa gerar perguntas.
Muitos comportamentos da classe Diario também são obtidos facilmente através da especificação. Por
exemplo, um diário precisa incluir comportamentos como:
- Adicionar um registro
- Exibir todos os registros
- Salvar em um arquivo
- Carregar de um arquivo
A classe Registro não tem muitos comportamentos. Sua principal responsabilidade é armazenar dados.
E, no entanto, como ela é responsável por tudo o que tem a ver com registros, faria sentido que ela tivesse pelo
menos seu próprio método de exibição. Então, o método de exibição de Diario poderia percorrer todos
os objetos Registro e chamar o método de exibição Registro. Diario não
precisaria se preocupar com os detalhes de como Registro seria exibido, pois tudo isso estaria
contido na classe Registro.
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 : ):
-
DiarioAdicionarRegistro(novoRegistro : Registro) : voidExibirTodos() : voidSalvarNoArquivo(arquivo : string)CarregarDoArquivo(arquivo : string)
-
RegistroExibir() : void
-
GeradorDePerguntasObterPerguntaAleatoria() : string
Avalie o Design
- Quais são os benefícios potenciais de ter um método
Exibirna classeRegistroem vez de permitir que o métodoExibirdoDiarioexiba a data e o texto de umRegistrodiretamente?
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 membro esta classe deve armazenar?)
- Quais são os tipos de dados dessas variáveis membro?
Orientações do Instrutor
Diario deve armazenar uma lista de objetos Registro. O tipo de dados para isso deve
ser List<Registro>
Registro deve manter o controle da data, do texto da pergunta e do texto da resposta em si.
Em nosso design, o gerador de perguntas deve armazenar uma lista de possíveis perguntas que ele pode selecionar aleatoriamente quando necessário.
Converter essas ideias em nomes de variáveis concisos, juntamente com seus tipos de dados, nos dá o seguinte:
-
Diario_registros : List<Registro>
-
Registro_data : string_textoPergunta : string_textoResposta : string
-
GeradorDePerguntas_perguntas : List<string>
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.
Avalie o Design
- Usando esse design, quando você quiser adicionar um novo registro ao diário, você usará um código como
diario.AdicionarRegistro(novoRegistro); em vez de usar a variável _registros e seu método para adicionar, assimdiario._registros.Add(novoRegistro);. Qual é o benefício da nossa abordagem de design (o métodoAdicionarRegistro), em vez de acessar a variável diretamente?
Conclua a reuniã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 um pouco 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
Agora que você tem um design para suas classes em mente. O próximo passo é iniciar o código do programa.
Você começa programas com classes criando “protótipos” para tudo em seu design, ou em outras palavras, um esqueleto vazio que contém todas as classes do seu design com todas as variáveis membro e métodos. Neste ponto, os métodos podem estar (na maior parte) vazios. Você os preencherá mais tarde, quando iniciar o programa.
Evite Erros de Construção
Um fator importante ao prototipar seu programa é ter certeza de que ele pode ser construído (geralmente dizemos "compilado") sem erros. É por isso que alguns dos seus métodos não podem estar completamente vazios.
Se a função tiver um tipo de retorno void, ou seja, não retornar nada, ela pode ser deixada
completamente vazia.
Entretanto, se a função tiver um tipo de retorno, você precisará retornar algo, caso contrário, terá
erros ao tentar executá-la. Por exemplo, se o tipo de retorno for string, você pode incluir
return ""; como uma única linha da função para que não haja erros.
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 (por
exemplo,
Diario.cs).
- Certifique-se de que seu programa possa ser compilado sem erros.
- Confirme (commit) e envie (push) seu código para seu repositório GitHub.
Precisa de ajuda para começar?
Se você não tiver certeza de como iniciar o código com base neste design, assista ao seguinte vídeo curto que explica esse processo:
Envio
Após concluir esta atividade, retorne ao Canvas para responder a dois questionários associados a esta atividade:
- S02 - Atividade em Grupo: Design do Programa de Diário: É aqui que você responde às perguntas de "Avalie o Design". Você pode responder a este questionário até 3 vezes.
- S02 - Atividade em Grupo: Relatório da Participação: É aqui que você relata sua participação em seu grupo. A nota mais baixa desta categoria será descartada no final do curso. Então, se você precisar faltar a uma reunião por qualquer motivo, não será um problema, mas se isso se tornar frequente, você não ganhará todos os pontos pelo seu trabalho em equipe.