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 construir um sistema completo de perfil de usuário que reúna todos os conceitos de null safety que você aprendeu neste capítulo. Você criará um sistema que gerencia contas de usuário com uma mistura de informações obrigatórias e detalhes opcionais.
Você organizará seu código em dois arquivos:
user_profile.dart: Defina uma classeUserProfileque representa uma conta de usuário. Pense em quais informações são essenciais (como um nome de usuário) versus o que é opcional (como uma biografia ou número de telefone). Sua classe deve ter:- Um
String usernamenão anulável - todo usuário deve ter um nome de usuário - Um
String emailnão anulável - todo usuário deve ter um e-mail - Um
String? displayNameanulável - os usuários podem preferir mostrar um nome diferente - Um
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 retorna o nome de exibição se definido, caso contrário, retorna o nome de usuário usando?? - Um método
getBioPreview()que retorna os primeiros 20 caracteres da biografia seguidos por...se a biografia existir e for maior que 20 caracteres, a biografia completa se tiver 20 caracteres ou menos, ounullse não houver biografia (use?.para acesso seguro) - Um método
setDefaultBio()que define a biografia como'Hello, I am new here!'apenas se ela for atualmente nula usando??= - Um método
printProfile()que exibe o perfil completo do usuário
- Um
main.dart: Importe sua classe de perfil de usuário e crie vários usuários para demonstrar toda a gama de recursos de null safety:- Crie um usuário com username
'alice_dev'e email'alice@code.com', então 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 username
'bob_builder'e email'bob@build.io', então defina apenas o nome de exibição como'Bob' - Crie um usuário com username
'charlie99'e email'charlie@mail.net'(deixe todos os campos opcionais como nulos) - Chame
setDefaultBio()em todos os três usuários - Para cada usuário em ordem, chame
printProfile(), depois imprimaIdentity: [getDisplayIdentity()]e, em seguida, imprimaBio preview: [getBioPreview()]
- Crie um usuário com username
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() porque ela já possui um valor, enquanto Charlie recebe a biografia padrão atribuída. Observe também como a prévia da biografia trunca a biografia mais longa de Alice, mas mostra a biografia padrão mais curta de Charlie na íntegra.
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 POO
Arquivos ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==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 & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository