Escolha uma Página

Se você é um daqueles que se sente perdido quando se trata em compreender ou colocar em prática as principais nuances das técnicas a respeito da programação orientada a objetos, este artigo é dedicado a esclarecer suas dúvidas e enfatizar os conceitos por trás desta face da programação e suas linguagens!

O que é programação orientada a objetos?

A programação orientada a objetos é um modelo de programação onde diversas classes possuem características que definem um objeto na vida real. Cada classe determina o comportamento do objeto, definido por métodos e seus estados possíveis definidos por atributos. São exemplos de linguagens de programação orientadas a objetos: C++, Java, C#, Object Pascal, entre outras.

Este modelo foi criado com o intuito de aproximar o mundo real do mundo virtual. Para dar suporte a definição de Objeto, foi criada uma estrutura chamada Classe, que reúne objetos com características em comum, descreve todos os serviços disponíveis por seus objetos e quais informações podem ser armazenadas. 

Vamos começar dando um exemplo com uma classe carro utilizando a linguagem C#, como mostra na listagem a seguir.





A classe ‘’Carro’’ contém um conjunto de características em comum que definem um objeto do tipo carro: marca, modelo, ano, categoria, potência e autonomia são atributos que todos os carros precisam ter. Temos também dois construtores para a classe, ou seja, os responsáveis por criar o objeto em memória, onde um é inicializa o objeto carro e o outro, além da inicialização do objeto, define que o preenchimento dos parâmetros seja obrigatório nos atributos da classe.

Agora vamos criar um objeto para que o mesmo possa ser utilizado, como mostra na listagem abaixo. (Invocando o construtor e criando um objeto):





Instanciamos nossa classe Carro e atribuímos a uma variável meuCarro todos os atributos da nossa classe. Poderíamos também invocar o construtor que já recebe os parâmetros com os respectivos atributos da classe, como mostra a listagem com a exemplificação. (Invocando o construtor com os parâmetros e criando objetos):





Na próxima listagem exemplifica a criação de alguns métodos, que são comportamentos que a classe Carro possui. (Métodos da classe carro):





No método Liga atribuímos ao atributo ligado o valor verdadeiro e escrevemos no console de saída uma informação que o carro estava ligado.

No método Anda temos uma condição onde se o carro estiver ligado e a autonomia do carro for maior que zero, o carro ainda pode andar. Caso contrário, se a autonomia for menor ou igual a zero ou então o carro estiver desligado, o mesmo fica impossibilitado de andar.

E por último temos o método Desliga, que atribui o valor falso ao atributo ligado e escrevemos no console de saída a mensagem que o carro foi desligado.

Observe que para utilizar esses métodos presentes na classe Carro precisamos utilizar dois conceitos  cruciais: Construtores e Destruidores. Construtores são métodos invocados no momento em que o objeto é criado: por convenção é utilizado o mesmo nome da classe como, por exemplo, para a classe Carro temos o construtor Carro(). Já os Destruidores realizam a função inversa aos Construtores, onde são liberados da memória todos os objetos que foram criados no momento da execução do programa, na maioria das linguagens de programação esse método é executado automaticamente quando o objeto é eliminado e , por convenção, é utilizado também o mesmo nome da classe, porém com um  ~ antecedendo o nome como por exemplo, para classe Carro temos o destrutor ~Carro().

Entretanto, agora sabendo um pouco sobre orientação a objetos, vamos conhecer seus princípios básicos.

Abstração: este princípio é uma forma de abstrair o quão complexo é um método ou rotina de um sistema ou seja, o usuário não necessita saber todos os detalhes de como sua implementação foi realizada, apenas para que serve determinada rotina e qual o resultado esperado da mesma. Sendo assim podemos também dividir internamente problemas complexos em problemas menores, onde resolvemos cada um deles até encontrarmos a solução do problema inteiro. 

Um exemplo da vida real para ilustrar esse conceito seria o conceito de carro a abstração de um veículo, que é utilizado como meio de transporte por várias pessoas para mover-se de um ponto a outro. Não é necessário que a pessoa informe que irá se locomover com a ajuda de um veículo movido a combustível, contendo rodas e motor. Basta a pessoa informar que utilizará um carro para tal, pois esse objeto é conhecido por todos e abstrai toda essa informação por trás disso.

Veja na listagem imagética a seguir um exemplo de abstração utilizando a linguagem Java. (Exemplo de Abstração):





Para este caso, um cliente só precisa entender que uma conta é um local, em um determinado banco, onde é possível ser depositado e sacado valores.

Exemplificando este caso criamos uma classe ‘’Conta’’ com os atributos: código do banco, número da conta, saldo e limite. Criamos também um método ConsultarSaldo onde ele retorna qual o saldo da conta naquele momento. Criamos também outro método chamado Depositar onde passamos um valor como parâmetro e ele soma isso ao saldo atual da conta. Outro método chamado Sacar foi criado com um valor passado por parâmetro, onde o mesmo subtrai esse valor do saldo atual da conta.

Encapsulamento: o princípio do encapsulamento é a forma pela qual o programa é dividido a ponto de se tornar o mais isolado possível, ou seja, cada método pode ser executado isoladamente e retornar um resultado satisfatório ou não para cada situação. Sendo assim, o objeto não necessita conhecer de qual forma cada método foi implementado. Observe na listagem abaixo um exemplo prático de encapsulamento, onde é possível obter e atribuir valores a propriedades da classe ‘’Pessoa’’ de forma independente, sem alterar o funcionamento do restante da classe. (Exemplo de Encapsulamento):





Herança: esse princípio diz que, uma classe pode compartilhar métodos e atributos entre si em sistema escolar, onde temos uma classe ‘’Pessoa’’ que contém características que definem uma pessoa. Porém, dentro do sistema temos outra classe chamada ‘’Funcionario’’ que contém os mesmos atributos de Pessoa, além de outros atributos que os Funcionários podem ter. Outro exemplo seria uma classe ‘’Aluno’’, que também contém atributos de pessoa e outros atributos que conferem somente ao aluno. 

Veja na listagem a seguir como podemos implementar esse princípio utilizando a linguagem de programação Java. (Implementação do princípio Herança):








Note que temos uma classe de Pessoa que contém propriedades em comum com as classes: Aluno, Professor e Funcionário. Essas outras classes que herdam de Pessoa recebem a palavra reservada ‘’extends’’, que indica que as mesmas contêm as propriedades: nomes, cpf e data, presentes na classe Pessoa.

Polimorfismo: é uma característica na qual os mesmos atributos ou métodos podem ser utilizados por objetos distintos e com implementações de lógicas diferentes. Por exemplo, podemos dizer que um carro e uma bicicleta são veículos utilizados para locomoção e ambos contêm um método ‘’Andar’’ em comum, porém, a implementação de cada um deles é feita de forma diferente. Vamos exemplificar a implementação de uma classe Forma, onde a mesma contém um método Desenhar como mostrado na listagem. (Classe Forma):





Note que a classe Forma é uma classe abstrata e que o método Desenhar não tem implementação, pois cada figura tem uma forma diferente de ser desenhada. Porém, é nas classes derivadas da classe Forma que esse método será implementado e, por isso, essa nova classe será uma classe virtual como mostra na listagem abaixo. (Classe Circulo):





Veja agora que a classe Circulo herda da classe Forma, portanto o método Desenhar deve ser implementado. Partindo desse princípio podemos ter diversas classes diferentes que herdam da classe Forma e implementem de outra maneira o método Desenhar como visto na listagem a seguir. (Classe Quadrado):





Logo, classes abstratas são classes que jamais serão instanciadas diretamente, pois não possuem implementação suficiente para oferecer funcionalidades concretas a serem utilizadas.

Programação Estruturada: O princípio básico da programação estruturada é que um programa pode ser dividido em três partes que se interligam: sequência, seleção e iteração.

Sequência: São implementados os passos de processamento necessários para descrever determinada funcionalidade um exemplo básico seria um fluxograma, onde o primeiro é executado a Etapa 1 e após a sua conclusão a Etapa 2 é executada, e assim por diante. 

Seleção: O fluxo a ser percorrido depende de uma escolha. Existem duas formas básicas para essa escolha. 

  • A primeira é através do condicional ‘’Se’’, onde se uma determinada condição for satisfatória o fluxo a ser corrido é um e caso contrário, o fluxo passa a ser outro. Ou seja, se o fluxo só percorre apenas um caminho, apenas uma ação é processada. 
  • A outra forma de escolha é onde o número de condições se estende a serem avaliadas. Por exemplo, se a Condição 1 for verdade faça Processamento 1, caso contrário, se a Condição 2 for verdade faça Processamento 2, caso contrário, se a Condição 3 for verdade faça Processamento 3, e assim por diante.

Iteração: É permitido a execução de instruções de forma repetida, onde ao fim de cada execução a condição é reavaliada e enquanto seja verdadeira a execução de parte do programa continua. 

Modularização: à medida que o sistema vai tomando proporções maiores, é mais viável que o mesmo comece a ser dividido em partes menores, onde é possível simplificar uma parte do código deixando a compreensão mais clara e simplificada. Essa técnica ficou conhecida como Subprogramação e Modularização. No desenvolvimento utilizamos essa técnica através de procedimentos, funções, métodos, rotinas e uma série de outras estruturas. Com essa divisão do programa em partes podemos extrair algumas vantagens, como: 

  • Cada divisão possui um código mais simplificado; 
  • Facilita o entendimento, pois as divisões passam a ser independentes; 
  • Códigos menores são mais fáceis de serem modificados; 
  • Desenvolvimento do sistema através de uma equipe de programadores; 
  • Reutilização de trechos de códigos. 

Hoje as linguagens estruturadas, como Algol, Pascal, e C ainda são encontradas em muitos sistemas, apesar das linguagens orientadas a objetos serem mais usuais. Por isso, para exemplificar esse tipo de programação veremos um exemplo na linguagem C na listagem abaixo. (Exemplo de Programação Estruturada):





Entretanto, como vimos no decorrer do artigo, a programação orientada a objetos define uma programação voltada aos conceitos de classe e herança e, em contrapartida, a programação estruturada voltada a procedimentos e funções definidas pelo usuário. Observe na primeira tabela um breve comparativo entre programação orientada a objetos e programação estruturada.





Na programação estruturada percebemos algumas vantagens como um controle mais eficaz quanto ao fluxo de execução do programa e a facilidade de compreender o código quando o mesmo é analisado. Como principal desvantagem temos a facilidade em desenvolver um código confuso caso o desenvolvedor faça o tratamento dos dados juntamente com o restante da execução do programa, além do que o reuso de código se torna um ponto complicado devido a não definição da tarefa.

Enquanto na programação orientada a objeto temos como vantagem a reutilização de código e a melhor organização do código do programa. Porém alguns detalhes tornam essa programação um pouco prejudicada quando comparada a programação estruturada, por exemplo, o desempenho do código e a confusão na hora de aplicar os conceitos de orientação a objetos.

Portanto, não podemos assumir que um tipo de programação é mais vantajoso que o outro pois, em ambos existem características bem peculiares nas suas definições, deixando cada uma mais viável de ser implementada, dependendo do negócio escolhido, para facilitar o entendimento e a manutenção futura do código feito.

Referências:

https://www.devmedia.com.br/