Skip to content

Instantly share code, notes, and snippets.

@robotlolita
Last active May 24, 2023 21:23
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save robotlolita/11252065 to your computer and use it in GitHub Desktop.
Save robotlolita/11252065 to your computer and use it in GitHub Desktop.
O que é OOP? Por que Java não deve ser considerado uma linguagem com um bom suporte para esse paradigma?

Objeto é a noção de uma entidade que é definida inteiramente pelo seu comportamento. E esse comportamento é dinâmicamente selecionado. Em outras palavras, eu "peço" um objeto para "andar," e como ele vai fazer isso é inteiramente definido pelo objeto.

O exemplo:

objeto.anda()

Captura bem essa idéia. Eu tenho uma mensagem "anda," mas eu não consigo dizer o que essa função faz direto do meu código, porque isso depende no comportamento dinâmico da execução do programa (em uma linguagem estáticamente tipada você consegue optimizar isso, mas o raciocínio do código continua o mesmo).

Como os objetos são definidos inteiramente por aquilo que eles fazem, não faz muito sentido (do ponto de vista de OO) "marcar" o objeto com um nome único (tipagem nominal). Dessa forma, tipagem estrutural deveria ser o default para explorar essa idéia de "programação em cima de interfaces," com a possibilidade de optar por essa "marcação especial."

Por que Java não suporta bem OO? Porque quando você escreve:

if (a > b) { ... }

Você para de trabalhar com essa idéia de que o seu programa é o resultado da interação de objetos, e começa a trabalhar com a idéia de programação procedural ou funcional (dependendo de outras propriedades).

O correto, nesse caso, seria que o objeto True e o objeto False fossem as únicas coisas que determinassem seu if/else. Que > fosse só um método de qualquer objeto (não só números). E assim por diante. De outra forma, você está programando com uma forma muito limitada da idéia, e não pode aproveitar os benefícios desse modelo computacional (principalmente a parte de programar para interfaces).

Em outras palavras:

(a.>(b)).thenElse({ ... }, { ... })
@ricardomlourenco
Copy link

Não entendi a parte do if ( a > b) poderia dar maiores detalhes?
Outra coisa, poderia recomendar um livro bom para aprofundamento nesses conceitos que vc explicou?

@IsTheJack
Copy link

Quais boas linguagens, que você recomenda, usam esse conceito correto de orientação a objetos que você citou?

@robotlolita
Copy link
Author

@RobertoOll Smalltalk, Self, e outras linguagens descendentes de Smalltalk são as que melhor incorporam esse conceito.

Em termos de linguagens que possuem um suporte razoável: Ruby e Scala.

@marcoonroad
Copy link

Legal Quildreen, massa isso aê, pena que eu tô tentando implementar flow structures como subrotinas mesmo, kkk, mas bom trabalho aê.

@thiagovsk
Copy link

++ Em termos de linguagens que possuem um suporte razoável: Ruby e Scala.

@16boot
Copy link

16boot commented Jul 10, 2015

:v

@648trindade
Copy link

O loco bicho

@Marlysson
Copy link

Em python esse método de comparação é feito internamente pro meio do datamodel e usando um método pra isso..

Por exemplo:

a.__gt__(b)

Isso seria considerado bem OO , ou não ?

@lucasbretana
Copy link

O uso de a > b é apenas um syntax sugar pro compareTo que qualquer classe numérico, i.e., que extensa Numeric, vai ter. Nada te impede de fazer algo mais "claro". Isso não é o mais chama atenção pra dizer que Java não é puramente OO.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment