Conceitos

Classes, objetos, atributos e métodos

Classes, atributos e métodos

No paradigma Orientado a Objetos, o conceito de classe é utilizado para representar as entidades envolvidas em determinado contexto. Em um sistema acadêmico, por exemplo, disciplinas e institutos são entidades que podem ser implementadas como classes.

As classes possibilitam dois recursos fundamentais às entidades que representa: o armazenamento de valores, por meio de atributos (nome dado às variáveis), e a execução de determinados comportamentos, por meio de funções ou procedimentos, que no âmbito da orientação a objetos são chamados de métodos. Atributos e métodos são chamados de membros de uma classe.

Para efeitos de comparação, uma classe se assemelha em certo grau a uma estrutura de dados heterogênea, como uma struct em C. A diferença principal começa a partir da compreensão dos comportamentos que uma classe possui, já que há funções que podem ser implementadas na própria classe. Enquanto uma struct em C é limitada ao armazenamento de dados, as classes oferecem a capacidade de encapsular comportamentos, permitindo que funções (métodos) sejam integradas diretamente à definição da classe.

Vejamos o seguinte exemplo, implementado em TypeScript:

export class Pessoa{
    nome: string;
    sobrenome: string;

    nomeCompleto(): string{
          return `${this.nome} ${this.sobrenome}`;
    }
}

A implementação acima revela o potencial da orientação a objetos. A classe Pessoa não é apenas uma estrutura capaz de armazenar dados de uma pessoa, como uma struct em C faz, mas também pode oferecer um recurso dinâmico, que concatena nome e sobrenome, retornando o nome completo. Ou seja, oferece também um método.

Assim como as estruturas, a implementação de uma classe consiste na definição de uma estrutura, um "esqueleto" a ser considerado para a representação de determinada entidade no sistema. Para que uma classe efetivamente receba e armazene informações, ela precisa ser instanciada, tornando-se um objeto na terminologia do paradigma orientado a objetos.

Objetos

Um objeto consiste na instância de uma classe. Ainda se considerando o exemplo da classe Pessoa, ao se representar um indivíduo chamado "João", por exemplo, pode-se dizer que João será um objeto da classe Pessoa.

O processo de se instanciar uma classe, criando um objeto, é denotado pelo uso do operador new na maioria das linguagens de programação. Este é o padrão usado em linguagens como Java e TypeScript. Em outras linguagens, como Python, a instância de classes é criada diretamente pela chamada ao nome da classe.

let joao:Pessoa;
joao = new Pessoa();

Note que, no exemplo acima, joao foi declarado como uma variável do tipo Pessoa. Na linha abaixo, essa variável passou a receber uma instância da classe Pessoa sendo, portanto, um objeto. Até o momento, não foram atribuídos valores para os atributos nome e sobrenome. Considerando-se a implementação atual, este processo pode ser feito com as seguintes operações:

joao.nome = "João";
joao.sobrenome = "Silva";

A partir deste momento, o objeto joao guarda valores para seus atributos. A essa característica, damos o nome de estado (o conjunto de valores informados para os atributos de um objeto). Naturalmente, é esperado que o estado de um objeto mude durante a execução do programa, salvo algumas exceções.

Até aqui, não há grandes distinções ao uso de uma struct em C. No entanto, como mencionado anteriormente, um dos recursos que distingue as classes, já nos usos iniciais, está na possibilidade de se utilizar funções ou comportamentos. Para obter o nome completo de João, basta executar a seguinte operação:

console.log(joao.nomeCompleto());

A principal distinção observada nesta operação é que a função (ou melhor, o método) nomeCompleto() está diretamente associada à classe Pessoa, ou seja, ela não é uma função externa que requer o objeto como argumento. Pelo contrário, está definida dentro da própria classe, tornando-se parte integrante do objeto.

Esse exemplo permite destacar um conceito fundamental da orientação a objetos: o uso da palavra-chave this. Presente em muitas linguagens orientadas a objetos, this serve como uma referência à instância atual da classe. Isso significa que cada objeto consegue acessar suas próprias variáveis e métodos utilizando this. Ao chamar o método nomeCompleto no objeto joao, por exemplo, os valores de nome e sobrenome utilizados serão aqueles armazenados especificamente naquela instância.

De acordo com Deitel (2017), há um aspecto importante relacionado à eficiência: o Java armazena apenas uma cópia de cada método por classe, compartilhada por todos os objetos daquela classe. No entanto, cada objeto mantém sua própria versão das variáveis de instância. Os métodos, ao serem executados, utilizam implicitamente this para identificar qual instância está sendo manipulada.