Recapitulação - Registros de Alunos
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy. Lição 51 de 107.
Desafio
FácilVamos criar um sistema de registros de estudantes que demonstre o encapsulamento adequado. Você criará uma estrutura de gerenciamento de estudantes na qual os dados acadêmicos confidenciais são protegidos, enquanto ainda oferece acesso controlado por meio de métodos bem projetados.
Você organizará seu código em dois arquivos:
student.go: crie uma structStudentque proteja informações confidenciais enquanto expõe dados públicos seguros. ONamedo estudante deve ser exportado (acessível publicamente), mas seugrade(float64) estudentID(string) devem ser não exportados para proteger essas informações confidenciais.Implemente o seguinte:
- Um construtor
NewStudent(name, id string, initialGrade float64) *Studentque cria um estudante. A nota inicial só deve ser definida se estiver entre 0 e 100 (inclusive); caso contrário, o padrão deve ser 0. - Um getter
Grade() float64que retorna a nota atual - Um getter
StudentID() stringque retorna o ID do estudante - Um setter
SetGrade(newGrade float64) boolque atualiza a nota somente se o novo valor estiver entre 0 e 100 (inclusive). Retornetruese a nota for atualizada efalsecaso contrário. - Um método
Summary() stringque retorna o formato:[Name] (ID: [studentID]) - Grade: [grade]
- Um construtor
main.go: leia as informações do estudante da entrada, crie um estudante usando o construtor e, em seguida, realize operações com a nota. Exiba o resumo do estudante após a criação e depois de cada tentativa de atualização da nota.
As seguintes entradas serão fornecidas:
- Linha 1: Nome do estudante
- Linha 2: ID do estudante
- Linha 3: Nota inicial
- Linha 4: Primeira nova nota a ser definida
- Linha 5: Segunda nova nota a ser definida
Depois de criar o estudante, imprima seu resumo. Em seguida, tente cada atualização da nota; se for bem-sucedida, imprima o resumo atualizado; se for rejeitada, imprima Invalid grade rejected. Formate todos os valores de nota com duas casas decimais.
Por exemplo, considerando Emma Wilson, STU001, 85.5, 92.0 e 150, sua saída deve ser:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejectedA última atualização falha porque 150 está fora do intervalo válido. Seu método setter aplica essa regra, mantendo os dados do estudante válidos. Observe como studentID e grade nunca são diretamente acessíveis: o código externo deve usar seus métodos getter e setter para interagir com esses dados protegidos.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Ler o nome do aluno
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Ler o ID do aluno
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// Ler a nota inicial
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// Ler a primeira nova nota
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// Ler a segunda nova nota
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: Criar um novo aluno usando o construtor NewStudent
// TODO: Imprimir o resumo do aluno após a criação
// TODO: Tentar a primeira atualização de nota
// Se bem-sucedido, imprimir o resumo atualizado
// If rejected, print "Invalid grade rejected"
// TODO: Tentar a segunda atualização de nota
// Se bem-sucedido, imprimir o resumo atualizado
// If rejected, print "Invalid grade rejected"
// Dica: Use fmt.Sprintf com %.2f para formatar as notas em Summary()
_ = newGrade1 // Remova esta linha quando usar a variável
_ = newGrade2 // Remova esta linha quando usar a variável
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosWorkspace e Módulos do GoPacotes e ImportsNomes Exportados vs. Não ExportadosIntrodução à OOP em GoStructs como ClassesDefinindo Métodos em StructsReceptores de Ponteiro vs. de ValorInicialização de StructsFunções ConstrutorasRecapitulação — Calculadora Simples4Interfaces
Introdução às InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Asserção de TipoSwitch de TipoComposição de InterfacesInterfaces Stringer e ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs. Não ExportadosEncapsulamento no Nível de PacoteMétodos Getters e SettersOcultação de Informações em GoRecapitulação - Registros de Alunos10Genéricos (Go 1.18+)
Introdução aos genéricosParâmetros de tipoRestrições de tipoStructs genéricasAlternativa para métodos genéricosRecapitulação - Coleção genérica13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão Abstract FactoryPadrão ObserverPadrão Strategy2Tipos e Structs em Profundidade
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosTags de StructStructs AnônimasStructs AninhadasValores Zero e PadrõesRecapitulação - Livro de Contatos5Composição em vez de herança
Por que Go não tem herançaNoções básicas de incorporação de structsPromoção de métodosIncorporação de várias structsIncorporação vs agregaçãoOcultação de métodos incorporadosRecapitulação - Hierarquia de funcionários8Tratamento de Erros e OOP
A interface errorTipos de Erro PersonalizadosEncapsulamento de Erros (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - Analisador de Arquivos3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs. ReferênciaA Função new()Coleta de Lixo em GoRecapitulação - Construtor de Lista Ligada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfacesColeções PolimórficasInjeção de DependênciasRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e comunicaçãoCanais com e sem bufferInstrução selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de structs thread-safeRevisão - Worker PoolPratique por conta própria: Compilador de Go online