Livros e Membros
Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 50 de 57.
Neste projeto, você construirá o núcleo de um sistema de biblioteca. Uma classe Library recebe comandos, um por linha, e responde a cada um deles. Ao longo de cinco etapas, ela aprende a adicionar livros e membros, emprestar e devolver livros, pesquisar no catálogo e imprimir um relatório:
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTO modelo de dados usa o que esta seção ensinou. Book e Member ficam cada um em seu próprio arquivo. O borrower de um livro pode ser lido em qualquer lugar, mas só é alterado por meio de lendTo e giveBack, e um membro expõe os ids de seus empréstimos como uma List somente leitura. A biblioteca mantém ambos em mapas privados, portanto somente seus próprios métodos podem alterá-los:
class Book(val id: Int, val title: String) {
var borrower: String? = null
private set
val isAvailable: Boolean
get() = borrower == null
fun lendTo(name: String) { borrower = name }
}Dentro de main:
val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")Saída:
false adahandle(line) divide o comando e usa um when em sua primeira palavra. Cada ramificação retorna suas respostas como uma List<String>, portanto um comando como REPORT pode responder com várias linhas, e um return antecipado devolve uma recusa. O título de um livro pode conter espaços, então ele corresponde a tudo depois do identificador:
Dentro de main:
val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")Saída:
7: The HobbitDesafio
FácilComplete Library.handle(line) para os dois primeiros comandos:
ADD_BOOK <id> <title>: armazene um novo livro disponível e respondaadded book 1: Dune; quando o id já estiver em uso, respondabook 1 exists.JOIN <name>: adicione um membro e respondawelcome ada; quando o nome já existir, respondaada is already a member.
O código fornecido passa cada linha de entrada para library.handle(line) e imprime cada resposta retornada em sua própria linha. Os nomes dos membros são palavras únicas em minúsculas, os ids dos livros são números inteiros, e a entrada contém apenas os comandos descritos até agora. Qualquer outro comando responde unknown command.
Seu código deve ficar em Book.kt, Member.kt e Library.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
fun main() {
// Código de entrada/saída fornecido: mantenha-o como está
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesConstrutores PrimáriosBlocos init e ValidaçãoConstrutores SecundáriosRecapitulação - Cartão da Biblioteca4Herança
Classes Abertas e SubclassesSobrescrevendo Membrossuper e ConstrutoresClasses AbstratasRevisão - Diretório de Funcionários2Propriedades e Encapsulamento
Acessores PersonalizadosModificadores de VisibilidadeSetters Privadoslazy e lateinitRevisão - Conta Bancária5Interfaces
Declarando InterfacesMétodos PadrãoMúltiplas InterfacesInterfaces como TiposRecapitulação - Métodos de Pagamento8Genéricos
Funções genéricasClasses genéricasRestrições de tipoVariância com in e outRecapitulação - Fila de prioridade11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Kotlin