Primeiras aulas do curso Dart: Dominando a Orientação a Objetos

Dart: Dominando a Orientação a Objetos

A primeira classe - Introdução

O meu nome é Timóteo Holanda e este é o segundo curso de Dart da Alura. No primeiro curso nós vimos coisas como tipos, como variáveis, o que são condicionais, o que é o fluxo do programa.

E nesse curso nós vamos utilizar todo esse conhecimento para nos aprofundarmos em orientação a objetos, o que é orientação a objetos. O que são classes e como nós vamos utilizar essas classes dentro do nosso programa.

Assim como a classe, nós vamos aprender o que são construtores dessas classes, como nós vamos construir objetos a partir dessas classes. E assim, falando de objetos, nós temos que falar também de instâncias. O que são as instâncias? O que está gerando esses objetos dentro do nosso programa?

Nós vamos ver também métodos, o que são métodos dentro dos nossos objetos, dentro das nossas classes. O que são argumentos desses métodos e como retornar um valor desse método.

Não só isso, nós vamos aprender a manter o nosso código consistente, para que outros programadores que cheguem no projeto depois de você ou que estejam programando junto a você, possam manter o seu código organizado, importando arquivos para dentro de outro arquivo que você esteja já trabalhando.

Nós vamos ver como colocar classes dentro de classes. Nós vamos ver o que são membros estáticos, nós vamos ver o que são membros públicos, o que são métodos privados e membros privados.

Nós vamos tentar aprender como escrever um código que é fácil de manter, fácil de entender e também outra variedade de coisas que implementam a orientação [DE] objetos, como o get e set, como fazer isso utilizando o Dart.

Se eu consegui chamar a sua atenção, venha comigo para a próxima aula e vamos continuar aprendendo.

A primeira classe - Nossa primeira classe

Agora que nós já sabemos algumas diferenças na teoria entre programação procedural e programação orientada a objetos, nós vamos ver como, na prática, representar essa ideia em nossos projetos do mundo real.

Para contextualizar os exercícios desse curso, vamos dizer que nós fomos contratados pelo Alura Bank, o banco da Alura. E como programadores da arte do banco da Alura, nós ficamos responsáveis por todo o módulo de conta corrente desse banco. Para facilitar o nosso trabalho, vamos desenhar quais serão as propriedades dessa conta corrente.

Eu vou criar aqui uma caixinha e dentro dessa caixinha, que eu vou chamar de “ContaCorrente”, nós vamos guardar todos os tipos pertinentes a essa conta corrente. Como assim?

O que toda conta corrente tem? Pensando aqui por alto, toda conta corrente tem um titular. Esse titular é o dono dessa conta, e todo dono dessa conta tem um nome. Portanto, nós vamos utilizar uma string para representar o titular dessa conta corrente.

Toda conta corrente também possui um número de agência, que representa qual agência desse banco essa conta corrente foi criada. O banco pode ter várias agências, mas nós vamos utilizar um identificador único da agência, que pode ser um número inteiro.

Assim como todo banco tem várias agências, toda agência pode ter várias contas. Então o número dessa conta também vai ser representado por um número inteiro. Nós temos então uma conta corrente que pertence a uma agência e essa conta corrente possui um titular. Para finalizar, toda conta corrente também tem um saldo. E a motivos de explicação, eu vou utilizar um “double” para representar o dinheiro que está nessa conta corrente.

Mas olhem só, tem uma coisa muito interessante na ciência da computação, que diz que nós não devemos nunca utilizar pontos flutuantes para representar valores monetários. O porquê disso vai um pouco além do escopo desse curso, mas a fim de explicação, nós vamos utilizar o double mesmo.

Vou pintar isso aqui de verde, porque no futuro vai ficar um pouquinho mais fácil de entender e nós vamos voltar agora para o Visual Studio Code.

Eu quero criar um novo projeto, mas eu não vou criar uma pasta e colocar arquivos separados dentro dessa pasta. Vamos criar um projeto utilizando o plugin de Dart, que o Visual Studio Code possui. Se você apertar “Ctrl + Shift + X” no Visual Studio vai aparecer essa janelinha aqui, à esquerda, e você pode procurar por “dart” no campo de texto. O primeiro plugin que aparecer é o plugin de Dart.

Se você tem instalado, vai aparecer esses dois botões em azul aqui, “Disable” e “Uninstall”. Se você não tem instalado, vai aparecer apenas um botão verde escrito “Install”, então você clica no botão Install e o aguarda instalar. Eu já o tenho instalado aqui, então nós vamos dar continuidade dessa vez criando um projeto.

Com esse plugin instalado, você pode apertar “Ctrl + Shift + P” e vai aparecer essa janelinha no centro da sua tela. Você vai escrever “dart”, apertar “:” e a palavra “new”. Ali, a primeira opção, “Dart: New Project”, ou seja, um novo projeto de Dart.

Se você selecionar essa opção, o próprio Visual Studio Code vai se preocupar em fazer esse projeto do zero para nós. Mas ele vai criar apenas o esqueleto do projeto e nós vamos nos preocupar em criar o restante do projeto.

Selecionem a terceira opção, “Console Application”, e logo em seguida vocês vão escolher o nome desse projeto. Eu vou dar o nome de “alurabank”. Apertando o “Enter” ele vai onde você quer salvar esse projeto, e eu vou deixá-lo salvo aqui na área de trabalho mesmo.

Agora vocês vão aguardar, o Visual Studio Code vai estar criando todos os arquivos pertinentes a esse projeto. Enquanto ele executa isso eu vou explicar o porquê que nós fizemos dessa forma. Fazendo assim, o Visual Studio Code vai criar um esqueleto, com todos os arquivos que futuramente nós vamos precisar, de uma forma ou outra, e você não vai precisar se preocupar se eles estão certos ou no lugar certo, porque ele sempre vai criar da mesma forma.

Começando a explicar aqui, no lado esquerdo, nessa janela onde tem os arquivos do projeto, nós temos algumas pastas que são importantes. A primeira é a pasta “bin”. Se você abri-la você vai ver que tem um arquivo chamado “main.dart”. Nós temos uma pasta “lib”, com “alurabank.dart”, e uma pasta “test”, com “alurabank_test”.

Esse “alurabank_test” vai muito além do escopo desse projeto desse curso, então nós vamos excluí-lo. Seguindo aqui, na pasta “lib”, “alurabank.dart”, também não vamos precisar disso aqui, podemos excluí-lo também. E no arquivo “main.dart” eu vou apagar isso tudo e nós vamos escrever aquela estrutura básica do nosso projeto de Dart, o “void main() { }”.

Aqui nós vamos começar a escrever, pensando em conta corrente, como nós vamos mostrar, denominar uma conta corrente dentro do nosso programa. A forma que nós faríamos com programação procedural seria, digamos que o nosso primeiro cliente do nosso banco chegou e quer fazer uma conta. O nome dele é Gabriel, ele está na agência 123, a conta dele vai ser um número qualquer que nós vamos gerar e ele quer depositar 10 reais na sua conta.

Vamos ver aqui de novo. Gabriel é o titular, a agência que ele está é 123, a conta nós vamos inventar uma e o saldo deve ser 10, porque ele já quer depositar 10. Então voltando para o código, nós começamos a escrever. “String titular = “Gabriel”;” que é o nome dele, “int agencia = 123;”, que é essa agência que ele está, “int conta = 145;”, inventei um número aqui agora e “double saldo = 10.0”, porque ele depositou 10 reais agora. Nós temos o nosso primeiro cliente.

Mas logo depois de o Gabriel sair da agência, José chega e quer criar a conta dele também. Vamos criar uma conta corrente para o José? “String titular = “José”;”. Já temos um problema, “titular” já foi utilizado, está sendo utilizado por Gabriel. Então eu vou temporariamente colocar “titular1” aqui. “int agencia = 123;”, que é a agência que ele está no momento.

Só que, mais uma vez, o nome “agencia” já foi utilizado, vamos colocar “agencia1”. “int conta”, “conta” também já teria sido utilizado, então vamos colocar “conta1”. Ele vai ser “146”. E “double saldo = 0.0” porque ele não depositou nada e, “saldo” também já foi utilizado. Vou ter que colocar “saldo1”.

Logo depois de o José sair, Gabriela chegou. Então “String titular2 = “gabriela”; o nome ficou errado, mas está chegando cliente, nós temos que continuar criando várias variáveis. “agencia2 = 147”, eu errei a agência, mas eu não tenho tempo de consertar.

Se vocês não perceberam, a forma procedural de criar esses usuários para o nosso banco é um pouquinho complicado. Vamos excluir esse José e Gabriela que nós criamos aqui agora e realmente pensar no paradigma de orientação a objetos. Nós vamos utilizar dessa vez uma nova palavra reservada do Dart para criar uma classe.

Classes são aquilo que geram os nossos objetos. Para utilizar uma classe no Dart, você vai simplesmente escrever “class”. Nós devemos escrever essa classe fora da nossa main, ou seja, fora das duas “{ }” que compõem tudo aquilo que está em nossa main.

Se tentamos escrever “class” dentro da nossa main nós temos um erro, porque nós precisamos de um espaço que não esteja sendo ocupado por uma função. Portanto, eu vou levar “class” para fora da nossa main e dar o nome dela de “ContaCorrente”, abro e fecho “{ }” também e dessa vez não tem nenhum erro no nosso programa. Agora vou colocá-la dentro da nossa main e o erro acontece, porque ela não vai funcionar dentro de outras funções.

Com a class do lado de fora nós vamos popular essa class com tudo aquilo que pertence a uma conta corrente. O “titular” pertence a uma conta corrente, mas eu não vou colocar o Gabriel logo após. Nós estamos criando uma conta corrente genérica, nós estamos fazendo esse quadradinho que nós desenhamos. Nós também temos a “agencia”, nós temos a “conta” e nós temos o “saldo”.

Com essa classe criada nós podemos vir na nossa main e realmente utilizar. Eu excluí tudo aquilo que pertencia a Gabriel. Mas a partir de agora eu tenho uma classe que é a nossa conta corrente e com ela eu posso criar uma conta corrente dentro da nossa main. Vou dar o nome dessa conta corrente, por enquanto, vai ser “conta”.

Observem que nós vamos utilizar a nossa conta corrente como se fosse um tipo de variável normal, então no “String”, por exemplo, antecede o nome de alguém, então o “gabriel” é o nome de alguém e nós acabamos de criar uma variável para segurar o nome de Gabriel. Mas com a nossa classe nós temos acesso a todas essas variáveis. Agora que nós criamos a nossa conta, vamos imprimir isso aqui para ver o que o Dart vai nos retornar.

Então eu salvei esse programa, vou vir no meu terminal, abrir “alurabank” e a pasta “bin” e eu vou rodar “dart main.dart”. Nós temos essa palavrinha aqui, “null”. Mas o que isso significa?

Utilizando nossos Objetos - Usando nossa classe

Agora que nós criamos a nossa primeira classe, a classe conta corrente, e já criamos uma variável do tipo conta corrente, que é o nosso objeto, quando nós tentamos imprimir esse objeto, no nosso terminal sai o quê? “main.dart”, olha só, sai esse “null”. O que é esse null?

O null significa nada. Significa que não existe nada dentro dessa variável. Não é nem 0, não é nem 1, não é um titular, uma agência, uma conta e um saldo, é literalmente nada.

Isso acontece pela mesma forma quando nós com inicializamos, por exemplo, uma variável do tipo valor, mas nós não atribuímos valor algum a ela, se imprimirmos essa variável “valor” que eu acabei de criar e executar em meu terminal vai sair “null” também, porque nós não inicializamos esse valor.

Agora, se eu coloco “valor = 12” aqui, por exemplo, salvo meu programa, vou no meu terminal e executo novamente, em vez de sair null vai sair “12”, porque é o que eu inicializei dentro de valor.

E como nós inicializamos as nossas variáveis que representam os nossos objetos das classes que nós criamos? Nós podemos igualá-lo à própria classe, então “ContaCorrente”. Dessa vez nós colocamos os “()”, porque atributos dentro de nossas classes são opcionais, nós podemos ou não inserir argumentos que vão eventualmente virar atributos de nossa classe.

Aqui nós estamos inicializando a nossa conta, nós estamos criando uma instância da conta corrente e colocando dentro da nossa variável “conta”. Dessa vez, quando eu imprimo “conta”, olha só o que acontece, nós temos uma instância. Não salvei meu código. Salvei, voltei no meu terminal, executei o código e, olha só, nós temos uma instância de ContaCorrente. Não é mais null, agora é uma instância de ContaCorrente.

Isso que nós fizemos é basicamente copiar e colar a nossa classe, que nós já temos. Vou pintá-la de outra cor, porque isso aqui é uma instância da ContaCorrente e nós demos o nome dela de “conta”, é o nome da variável.

Esse quadradinho verde, “ContaCorrente”, é diferente desse quadradinho azul chamado “conta”, porque o quadradinho azul é uma instância da ContaCorrente, isso significa que isso agora é um objeto. É um objeto que tem o nome de “conta” e possui essas quatro propriedades.

E como eu acesso essas propriedades? Se eu tenho, eu tenho que colocar alguma coisa lá dentro também, não necessariamente tenho que colocar, mas eu posso colocar. Por exemplo, agora que eu tenho o meu objeto conta no meu código, eu posso utilizar “conta” e eu aperto o “.” logo após, para acessar as propriedades dessa variável, que é um objeto de uma classe.

Eu tenho aqui o Visual Studio Code, ele já abre essa janelinha e me mostra todas as propriedades que eu tenho acesso dessa classe, por exemplo, “agencia” é uma delas, “conta” é outra, “saldo” e “titular” são as outras duas que nós tínhamos criado.

Vocês vão ver algumas que também nós não criamos, mas isso o Dart já faz por padrão para todas as classes. Esses aqui não entram no escopo desse curso, mas logo mais nós saberemos utilizá-los também.

Se eu quiser acessar o titular dessa conta, eu posso escrever “conta.titular”, e eu vou tratar isso aqui como uma variável qualquer. Se eu quiser colocar um valor lá dentro, eu vou utilizar aspas e vou colocar, por exemplo, o meu nome. Agora eu sou o titular dessa conta. O que eu acabei de fazer aqui é colocar o valor da string “Timóteo” dentro da “conta.titular”.

Voltando ao desenho, nessa conta, aqui no titular, o tipo dela é string, mas o valor dela agora é “Timóteo”. Os outros que nós ainda não inicializamos, não demos um valor, continuam com seus tipos normais, mas o titular agora é Timóteo.

Voltando ao código, e se eu quiser imprimir o titular dessa conta? Nós podemos utilizar a própria conta aqui, dentro do nosso print, e colocar .titular. Agora nós estamos acessando o campo titular da minha conta. Vou salvar o meu código, volto ao meu terminal e executo novamente.

Vocês vão ver que a saída do meu programa agora é o meu nome, e esse é o esperado, porque dentro de titular, na conta, que é uma instância de ContaCorrente, um objeto do tipo ContaCorrente, eu coloquei o meu nome.

Para acessar os outros campos eu sigo o mesmo padrão, “conta.agencia”, eu vou colocar o valor da agência que eu quero colocar, “conta.conta”, que é o número da conta, eu vou colocar “1234”, e “conta.saldo”, eu vou colocar aqui “150.0” reais. Agora eu tenho todos esses valores dentro da minha variável conta.

Se eu quiser imprimi-los, eu sigo o mesmo padrão com o meu print, eu vou acessar todos eles utilizando “conta.” seguido da propriedade que eu quero acessar, então “agencia” é uma, “conta” é outra e “saldo” é outra. Salvei o meu código, vou voltar no meu terminal, executei e dessa vez vão sair todas as variáveis que eu já iniciei, já dei um valor e agora pertencem à minha conta.

Se eu imprimir novamente “conta”, o que vai acontecer? Absolutamente nada, porque mesmo com os valores agora dentro de conta, conta não deixa de ser uma instância de ContaCorrente, a variável conta continua do jeito que ela é, só que agora as variáveis que ela contém possuem algum valor.

Para eu imprimir esses valores agora, dentro de uma string, utilizando o seguinte padrão, por exemplo, o “Titular” dessa conta, tem que ser “$conta.titular”. Vocês vão notar uma coisa estranha. Agora que nós utilizamos o “$” seguido da palavra “conta”, só a palavra “conta” está em azul, o “.titular” não está. Por que isso está acontecendo?

O Dart trata apenas a primeira palavra que segue o “$” dentro das suas strings para considerar uma variável. Portanto, se você quer imprimir esse conjunto “conta.titular”, você precisa utilizar “{ }”. Antes de “conta” você abre “{“ e depois de “titular” você vai fechar “}”. Agora o “$” está pegando esse conjunto inteiro, então o titular dessa conta será impresso a partir dessa variável, “conta.titular”.

Voltando ao meu terminal, eu vou executar o meu programa novamente e dessa vez saiu “Titular: Timóteo”. É assim que eu formato as minhas strings para conter, por exemplo, o meu objeto da minha classe e alguma propriedade dele. Olha só, “conta.agencia”, “conta.conta” e “conta.saldo”. Vou atualizar desse lado também, “Titular” vira “Agência”, esse “Titular” vira “Conta” e esse “Titular” vira “Saldo”.

Agora que eu tenho essas quatro strings sendo impressas, eu posso voltar ao meu terminal, executar novamente e eu tenho formatado como eu imprimo essas variáveis. Se eu quiser formatar uma string, eu tenho que utilizar o “$” seguido de “{ }”.

Há uma coisa a se notar também, eu tenho acesso a todas as operações matemáticas com essas variáveis, pelo menos do tipo inteiro e do tipo double eu vou ter todas. Se eu quiser adicionar, por exemplo, ao meu saldo, “conta.saldo” eu vou lá e coloco mais 50 reais, eu posso utilizar o “+= 50.0”. Eu estarei adicionando 50 reais ao meu saldo.

Vou imprimir aqui, antes disso tudo eu vou imprimir a minha “(conta.saldo)”. Depois de colocar 150 reais eu vou imprimir o meu saldo. E logo após colocar os 50 reais, eu vou adicionar mais um print no meu código. Vamos ver o que está acontecendo nesse trecho de código. Salvei, volto no meu terminal e executo.

A primeira coisa que vai sair é um “null”, por quê? Nada foi inicializado ainda. O meu “conta.saldo” não tem valor algum, ele não existe, não foi inicializado, portanto, aparece null. Agora, depois de eu colocar 150 reais, eu imprimo novamente e saiu 150 reais. Depois que eu adiciono mais 50 reais no meu saldo, saiu 200 reais.

O que nós estamos fazendo com esse código? Voltando ao nosso desenho, dessa vez a minha instância de ContaCorrente que se chama conta possui uma agência que tem o número 123. Possui uma conta também que é o número 1234 e possui um saldo, que depois do meu primeiro depósito e dos meus outros 50 reais é 200 reais. Essa instância aqui existe por todo o meu código, a não ser que eventualmente eu descarte. Mas isso está para uma aula futura.

Sobre o curso Dart: Dominando a Orientação a Objetos

O curso Dart: Dominando a Orientação a Objetos possui 175 minutos de vídeos, em um total de 42 atividades. Gostou? Conheça nossos outros cursos de Dart em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Dart acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas