Visão Geral e Estrutura do Projeto
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 98 de 107.
Desafio
FácilVamos dar o pontapé inicial no projeto do Sistema de Gerenciamento de Biblioteca configurando a estrutura fundamental! Nesta primeira etapa, você criará o esqueleto básico que suportará todos os recursos que construiremos nas próximas lições.
Você organizará seu código em três arquivos para estabelecer uma separação clara de responsabilidades:
book.go: Defina uma structBookque representa um livro da biblioteca. Cada livro deve ter umID,Title,Authore um statusAvailable(booleano). Crie uma função construtoraNewBookque recebe o ID, título e autor como parâmetros e retorna um ponteiro para um novo Book comAvailabledefinido comotruepor padrão. Adicione também um métodoString()que retorna as informações do livro no formato:[ID] Title by Authoruser.go: Defina uma structUserrepresentando um membro da biblioteca com os camposID,NameeEmail. Crie uma função construtoraNewUserque recebe todos os três valores e retorna um ponteiro para um novo User. Adicione um métodoString()que retorna:User: Name (Email)main.go: Reúna tudo lendo a entrada para criar livros e usuários, e então exiba suas informações.Leia o número de livros a serem criados. Para cada livro, leia seu ID, título e autor em linhas separadas. Em seguida, leia o número de usuários e, para cada usuário, leia seu ID, nome e e-mail em linhas separadas.
Após criar todos os itens, imprima a representação em string de cada livro em sua própria linha, seguida pela representação em string de cada usuário em sua própria linha.
As seguintes entradas serão fornecidas:
- Número de livros
- Para cada livro: ID, título e autor (cada um em linhas separadas)
- Número de usuários
- Para cada usuário: ID, nome e e-mail (cada um em linhas separadas)
Por exemplo, dado:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comSua saída deve ser:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)E dado:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comSua saída deve ser:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)Esta base estabelece os modelos de dados principais que você expandirá ao longo do projeto. Na próxima lição, você aprimorará essas structs e adicionará a funcionalidade de empréstimo!
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Ler o número de livros
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Criar um slice para armazenar livros
// TODO: Ler as informações de cada livro (ID, title, author em linhas separadas)
// e criar objetos Book usando NewBook
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
// TODO: Criar um novo livro e adicioná-lo ao seu slice
}
// Ler o número de usuários
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Criar um slice para armazenar usuários
// TODO: Ler as informações de cada usuário (ID, name, email em linhas separadas)
// e criar objetos User usando NewUser
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: Criar um novo usuário e adicioná-lo ao seu slice
}
// TODO: Imprimir a representação em string de cada livro
// TODO: Imprimir a representação em string de cada usuário
fmt.Println("TODO: Print output here")
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool12Conceitos Avançados de OOP
Padrão Functional OptionsPadrão Builder em GoEncadeamento de MétodosType Aliases vs DefiniçõesFundamentos de ReflectionVisão Geral de Geração de Código15Projeto: Gerenciamento de Biblioteca
Visão Geral e Estrutura do ProjetoStructs de Livro e Usuário