DEV Community

Uriel dos Santos Souza
Uriel dos Santos Souza

Posted on

O que faz de uma linguagem Orientada a Objetos? Por Peter Wegner

Isso era um assunto controverso nos anos 80.

Em 87, Peter Wegner, publicou um artigo na OOPSLA que resolveu a questão (pelo menos entre aqueles que concordam com o Wegner)
Para uma linguagem ser Orientada a Objetos ela precisa segundo Wegner

ser baseada em objetos, ou seja, deve ser fácil programar objetos que encapsulam dados e operações;

ser baseadas em classes, ou seja, cada objeto pertence a (ou é fabricado a partir de) uma classe; e +
permitir herança, ou seja, deve ser fácil agrupar classes em hierarquias de subclasses e superclasses.

Outros estudiosos (chatos?) acrescentam outros itens à lista: (eu não concordo - Wegner)
enlace dinâmico, tardio (late binding)

A linguagem Self é uma grande exceção entre as linguagens claramente orientada a objetos: ela não possui classes.

JS e Lua tem coletores de lixo e não são baseadas em classes.

Para Wegner essas não são linguagem OOP.

Fontes:
https://dl.acm.org/doi/abs/10.1145/38765.38823

Top comments (3)

Collapse
 
eduardoklosowski profile image
Eduardo Klosowski

Rust também entra na discussão. Ela possui structs e permite criar funções associadas a elas. Então, apesar de não ter o nome classe, e separar atributos (variáveis) de comportamento (métodos/funções), ela possui algo bem parecido ao conceito de classe, podendo ser considerado orientado a objetos por isso. Porém, não tem herança, então por essa definição não seria orientada a objetos. Apesar de eu já ter visto ideias que deveria-se usar mais interfaces e menos heranças, e como Rust tem traits, que podem ser considerada uma interface com mais recursos, e inclusive que lembram bastante herança, como todo Eq também é um PartialEq, volta a discussão.

Collapse
 
urielsouza29 profile image
Uriel dos Santos Souza • Edited

Apesar de eu já ter visto ideias que deveriam-se usar mais interfaces e menos heranças,

não seria composição?

Rust não é mais voltado a paradigma funcional?

Collapse
 
eduardoklosowski profile image
Eduardo Klosowski

Também é possível usar algo parecido com composição, por exemplo:

fn exemplo<T: Ord + Eq>(item: &T) { ... }
Enter fullscreen mode Exit fullscreen mode

Nesse caso o parâmetro tem que implementar as traits Ord e Eq (ter funções para verificar maior/menor e igualdade), porém Ord requer que ele também seja PartialOrd e Eq requer que ele também seja PartialEq. Então, sim, da para misturar tudo.

Porém Rust não é voltado para programação funcional, é imperativo mesmo, mas traz algumas coisas comuns de programação funcional, ou seja, tenta aproveitar o que pode ser adaptado e faz sentido com a linguagem.