CSE 210: Programação com Classes

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.

  1. Qual parte da atividade de aprendizagem foi a mais difícil para você?
Orientações do Instrutor

Lembre-se:

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.

  1. O que o programa faz?
  2. Quais são as entradas do usuário?
  3. Que saída ele produz?
  4. Como o programa termina?
Orientação do Instrutor

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.

  1. Quais são bons candidatos para classes neste programa?
  2. 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:

Avalie o Design

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:

  1. 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 : ):

Avalie o Design

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:

  1. Quais atributos essa classe precisa para cumprir seus comportamentos? (Em outras palavras, quais variáveis esta classe deve armazenar?)
  2. 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:

Avalie o Design

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.

  1. Quais construtores cada classe deve ter?

    • Em outras palavras, quais parâmetros você deve passar ao criar um objeto desse tipo.
  2. 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

Revise o design

Reserve um minuto para revisar seu design final.

  1. 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.

Diagrama de classe do programa Escritura

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:

  1. 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:

  1. 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.
  2. Certifique-se de que seu programa possa ser compilado sem erros.
  3. 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:

  1. S03 - Atividade em Grupo: Design do Programa de Memorização de Escrituras
  2. S03 - Atividade em Grupo: Relatório da Participação