O básico sobre POO

POO o principal paradígma atual

Com certeza você já ouviu falar sobre o paradigma orientado a objetos. Realmente ele é o principal no mundo atual, e sem dúvidas você já ouviu falar dele, mas você realmente conhece sua teoria, sua base e história?

Alan Kay

Foto de Alan Kay

Se eu pudesse apontar alguém como o fundador da programação atual ele seria Kay. Entre seus principais feitos são:

  • Ter concebido o primeiro Laptop
  • Criado da linguagem smaltak, segue abaixo um exemplo de código:
    publish
        Transcript show: 'Hello, world!'
    
  • E o que mais nos interessa, ele é o criador da POO(programação orientada a objetos)

Graduou-se em matemática e biologia molécular nos EUA. Sim ele não era formado em programador, impressionante não? Sua formação o ajudou a formular seus conceitos, ele dizia que cada pedaço de um código devia se comportar como um organismo, uma célula, ou seja funcionar de maneira autônoma, fim de comprir um objetivo. Assim surgiu o primeiro princípio da POO.

Princípios

Como vimos na fala de kay, cada classe deve funcionar de maneira isolada, podendo ou não se comunicar com outras classe. Começando pelo começo: imagine um controle remoto, ele tem seus atributos, como: marca, a tv com a qual está conectado, seu ano de fabricação, etc. Além disso ele também possui seus métodos como: ligar, desligar, mudar de canal, assim por diante.

Porém temos um problema neste modelo, e a tv? A tv deve ser uma classe separada do controle. Assim como ele, ela deve ter sua fabricante, seu sistema, etc. Deste modo, podemos passar como parâmetro do controle o objeto tv, que é uma instâncea da classe.

As principais vantagens da POO

  • Escalabilidade: É fácil escalar seus projeto, e identificar os erros rapidamente, já que neste sistema os códigos ficam desaclopados, ou seja quando algo der errado é fácil identificar qual pedaço do seu projeto quebrou.
  • Legibilidade: com este sistema, e o nível certo de desacoplamento fica fácil ler os códigos, além de que não será necessário reptir inúmeros comandos.

Herança

Herança Imagine a seguinte situação: você está desenvolvendo seu jogo, então você cria uma classe para o seu player, uma classe para o inimigo do tipo 1, uma para o inimigo do tipo 2, etc. Mas pense comigo, há similaridades entre o inimigo 1 e o inimigo 2, então seria possível replicar uma parte do código de um para o outro. Assim surge o conceito de herança, vejemos o seguinte exemplo:

Uma pessoa possui os seguintes atributos:

  • Idade
  • Nome
  • Sobrenome
  • Sexo

Agora pensemos em algo mais específico, um professor. Um professor também tem os mesmos atributos, porém ele possui alguns adicionais como:

  • Escola
  • Matéria
  • Turmas

Podemos dizer que professor herda de pessoa.

Polimorfismo

Polimorfismo

Agora chegamos provavelmente no conceito mais complexo de POO, o polimorfismo. Primeiramente vamos imaginar as seguintes classes:

abstract class Operação{
    abstract public function Calcular(int $a, int $b) : int
}
class Soma extends Operação{
    public function Calcular(int $a, int $b) : int{
        return $a + $b;
    }
}
class Subtração extends Operação{
    public function Calcular(int $a, int $b) : int{
        return $a - $b
    }
}

Retirado da Wikipédia

Ambas as classes possuem a mesma assinatura, ou seja possuem os mesmos atributos e funções que pedem parâmetros de mesmos tipos e um mesmo tipo de retorno. Sendo assim, vamos criar uma quarta classe:

function MostrarSoma(Operação $o, int $a, int $b){
    echo "O resultado é " . $o.Calcular($a,$b);
}

Deste modo a mesma função funciona para ambas as classes. Isso é polimorfismo.

Sei que a ideia do post é ser um guia básico, mas de qualquer forma é uma ótima oportunidade pra esclarecer novamente uma coisa muito importante:

Não existe uma definição única, canônica e universal sobre Orientação a Objetos. A definição dada acima é uma das existentes, mas na realidade o buraco é mais embaixo.

Já respondi sobre isso aqui, e sugiro ler e seguir todos os links do texto para se aprofundar no tema (tem inclusive posts do próprio Alan Kay, que são esclarecedores).

Mas só pra resumir:

Existem várias vertentes (ou "escolas", se preferir) de Orientação a Objetos, e a mencionada no texto é apenas uma delas - provavelmente a mais popular, e talvez por isso muita gente acredita que é a única.

Alan Kay cunhou o termo "Orientação a Objetos", mas a definição dele é diferente da que está no texto. Ele definiu, entre outras coisas, que "tudo é um objeto" (o que excluiria Java como linguagem orientada a objeto, só pra ficar em um exemplo), e que eles se comunicam via troca de mensagens.

Ou seja, nada de herança e polimorfismo. Essas características se aproximam muito mais da definição de Bjarne Stroustrup, que basicamente pegou o mesmo termo e "ressignificou".

Isso não quer dizer que o post está errado. Mas é importante mencionar que orientação a objetos é bem mais complexo que isso, e mesmo a sua definição exata é controversa.

Cara, fico olhando o conhecimento de vcs ([@kht](https://www.tabnews.com.br/kht) e [@maniero](https://www.tabnews.com.br/maniero)) e fico pensando, cara, quando vou chegar neste nivel... kkkkk vcs são muito TOP, e muito obrigado pela a dedicação de vcs, a cada comentario ou post, são sempre ricos de muita experiencia e conhecimento.
Inclusive ele diz que Lisp é mais orientada a objeto que Smalltalk. Porque a estrutura de Smalltalk não é composta de objetos, apenas os dados. É muito mais complexo do que as pessoas aprendem e principalmente porque misturam escolas.

Foi bom isso voltar à tona.

O Alan Kay não foi o cridor da orientação a objeto. Ele criou o termo e depois reconheceu que ele inventou a orientação a mensagens. Mas erro é o que ficou divulgado até hoje para todo mundo aprender errado.

E essa ideia toda era fantástica... para a biologia. Não para a maioria das coisas que fazemos. Por isso devemos usar com alguma restrição e de forma mais pragmática, por isso a orientação a objeto do Bjarne Stroustrup é mais popular.

Há controvérsas sobre as alegações empregadas ali em cima.

Observou? Faz sentido para você?

Espero ter ajudado. Em geral estou à disposição na plataforma (sem abusos :D)


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

Alguns exemplos de conceitos usando Python https://github.com/mfandre/o_o

Muito obrigado por compartilhar seu conhecimento.