Uma prosa sobre Orientação a Objetos: Classes
Tags: beginners, programming, typescript, architecture
Published: 2022-06-21 22:42:02

No [último post](https://dev.to/cakebelz/uma-prosa-sobre-orientacao-a-objetos-45d1) entendemos o que é a Orientação a Objetos, o que é um objeto e que para que tenhamos sistemas úteis devemos aprender a manipulá-los. As classes são componentes fundamentais nesse momento.

A primeira coisa que preciso te explicar é o conceito de **instância**, ele me confundiu muito ~~e inclusive hoje em dia ainda me pego pesquisando sobre~~.
Na orientação a objetos, chamamos o objeto de instância de uma classe. O problema aqui é o significado dessa palavra em português:


![Significado de Instância: "característica do que é iminente, do que está prestes a acontecer; iminência."](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acsbdvmlnpecfe719mzr.png)


Não sei pra você, mas pra mim NUNCA fez ~~e nunca fará~~ sentido dizer que o objeto é uma "iminência" de uma classe.
Acontece que "instância" nesse sentido veio (presume-se) de _instance_ no inglês, que significa basicamente "exemplo" ou "caso". 

Aí sim, faz sentido! Um objeto é um caso ou exemplo que é feito a partir de uma classe.

A variável que recebe uma nova instanciação recebe todos os atributos e métodos da classe. Podemos dizer também que um objeto é a concretização de uma classe, que é, para todos os termos, um molde.

Agora você já sabe que quando falamos em "instânciar uma classe" estamos falando em criar um objeto moldado por ela, que recebe todas as mesmas características iniciais.


Show de bola, a classe é o molde do objeto. E o que tem na classe?
A estrutura básica é de atributos e métodos.

- Atributos são as características daquilo que estamos querendo exemplificar;
- Métodos são os meios pelos quais esses atributos serão computados; 

Muitos falam que os métodos são comportamentos, pois os exemplos usados denotam isso, mas não é uma explicação que case com o mundo real ~~na minha singela opinião~~. Por exemplo, uma classe cachorro teria o método _latir()_. 

![classe Cachorro com método latir](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xfb2wepo50121a31tgkr.png) 

Aqui, _pelo_ e _nome_ são atributos dessa classe, e realmente, latir é um comportamento de cachorro mas isso não existe no nosso cotidiano. O que queremos é cadastrar um cachorro e <u>não fazer ele latir</u>.

![Spock star trek dizendo 'logical'](https://c.tenor.com/NUAA3XSSu-IAAAAC/spock.gif)
 

Vamos então continuar com um exemplo mais aplicável na vida real, mesmo que muito simples. Eu vou usar [Typescript](https://www.typescriptlang.org/) em todos os exemplos. Agora, não vou me ater muito às tipagens e retornos para não complicarmos, mas em breve começaremos a utilizá-lo de forma integral.

![Classe Aluno, com seus atributos e um método](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/znrxrlo2r418mv35ox8t.png)
 
A classe Aluno possui os atributos _nome_, _idade_ e _matricula_, e o método _getAluno()_ que retorna um objeto com as informações. É uma estrutura simples, não?

Quero chamar atenção para o _this_ ~~pois pode ser uma pedra no sapato se você exagera no overthinking como eu~~. Nesse caso, o _this_ é uma palavra-chave, ele é uma referência ao objeto ou classe que está em execução. Por exemplo, o atributo nome do aluno é referenciado como _this.nome_. ~~é SÓ ISSO que você precisa saber agora, eu juro.~~

Para instanciar a nossa classe e usar seu método _getAluno()_, faríamos como no código abaixo:

![Classe Aluno sendo instanciada e seu método getAluno sendo utilizado, retornando nome, idade e matrícula](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yljet5hnrfpw56yw7d4w.png)

Perceba que os valores retornados por _getAluno()_ não foram enviados para nenhum método da nossa classe. Eu fiz isso para ensinar um outro integrante de uma classe, chamado constructor.

O **constructor** é um método especial chamado quando uma nova instância da classe é criada. Ou seja, quando fazemos _"const xpto = new Aluno();"_ o constructor será chamado.

Existem outros motivos para o uso desse método, mas o mais comum é inicializar a classe já com valores para seus atributos, poupando tempo e código.

Também podemos usá-lo como validação, pois se os valores não estiverem de acordo com o que nossos atributos esperam, a classe não é instanciada, você receberia um erro.

Veja no código abaixo como a classe ficaria com um constructor, e como instanciaríamos ela. Agora sim, os valores retornados por _getAluno()_ fazem sentido, pois são os **estados** mais atuais do objeto.

![Classe aluno com um constructor que recebe os valores que serão inicializados nos atributos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzso7qs258cjiyxsk83x.png)

Sempre que instanciamos ou mudamos esses atributos com outros métodos mais específicos (que veremos à frente), estamos alterando o estado do objeto. Estado nada mais é do que os valores dados aos atributos da classe de acordo com os objetos criados a partir dela.

Quando você envia "José" na instanciação da classe _Aluno_ para o objeto _alunoEnsinoMedio_, o estado do atributo _nome_ desse objeto é "José". 

Cada instanciação é diferente, então cada objeto tem um estado diferente. ~~(a menos que, por algum motivo diabólico, você queira fazer dois objetos iguais vindo de duas instanciações diferentes, mas acho que você não é doido assim)~~.

![Instanciando um objeto novo com outros valores para os atributos da classe, e chamando o método getAluno](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pmdsixb5dh8cbu3w7pxd.png)

Acho que esse post já ficou até grande para o propósito do blog, mas com a nossa classe Aluno nós já temos uma classe funcional, e espero que você tenha entendido o que é uma, pra que serve, e o que tem ~~e o que come~~.

![Spock levantando as sobrancelhas com cara de assustado](http://4.bp.blogspot.com/-3PDYd5Jju0w/VPDWICcnWRI/AAAAAAAAMaw/tyx3mZb4Mys/s1600/Spok%2B1.gif)