Skip to content

Instantly share code, notes, and snippets.

@thiagovsk
Forked from robotlolita/oop.md
Last active August 29, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thiagovsk/676b251f30d9d0afb64b to your computer and use it in GitHub Desktop.
Save thiagovsk/676b251f30d9d0afb64b to your computer and use it in GitHub Desktop.

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({ ... }, { ... })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment