Alura > Cursos de Programação > Cursos de Node.JS > Conteúdos de Node.JS > Primeiras aulas do curso JavaScript: programação orientada a objetos

JavaScript: programação orientada a objetos

Entendendo a orientação a objetos - Apresentação

Olá, boas-vindas ao curso de primeiros passos em orientação a objetos com JavaScript. Nesse curso, vamos ver um panorama sobre o que é programação orientada a objetos, quais são seus princípios básicos, ela tem alguns princípios que norteiam esse paradigma, exemplos de uso de cada um deles e também alguns aspectos da orientação objetos, da programação orientada a objetos, que são específicos do JavaScript.

Esse curso está voltado para quem está começando do começo em programação, escolheu JavaScript como linguagem para entrar nesse mundo e já teve contato com os fundamentos da linguagem. Então funções, tipos de dados, variáveis arrays e principalmente objetos, e já está criando os seus primeiros programas e quer avançar na linguagem.

Onde começamos e até onde vamos? Então, começamos passando os conceitos de orientação a objeto, então o que é exatamente esse paradigma e para que ele serve, para que ele existe, ao que ele se propõe e quais são os conceitos dele.

Funções e protótipos, vamos mergulhar no modo JavaScript de trabalhar com orientação a objetos, usando funções e entendendo a fundo o que é, como funciona o modelo que é o modelo “nativo”, que é o chamado herança de protótipo, a forma própria do JavaScript de fazer orientação a objetos. Vamos examinar o tal do prototype, o this, que é uma palavra que pega quando estamos aprendendo o JavaScript, as funções construtoras e os métodos de objeto, que são próprios do JavaScript.

Depois, vemos a fundo como a orientação a objetos funciona com o JavaScript, vamos entrar na parte de conceitos de OH, que são classes e heranças, como trabalhamos com classe, a chamada sintaxe de classe, como funciona essa estrutura de classe no JavaScript e herança, a tal da herança de classe, que é um dos principais conceitos que vai junto quando aprendemos a trabalhar com classe, também segue junto o conceito de herança de classe.

Depois, partimos para encapsulamento, é um outro princípio fundamental da orientação a objetos, vamos entender como o encapsulamento funciona, como trabalhamos com essa questão de esconder partes do código, esconder partes da nossa classe, proteger os nossos atributos, e isso acontece através de atributos privados e de funções assessoras que chamamos, getters e setters, vamos ver como trabalhamos com isso no JavaScript.

Finalizando, o polimorfismo é o último dos princípios fundamentais que vamos ver no curso, vamos entender o que ele é e como podemos aplica-lo em um projeto. E por último, depois de vermos todos os conceitos, vamos repassar o tal do Solid, que é um acrônimo para um conjunto de princípios, de design de código, de design de software, que são estabelecidos para orientação de objeto e eles guiam as boas práticas, como que um projeto feito com a orientação a objeto deve funcionar. Vamos ver cada letra desse acrônimo e porque são práticas importantes.

O que você precisa saber antes de começar esse curso? Nesse curso, vamos trabalhar muito firme com partes que são o que eu chamo de fundamentos da linguagem, tipos de dados, variáveis, funções, especialmente objetos e a sua estrutura. Mas não vamos explicar em detalhe como funciona cada um deles, vamos focar no conceito de orientação a objeto mesmo.

Você vai aproveitar melhor esse curso, se já tiver os cursos anteriores sobre fundamentos do JavaScript ou se você já tiver estudado um pouco sobre esses assuntos. Lembrando que nesse curso não falamos sobre assuntos relacionados a front end, mas os conceitos de orientação a objetos, você pode aproveitar tudo da mesma forma.

Depois de finalizar esse curso, você pode começar a trabalhar com as suas APIs, as suas primeiras APIs usando JavaScript, especialmente praticar usando paradigma de orientação a objetos para estruturar o seu projeto. O JavaScript também tem várias bibliotecas e frameworks que utilizam orientação a objetos na montagem dos seus boilerplates, dos seus modelos de uso das bibliotecas, e você consegue entender melhor o que está acontecendo e aplicar melhor o que você viu no curso para estruturar o seu projeto, utilizar esses frameworks.

Eu sou a Juliana Amoasei, vamos lá, que a temos bastante coisa pra fazer.

Entendendo a orientação a objetos - Conceito de OO

Mas antes de começarmos a meter a mão na massa, meter a mão no código, vamos entender um pouco melhor o que são esses paradigmas de programação, o que queremos dizer exatamente quando falamos de programação orientada a objetos. Então vamos lá.

O que são paradigmas de programação? Abordagens sobre como resolver problemas de programação, baseadas em uma teoria ou um conjunto de princípios definidos. Então vamos lá, vamos traduzir isso. Um paradigma de programação se baseia normalmente em alguma teoria matemática ou computacional ou os dois, desenvolvida para resolver determinados problemas de programação de determinada forma.

Cada paradigma de programação tem o seu conjunto de regras, podemos dizer assim, e essas regras cobrem a forma como os dados são tratados, a organização do sistema, a forma como o código é escrito, a arquitetura, entre vários outros aspectos. Existem mais de 20 paradigmas de programação estudados até hoje, e eles funcionam de forma isolada ou em combinação, combinados uns com os outros.

Por exemplo, temos paradigma imperativo, paradigma relacional, declarativo, alguns deles, o orientação a objetos, o objetos é um deles, mas também o que chamamos de programação estruturada, eles derivam do mesmo, que é o imperativo. Já a programação funcional deriva de outro, que é o declarativo.

O relacional, nós o relacionamos muito a estruturas de bancos de dados, por exemplo os bancos de dados relacionais. Então, os paradigmas são como guarda-chuvas. Então temos o imperativo, com alguns outros paradigmas de programação embaixo dele.

Nesse curso, vamos falar especificamente de orientação a objetos, mas vamos deixar um material extra sobre outros paradigmas de programação para você dar uma olhada.

Então vamos lá, orientação a objetos. “Princípio de espelhar o mundo real através de uma estrutura de objetos com características e ações, que interagem uns com os outros”. Traduzindo, a programação orientada a objetos, que é o que vamos ver durante o curso, ela parte da premissa de aproximar a modelagem de código, uma modelagem dos nossos produtos de softwares, dos nossos projetos, com um “mundo real”.

Ou seja, as partes do sistema são estruturadas como objetos, esses objetos tem características e tem comportamentos, que vamos chamar de propriedades, que são as características de um objeto, por exemplo, uma caneta, uma caneta tem cor da tinta, uma caneta tem cor, tem tipo da ponta e ações, que vamos chamar durante o código, de métodos, que é uma caneta pode fazer, ela escreve, algumas delas podem apagar a tinta, não, podemos inventar.

E esses objetos, assim como na vida real, eles interagem uns com os outros. A estrutura central da orientação a objetos é o que chamamos de classe, classe é um modelo para criação de objetos, ou seja, é um molde, a classe caneta é um molde de onde saem todas as canetas, sai caneta azul que escreve de ponta cabeça, sai a caneta verde com ponta fina. Essa é a base da programação orientada a objetos e vamos ver bastante isso durante o curso, vamos ver com um pouco de detalhe como esse lance de classes e moldes de objetos funcionam.

Quando falamos em objeto, em código, temos que realmente abstrair coisas da vida real. Então, por exemplo, temos um gato, o gato ele existe no mundo real, ele não é uma coisa, é um ser, mas você deve ter pegado a ideia. Qual o propósito da orientação a objetos nesse caso? De transformar esses aspectos da vida real, ou seja, um produto, uma pessoa, um processo, uma doença, um animal, e transformar isso em software.

Então, essa abordagem visa aproximar o software, que é uma abstração lógica do mundo, dos problemas que o software tem que resolver. Como assim?

Para abstrairmos um gato, por exemplo, transformar um gato em código, seguindo os princípios da orientação a objetos, começamos dividindo em duas grandes partes, as primeiras são as características desse gato, ou seja, o que chamamos de propriedades.

E essas propriedades descrevem normalmente um objeto, o que o objeto é, então pensando em um gato, o gato tem pelagem, tem um peso, tem idade, tem o nome que damos para ele, tem se é fêmea ou se é macho e o status de saúde, se é castrado, se é vacinado, se tem algum problema de saúde. Então, basicamente, descrevemos o que faz um gato, quais são as características dele.

E a outra grande parte são os comportamentos de um gato. Então, assim como um objeto pode ser descrito de acordo com as suas características, com as suas propriedades, ele também tem comportamentos. Então, no caso do gato, o gato mia, o gato come alguma coisa, podemos definir o que o gato come, o gato dorme, ele se limpa, se lambe, ele brinca com bolinha, brinca com laser, brinca com fitinha. Esses são os comportamentos de um gato. Assim como um gato tem comportamentos, pessoas, por exemplo, tem comportamentos.

E produtos, podem ter comportamentos? É uma coisa que vamos pensar na abstração, quando formos pensar o nosso produto, o que o nosso produto tem que fazer quando falamos em código, que é um pouco diferente da vida real, na vida real é um produto sozinho, não faz muita coisa, mas no código vamos ver que às vezes eles fazem.

Então, se transferíssemos esse exemplo do gato para o JavaScript, podemos usar um objeto literal. Lembrando, um objeto literal é um objeto único, tem seus próprios valores dentro dele, que são dados, dados do tipo string, dados do tipo booleano, tipo número, etc. Então, um objeto gato tem uma propriedade nome, damos um nome para o nosso gato, tem uma data de nascimento, que definimos qual é a idade dele, tem um tipo de pelagem, podemos dizer se é castrado, se é vacinado, se é vermifugado, podemos colocar o telefone de contato de quem é o tutor.

E esses valores dessas propriedades são dados, isso é muito importante, são dados literais, no sentido computacional da palavra. Valores como número, que então, se o gato e castrado, é true, um booleano, que é o true ou false. O resto no meu exemplo são strings, uma string de texto com o nome, o string de texto com a pelagem, o string com a data de nascimento.

E além das características, tem aquela parte do tal do comportamento. Então o gato faz coisas, o gato mia, o gato brinca. E traduzimos isso em código, utilizando o JavaScript, assim como as propriedades podem guardar características de qualquer coisa da vida real, para determinarmos comportamentos, fazemos isso através de funções. Então o nosso gosto pode ter uma função, a função miar, dentro do nosso objeto, e essa função faz um console.log. Gato não faz isso na vida real, mas o nosso gato de código vai fazer.

Então, quando determinamos as funções dentro de um objeto, elas servem justamente para dizer quais são os comportamentos desse objeto que estamos descrevendo. E elas são executadas dentro do contexto desse objeto. Qualquer função que é executada dentro do contexto de um objeto, nós chamamos de método. E é dessa forma que vamos nos referir durante o curso, sempre que falarmos de métodos, estamos falando de funções que são executadas no contexto de um objeto.

Então, a função miar, que devolve um console.log(“miau”) é executada no contexto do meu objeto literal gato, que então tem as outras características, nome, nascimento.

E já começamos a ver como abstraímos conceitos da vida real em objetos e criamos aqui na tela mesmo um objeto literal que descreve um gato e tem características e comportamentos. Mas e se temos mais de um gato, pensando, por exemplo, em uma clínica veterinária que vai atender vários gatos, vários cachorros, papagaios, não dá para termos um modelo como um objeto literal que tem um nome, meu objeto gato só pode ter uma propriedade nome, só pode chamar churrumina, só pode chamar chuchu.

E como fazemos, então? Criamos modelos de objetos. Então, por exemplo, se eu tenho dois gatos, eu tenho que criar dois objetos diferentes, um para cada gato. Poderia fazer da seguinte forma, poderia ter um objeto que eu chamo de gato 1, que é a gata Churrumina, e eu tenho o objeto chamado gato 2, e eu tenho outro gato, que é o Enim, que nasceu no dia 25/01/2021, que é creme, que também está vacinado.

Porém, uma das primeiras coisas que aprendemos em programação é a importância de não repetir e de reaproveitar código. Então já sabemos que se começarmos a criar um monte de variável para guardar informação de vários gatos, não é viável, não é prático e não faz nem sentido, se formos parar pra pensar em como que um suposto sistema de uma clínica veterinária ou qualquer lugar funciona. Ou qualquer sistema que gerencia usuários, não é viável, não faz muito sentido criar um objeto para cada usuário, um objeto para cada gato e ser um objeto literal.

Como resolvemos? O ideal é termos esse modelo que estamos falando, que se reflete no objeto ou na entidade, que é o que queremos criar. Então, se fossemos criar um objeto modeloGato, ele teria um nome, que seria do tipo string, ele teria um nascimento, que ia ser um outro tipo string, a pelagem que seria outro tipo string. O status é um objeto, dentro desse objeto temos 3 outras propriedades, a propriedade castrado, que é booleano, vacinado, que é booleano, vermifugado, que é booleano, e por aí vai, com as características do objeto que você quer criar.

Então, essa é a base da estrutura da orientação a objetos, que é abstrair conceitos da vida real e transformar esses conceitos da vida real em estruturas de código, que combinamos depois umas com as outras, reaproveita vários contextos e vai criando nossos objetos. E cada objeto vai refletir. Eu posso ter um modelo para criar gatos, que a partir dele eu crio vários gatos, quantos gatos minha clínica veterinária precisar.

E eu também posso fazer isso com regras de negócio e com aspectos mais abstratos também da vida, por exemplo, uma clínica veterinária, poderíamos criar uma classe, que é um modelo, poderíamos criar um modelo doença. A partir dele, conseguimos tirar vários objetos que são doenças de gato, doenças de cachorro, o que a doença faz, qual é o cadastro da doença, qual é o remédio.

Então, não apenas coisas do mundo físico, mas também coisa do mundo abstrato. Então, tudo isso no final, na orientação a objeto, assim como as regras de negócio também do seu sistema, vira objeto.

Então, a partir de um modelo, criamos dois gatos. Então nosso modelo gato, que tinha a string nome, a string data e a string pelagem, a partir desse modelo conseguimos extrair dois objetos diferentes, para dois gatos diferentes, e agora temos uma lista de objetos gato. Essa lista pode crescer, minha clínica veterinária pode ter mil clientes gatos, podemos criar a partir desse modelo uma lista com um monte de objetos que tem a mesma estrutura, que tem as mesmas propriedades, e todos se referem a gatos diferentes.

Cada uma dessas cópias que criamos a partir de um modelo, a partir de uma classe, nós chamamos de instâncias, então toda vez que criamos um novo objeto, estamos instanciando um novo objeto, criamos uma nova instância de uma classe.

Então, claro que tem muito mais coisa envolvida na programação orientada a objetos, o que vamos fazer a partir de agora no curso, é investigar e ver cada um dos conceitos principais, os princípios da orientação a objetos, que são o conceito de classe, objeto, no objeto vamos trazer o que já sabemos do JavaScript, herança, polimorfismo e encapsulamento.

Então, esses são meio que os 5 princípios da orientação a objeto, e entendendo esses 5 princípios, conseguimos evoluir dos nossos projetos. Então, vamos lá.

Entendendo a orientação a objetos - Modelando o projeto

Para esse projeto, vamos usar de base, por exemplo, uma plataforma de cursos online. E vamos trabalhar durante o curso com os usuários dessa plataforma. Então, uma plataforma de cursos pode ter usuários que são estudantes, usuários que dão aula, instrutores, professores, usuários que são admin, e cada um, cada tipo de usuário pode ter acesso ou não a coisas que podemos fazer em um sistema.

Então, por exemplo, usuários que são admin, normalmente têm acesso a tudo, podem deletar, podem criar. Professores podem criar cursos, quem é aluno, quem é estudante, pode só acessar um curso. Então, conseguimos pensar em qualquer sistema que envolva gerenciamento de usuários, tipos diferentes de usuários e o que esses usuários podem fazer no sistema.

Seria legal se pudéssemos tirar isso da cabeça, colocar em um papel, rascunhar quais seriam esses tipos de usuários e o que eles poderiam fazer. Existem algumas formas de fazer isso, uma delas é usando um diagrama específico, que chamamos de UML, que é Linguagem Unificada de Modelagem, uma forma de desenvolver diagramas, que usamos para desenvolver projetos em programação.

Vou deixar o material extra para vocês sobre o que é o UML. Mas para o nosso caso, eu já criei um diagrama, que descreve mais ou menos essa conversa que estávamos tendo, quais são os tipos de usuários que o sistema pode ter, o que eles podem fazer.

Existem vários tipos de UML, vários tipos de diagrama que podemos desenvolver de acordo com o nosso projeto, e no caso, o que eu usei foi um diagrama específico para classes. Então, através desse diagrama, é possível listar, tirar do campo das ideias qual seriam os tipos de usuários, isso serviria para qualquer classe que quisermos criar, qualquer modelo de objeto que quisermos criar.

Por enquanto, o que sabemos é que temos um usuário do nosso sistema, que pode ser estudante, pode ser professor. E cada usuário pode fazer determinadas coisas. O que todos os usuários têm em comum? Eles têm as propriedades de nome, e-mail, todo mundo tem que ter para contato, a data de nascimento, o campo role, que é o papel que esse usuário tem, ele vai ser estudante, vai ser professor, vai ser admin, e se está ativo no sistema ou não. Esse é só um exemplo, quando fizer nos seus estudos, você pode colocar as propriedades que você quiser.

E o que, além disso, todo usuário pode fazer no sistema, independente se é estudante, professor. Podemos pensar em algumas coisas. Então, podemos dizer que todos os usuários podem exibir suas informações se o sistema pedir, nome, e-mail, nós que definimos.

Existem outras coisas que um usuário de uma plataforma de cursos poderia fazer no geral, que seria, por exemplo, se matricular em um curso. Então, eu sou admin, eu quero me matricular em um curso, eu posso, eu sou estudante e é basicamente isso que eu posso fazer. Eu sou professor, quero me inscrever em outro curso para assistir, também posso.

Porém, vamos trabalhar por enquanto só com o exemplo que vamos fazer durante o curso, que é exibir informações. Isso, todos os usuários do sistema podem fazer, então nosso usuário padrão tem uma lista de propriedades e um método, um comportamento, algo que ele pode fazer no sistema, que é exibir as informações.

Mas já sabemos que temos pelo menos, 3 tipos de usuário. Tem um usuário que pode fazer tudo, o admin, tem um usuário com algumas permissões que chamamos de docente, professor, e o usuário geral. Vamos dizer, e isso não é uma regra, estamos definindo agora para o nosso projeto, cada projeto, de cada plataforma, pode ter regras diferentes, mas no nosso, nós vamos dizer que um usuário padrão tem só a permissão principal, ele só pode exibir as informações dele.

O restante dos usuários, por exemplo, decentes, professores, eles podem fazer algumas coisas a mais, no caso, ele pode aprovar um estudante, pode ver a nota, passou no curso, ele pode dizer que o estudante passou na matéria dele. Então, além do comportamento de exibiras informações, quem é docente pode também aprovar estudantes.

E o admin? Podemos dizer que ele não vai aprovar estudantes, vamos deixar isso restrito a quem tem o cargo de professor, mas os admins, podem, por exemplo, criar cursos. Então, eu sou professor, eu não vou dar o privilégio de criar curso aos professores, porque fica muito bagunçado, eu quero que só a pessoa que tem privilégios de admin só possa criar curso. É uma regra que eu defini. Como eu disse, cada sistema tem as suas regras, então isso não vai ter um padrão, isso vai ser definido caso a caso, literalmente.

Então, no final, eu tenho 3 tipos de usuário, meu usuário padrão, podemos encaixar os estudantes nesses usuários padrão, então o usuário padrão é o usuário estudante que só pode exibir as suas informações. A partir dele, nós temos usuários que são o tipo docente, roling docente e roling admin, que podem fazer algumas coisas a mais. Porém, no meu diagrama de classes, lembrando que a intenção é termos um modelo, e a partir desse modelo, expandimos, tiramos objetos.

Então, docente e admin não precisam ter, novamente, na listagem deles, nome, e-mail, nascimento, essas coisas, porque eles vão sair do nosso usuário padrão, e a partir do nosso usuário padrão, damos privilégios extras para o docente, damos privilégios extras para o admin.

Então essa é a base, esse diagrama de classes vai ser a base de onde vamos começar a trabalhar para criar os nossos primeiros objetos. Então temos um usuário, um objeto usuário, uma classe usuário que estou chamando de user, ela tem um nome, ela tem propriedades e tem comportamentos. A partir dessa classe, então temos outras duas classes, admin e docente, que saem de usuário e vão ter a mesma estrutura, porém, com privilégios a mais que vamos definir.

Esse é um diagrama específico para classes, então, como eu disse, tem alguns outros, e agora que já sabemos mais ou menos, já tiramos da cabeça e passamos para o “papel” por onde vamos começar a trabalhar com os nossos objetos, podemos começar a rodar. Então vamos lá.

Sobre o curso JavaScript: programação orientada a objetos

O curso JavaScript: programação orientada a objetos possui 184 minutos de vídeos, em um total de 56 atividades. Gostou? Conheça nossos outros cursos de Node.JS 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 Node.JS acessando integralmente esse e outros cursos, comece hoje!

Plus

De
R$ 1.800
12X
R$109
à vista R$1.308
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramaçã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.

Matricule-se

Pro

De
R$ 2.400
12X
R$149
à vista R$1.788
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramaçã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.

  • Luri, a inteligência artificial da Alura

    Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com Luri até 100 mensagens por semana.

  • 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.

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