Recapitulação — Sistema de perfil de usuário
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 29 de 110.
Desafio
FácilVamos criar um sistema completo de perfil de usuário que reúne todos os conceitos de segurança contra nulos que você aprendeu neste capítulo. Você criará um sistema que gerencia contas de usuário com uma combinação de informações obrigatórias e detalhes opcionais.
Você organizará seu código em dois arquivos:
user_profile.dart: defina uma classeUserProfileque represente uma conta de usuário. Pense em quais informações são essenciais (como um nome de usuário) e quais são opcionais (como uma biografia ou um número de telefone). Sua classe deve ter:- Uma
String usernamenão anulável — todo usuário deve ter um nome de usuário - Uma
String emailnão anulável — todo usuário deve ter um e-mail - Uma
String? displayNameanulável — os usuários podem preferir exibir um nome diferente - Uma
String? bioanulável — nem todo mundo escreve uma biografia - Um
int? ageanulável — a idade é uma informação pessoal opcional - Um construtor usando parâmetros nomeados com
requiredparausernameeemail - Um método
getDisplayIdentity()que retorne o nome de exibição se estiver definido; caso contrário, retorne o nome de usuário usando?? - Um método
getBioPreview()que retorne os primeiros 20 caracteres da biografia seguidos por...se a biografia existir e tiver mais de 20 caracteres; a biografia completa se tiver 20 caracteres ou menos; ounullse não existir uma biografia (use?.para acesso seguro) - Um método
setDefaultBio()que defina a biografia como'Hello, I am new here!'somente se ela for atualmente nula, usando??= - Um método
printProfile()que exiba o perfil completo do usuário
- Uma
main.dart: importe sua classe de perfil de usuário e crie vários usuários para demonstrar toda a variedade de recursos de segurança contra nulos:- Crie um usuário com o nome de usuário
'alice_dev'e o e-mail'alice@code.com'; depois defina o nome de exibição como'Alice', a biografia como'Software developer passionate about clean code and testing'e a idade como28 - Crie um usuário com o nome de usuário
'bob_builder'e o e-mail'bob@build.io'; depois defina apenas o nome de exibição como'Bob' - Crie um usuário com o nome de usuário
'charlie99'e o e-mail'charlie@mail.net'(deixe todos os campos opcionais como nulos) - Chame
setDefaultBio()nos três usuários - Para cada usuário, na ordem, chame
printProfile(); depois imprimaIdentity: [getDisplayIdentity()]; em seguida, imprimaBio preview: [getBioPreview()]
- Crie um usuário com o nome de usuário
O método printProfile() deve imprimir neste formato:
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Observe como a biografia de Alice permanece inalterada após setDefaultBio(), pois ela já tem um valor, enquanto Charlie recebe a biografia padrão. Observe também como a prévia da biografia trunca a biografia mais longa de Alice, mas exibe por completo a biografia padrão mais curta de Charlie.
Saída esperada:
===== User Profile =====
Username: alice_dev
Email: alice@code.com
Display Name: Alice
Bio: Software developer passionate about clean code and testing
Age: 28
Identity: Alice
Bio preview: Software developer p...
===== User Profile =====
Username: bob_builder
Email: bob@build.io
Display Name: Bob
Bio: Hello, I am new here!
Age: Not specified
Identity: Bob
Bio preview: Hello, I am new here!
===== User Profile =====
Username: charlie99
Email: charlie@mail.net
Display Name: Not set
Bio: Hello, I am new here!
Age: Not specified
Identity: charlie99
Bio preview: Hello, I am new here!Experimente você mesmo
import 'user_profile.dart';
void main() {
// TODO: Criar usuário 'alice_dev' com o e-mail 'alice@code.com'
// Definir displayName como 'Alice'
// Definir bio como 'Software developer passionate about clean code and testing'
// Definir age como 28
// TODO: Criar usuário 'bob_builder' com o e-mail 'bob@build.io'
// Definir apenas displayName como 'Bob'
// TODO: Criar usuário 'charlie99' com o e-mail 'charlie@mail.net'
// Deixar todos os campos opcionais como null
// TODO: Chamar setDefaultBio() em todos os três usuários
// TODO: Para cada usuário em ordem (alice, bob, charlie):
// 1. Chamar printProfile()
// 2. Imprimir "Identity: [getDisplayIdentity()]"
// 3. Imprimir "Bio preview: [getBioPreview()]"
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosBibliotecas e importsIntrodução à OOPClasses vs. objetosA palavra-chave thisMétodosVariáveis de instânciaNoções básicas de construtoresRevisão - Calculadora simples4Segurança contra nulos
Introdução à segurança contra nulosAnulável vs. não anulávelOs operadores ? e !Palavra-chave Late e segurança contra nulosOperadores conscientes de nulosSegurança contra nulos em classesRecapitulação — Sistema de perfil de usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementação vs. ExtensãoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Genéricos
Visão geral de List, Set e MapColeções com segurança de tiposClasses genéricasMétodos genéricosRestrições genéricasIterable e IteratorRecapitulação - Armazenamento genérico13Conceitos Avançados de OOP
Composição vs. HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Registros (Dart 3)Padrões e Correspondência (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários2Construtores em Dart
Construtor padrãoConstrutores nomeadosListas de inicializaçãoConstrutores constantesConstrutores factoryConstrutores de redirecionamentoRevisão - Construtor de formas5Encapsulamento
Membros Públicos vs. PrivadosConvenção do Prefixo _Privacidade no Nível da BibliotecaAprofundamento em Getters e SettersOcultação de InformaçõesRecapitulação - Registros de Alunos8Mixins
Introdução a MixinsCriando MixinsUsando vários MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema de Animais11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode e ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs. EstáticosCampos Final e ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Contas Bancárias6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodosA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do polimorfismoPolimorfismo por meio de interfacesVerificação de tipos em tempo de execuçãoOs operadores is e asPalavra-chave covarianteRecapitulação — Processador de pagamentos12OOP Assíncrona
Futures e async/awaitNoções básicas de StreamsControladores de StreamConstrutores assíncronosAsync em métodos de classeRecapitulação — Buscador de dados15Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão RepositoryPratique por conta própria: Compilador de Dart online