S05 - Projeto: Programa de Introspecção
Visão Geral do Problema
Vivemos em um mundo acelerado, cheio de estresse e ansiedade. Cada um de nós pode se beneficiar ao reservar um tempo para atividades de introspecção, nas quais podemos refletir e relaxar.
A maioria das pessoas concordaria que deveríamos dedicar mais tempo à meditação, mas relativamente poucos o fazem. Pense por um momento em alguns motivos que você acha que impedem as pessoas de fazer isso. Algum programa ou aplicativo poderia ajudar com alguma dessas coisas?
Alguns dos problemas que você considerou podem ter incluído:
- Nós esquecemos
- Nós ficamos ocupados
- Achamos que vai demorar muito, então não começamos
- Não sabemos por onde começar. Sabemos que precisamos refletir sobre algo, mas não sabemos por onde começar
Embora possa não resolver todos os problemas que impedem as pessoas de dedicar mais tempo à reflexão, um ótimo programa pode ajudar as pessoas, fornecendo estrutura e instruções para orientá-las em vários exercícios.
Ideia de Solução
Considere um aplicativo que oferece três tipos diferentes de oportunidades de introspecção. Poderia dar alguma orientação e estrutura aos usuários nas seguintes atividades:
- Atividade de respiração - Ajude o usuário a controlar o ritmo da respiração para ter uma sessão de respiração profunda por um determinado período. Ele pode encontrar mais paz e menos estresse por meio do exercício.
- Atividade de reflexão - Oriente o usuário a pensar profundamente, fazendo-o considerar uma determinada experiência em que obteve sucesso ou demonstrou força. Em seguida, faça perguntas para que ele reflita mais profundamente sobre os detalhes dessa experiência. Ele pode descobrir uma profundidade maior do que imaginava anteriormente.
- Atividade de listagem - Oriente o usuário a pensar de forma ampla, ajudando-o a listar o máximo de coisas possível em uma determinada área positiva. Ele pode descobrir mais amplitude do que imaginavam anteriormente.
O aplicativo também pode ajudar o usuário a monitorar o tempo ou a frequência que ele gasta nessas atividades e fornecer lembretes e avisos gentis.
Especificação
Escreva um programa que forneça as três atividades descritas acima. Ele deve ajudar a trabalhar essas atividades em estágios usando formas básicas de atraso (animação ou contagem regressiva).
Requisitos Funcionais
Seu programa deve fazer o seguinte:
- Ter um sistema de menu que permita ao usuário escolher uma atividade.
- Cada atividade deve começar com uma mensagem inicial que forneça o nome da atividade, uma descrição, e solicite e defina a duração da atividade em segundos. Em seguida, deve informar ao usuário para se preparar para começar, e então pausar por alguns segundos.
- Cada atividade deve terminar com uma mensagem final que informe ao usuário que ele fez um bom trabalho, fazer uma pausa, e depois informar a atividade que ele concluiu, a duração, e fazer uma pausa de alguns segundos antes de terminar.
- Sempre que o aplicativo for pausado, ele deve mostrar algum tipo de animação ao usuário, como um indicador de progresso (spinner), um cronômetro de contagem regressiva, ou pontos finais sendo exibidos na tela.
- A interface do programa deve permanecer fiel àquela exibida na demonstração em vídeo.
- Forneça atividades para reflexão, respiração e listagem, conforme descrito abaixo:
Atividade de Respiração
- A atividade deve começar com a mensagem inicial padrão e perguntar qual a duração desejada para a atividade.
- A descrição desta atividade deve ser algo como: "Esta atividade ajudará você a relaxar, inspirando e expirando lentamente. Limpe sua mente e concentre-se na sua respiração."
- Após a mensagem inicial, o usuário vê uma série de mensagens alternando entre "Inspire..." e "Expire...".
- Após cada mensagem, o programa deve pausar por alguns segundos e mostrar uma contagem regressiva.
- Ele deve continuar até atingir o número de segundos especificado pelo usuário para a duração.
- A atividade deve concluir com a mensagem de encerramento padrão para todas as atividades.
Atividade de Reflexão
- A atividade deve começar com a mensagem inicial padrão e perguntar qual a duração desejada para a atividade.
- A descrição desta atividade deve ser algo como: "Esta atividade ajudará você a refletir sobre momentos da sua vida em que você demonstrou força e resiliência. Isso ajudará você a reconhecer o poder que você tem e como pode usá-lo em outros aspectos da sua vida."
-
Após a mensagem inicial, selecione a mensagem aleatória para exibir ao usuário, como:
- Pense em uma ocasião em que você defendeu outra pessoa.
- Pense em uma ocasião em que você fez algo realmente difícil.
- Pense em uma ocasião em que você ajudou alguém necessitado.
- Pense em uma ocasião em que você fez algo verdadeiramente altruísta.
-
Após exibir a mensagem, o programa deve pedir para que o usuário reflita sobre questões relacionadas a essa experiência. Essas perguntas devem ser retiradas de uma lista como a seguinte:
- Por que essa experiência foi significativa para você?
- Você já fez algo assim antes?
- Como você começou?
- Como você se sentiu quando terminou?
- O que tornou esse momento diferente de outras vezes em que você não teve tanto sucesso?
- Qual é a sua coisa favorita sobre essa experiência?
- O que você pode aprender com essa experiência que se aplica a outras situações?
- O que você aprendeu sobre si mesmo por meio dessa experiência?
- Como você pode manter essa experiência em mente no futuro?
- Após cada pergunta, o programa deve pausar por alguns segundos antes de passar para a próxima. Enquanto o programa estiver pausado, ele deverá exibir uma espécie de indicador de progresso (spinner).
- Ele deve continuar mostrando perguntas aleatórias até atingir o número de segundos especificado pelo usuário para a duração da atividade.
- A atividade deve concluir com a mensagem de encerramento padrão para todas as atividades.
Atividade de Listagem
- A atividade deve começar com a mensagem inicial padrão e perguntar qual a duração desejada para a atividade.
- A descrição desta atividade deve ser algo como: "Esta atividade ajudará você a refletir sobre as coisas boas da sua vida, fazendo com que você liste o máximo de coisas que puder em uma determinada área."
-
Após a mensagem inicial, selecione a mensagem aleatória para exibir ao usuário, como:
- Quem são as pessoas que você aprecia?
- Quais são seus pontos fortes pessoais?
- Quem são as pessoas que você ajudou esta semana?
- Quando você sentiu o Espírito Santo neste mês?
- Quem são alguns dos seus heróis pessoais?
- Depois de exibir a mensagem, o programa deve fazer uma contagem regressiva de alguns segundos para que o usuário comece a pensar nela. Então, isso deve incentivá-lo a continuar listando itens.
- O usuário lista quantos itens puder até atingir a duração especificada por ele no início.
- A atividade exibe o número de itens que foram inseridos.
- A atividade deve concluir com a mensagem de encerramento padrão para todas as atividades.
Requisitos de Design
Além disso, seu programa deve:
- Use herança tendo uma classe separada para cada tipo de atividade com uma classe base para conter quaisquer atributos ou comportamentos compartilhados.
- Evite duplicar código em classes onde ele poderia ser colocado em uma classe base.
- Siga os princípios de encapsulamento e abstração tendo variáveis membro privadas e colocando itens relacionados na mesma classe.
Simplificações
Para os requisitos básicos, você não precisa se preocupar com o seguinte:
- Seu programa não precisa rastrear nenhuma estatística, como quantas vezes ou com que frequência o usuário realizou uma atividade.
- Ao receber perguntas ou mensagens aleatórias, você pode simplesmente escolher qualquer uma da lista. Você não precisa se preocupar se ela já foi escolhida ou mesmo se as mensagens forem todas exibidas.
Demonstrando Criatividade e Indo Além dos Requisitos
Atender aos requisitos básicos torna seu programa elegível para receber 93% da nota máxima. Para receber 100% na tarefa, você precisa demonstrar criatividade e superar esses requisitos.
Aqui estão algumas ideias que você pode considerar:
- Adicionar outro tipo de atividade.
- Manter um registro de quantas vezes as atividades foram realizadas.
- Certificar-se de que nenhuma pergunta/mensagem aleatória seja selecionada até que todas tenham sido usadas pelo menos uma vez.
- Salvar e carregar um arquivo de registro.
- Adicionar animações mais significativas para a respiração (como um texto que cresce rapidamente no início e depois fica mais lento à medida que se aproxima do final do exercício de respiração).
- Qualquer outra coisa que você imaginar!
Relate o que você fez para superar os requisitos adicionando uma descrição disso em um comentário no arquivo Program.cs.
Demonstração em Vídeo
O vídeo a seguir demonstra como esse programa deve funcionar:
Link direto: ▶️Demonstração do Programa de Introspecção (5 minutos)
Ajuda com o Código
Você pode achar o código a seguir útil neste projeto:
Pausando
No vídeo de demonstração, você pode ver o programa pausando por um certo período. Isso pode ser feito com o
método Thread.Sleep(), que recebe um inteiro como o número de milissegundos para o "thread de
execução" atual entrar no modo soneca ou pausar.
O exemplo a seguir mostra como fazer o computador esperar 1 segundo (1000 milissegundos):
Console.WriteLine("Vou dormir por um segundo...");
Thread.Sleep(1000);
Console.WriteLine("Estou de volta!!");
Exibição de Animações
Para exibir uma animação, como o indicador de progresso (spinner) ou o cronômetro de contagem regressiva, você
precisa fazer o
computador pausar por um período e, em seguida, substituir o caractere anterior por um novo. Isso pode ser feito
escrevendo o caractere de retrocesso "\b", que funciona como se estivesse pressionando o botão de
seta para a esquerda.
Depois, você pode escrever um novo caractere por cima dele.
Como o caractere de retrocesso funciona como se estivesse pressionando o botão de seta para a esquerda, em vez
de um retrocesso (backspace), ele
não apaga o caractere na tela. Com isso em mente, é comum escrever "\b \b", que se move para a
esquerda, escreve um espaço em branco sobre o caractere anterior e depois se move para a esquerda novamente,
para que esteja pronto para o novo caractere.
O exemplo a seguir mostra como substituir um caractere após meio segundo:
Console.Write("+");
Thread.Sleep(500);
Console.Write("\b \b"); // Apague o caractere +
Console.Write("-"); // Substitua-o pelo caractere -
Se esse código estivesse em um loop, ele continuaria exibindo e substituindo caracteres.
Trabalhando com Tempo
A linguagem C# tem uma poderosa biblioteca de Data e Hora. Pode ser útil obter a hora atual, adicionar alguns segundos a ela e, então, verificar se a hora atual é menor que a nova hora.
Isso pode ser feito com a classe DateTime. Um objeto com a hora atual pode ser obtido com
DateTime.Now. Então, ele tem métodos como .AddSeconds(numeroDeSegundos) e funciona com
o operador menor que < como seria de se esperar.
O trecho de código a seguir mostra um exemplo:
DateTime horaInicial = DateTime.Now;
DateTime horaFinal = horaInicial.AddSeconds(5);
Thread.Sleep(3000);
DateTime horaAtual = DateTime.Now;
if (horaAtual < horaFinal)
{
Console.WriteLine("Ainda não chegamos ao nosso tempo futuro...")
}
O vídeo a seguir mostra como usar esses trechos de código para obter animações de exibição simples.
Link Direto: ▶️Exibição de Animações (12 minutos)Design
Você trabalhará com seu grupo para criar um design para este programa. Então, cada um escreverá o código do programa individualmente.
Design Final (não abra até depois da reunião de design)
Para fins de referência, aqui está uma cópia do design que foi criado durante a atividade de design.
Para entender as decisões que levaram a esse design, certifique-se de percorrer a atividade de design passo a passo antes de usar esse design para iniciar seu código.
Desenvolver o Programa
No repositório do curso, encontre o projeto Introspeccao na pasta semana05 e escreva
seu
programa lá.
Envio
- Desenvolva o programa usando o princípio de herança conforme descrito acima.
- Não se esqueça de descrever tudo o que você fez para superar os requisitos nos comentários do arquivo Program.cs.
- Confirme (commit) e envie (push) seu código-fonte para o GitHub.
- Verifique se você consegue ver seu código atualizado no GitHub.
- No Canvas, envie um link para seu repositório GitHub. No comentário de envio, descreva qualquer coisa que você tenha feito para mostrar criatividade e superar os requisitos básicos.