Diferença entre programação oop e funcional

Programação Orientada a Objetos é programar com objetos. Um objeto é uma entidade com identidade e estado. Ele pode responder às mensagens enviadas, chamando um de seus métodos que corresponde à mensagem recebida.

A idéia é que o estado seja encapsulado no objeto e só possa ser manipulado enviando mensagens ao objeto (também chamado de "métodos de chamada de um objeto"). Dentro de um método, você tem acesso ao estado do objeto - geralmente através de uma ligação de variável especial chamada this ou self. O princípio de ocultar o estado do objeto é chamado Ocultar Informações.

Os objetos geralmente são descritos usando classes, que descrevem os métodos e atributos que esses objetos suportam. Classes podem herdar métodos de super classes. Herança é uma ferramenta para abstração. Pode-se abstrair uma interface comum para uma classe pai. Isso também permite implementar lógica que lida com objetos polimórficos - objetos de tipos diferentes, mas com uma interface pelo menos parcialmente compatível. Um exemplo seria imprimir uma lista de objetos chamando seus métodos .show () - e qualquer objeto específico que implementasse show () diferente.

Pela própria natureza do OOP, a lógica que manipula o estado e os dados que representam o estado estão entrelaçados. Embora o encapsulamento certamente oculte os detalhes da implementação, ele é incapaz de ocultar comportamentos complexos, que ainda são observáveis ​​do lado de fora! Nem sempre é fácil e óbvio por que um objeto se comporta de repente diferente. A herança como ferramenta de abstração é frágil. Até a literatura sobre POO tende a propor o uso de composição em vez de herança na maioria dos casos. Outro problema é que você não pode facilmente trocar a lógica, mas mantendo o estado ou trocando o estado e mantendo a lógica - ambos são colados e tendem a trocar juntos ou não.

As linguagens OOP modernas (Java, C #) cresceram cada vez menos orientadas a objetos. São cada vez mais utilizados de maneira estática e aproveitando os Tipos Genéricos. As classes geralmente se parecem apenas com módulos ou registros. Eles adotaram recursos típicos para programação funcional, como funções de ordem superior.

Programação Funcional é a programação com funções. Particularmente programando com funções como valores. A função é a melhor ferramenta para abstração e composição em programas funcionais. Lógica e estado são mantidos separados. Você escreve funções que obtêm dados e as transformam em outros dados. Isso facilita a compreensão do que uma parte específica do programa faz.

Seja mais1 = n => n + 1mapa (mais1, [1,2,3,4,5])[2,3,4,5,6]

Este exemplo define uma função plus1 que transforma o número incrementando-o em um. O mapa de funções de ordem superior pode aplicar essa função em qualquer elemento de uma matriz, resultando em uma nova matriz com valores incrementados.

Até as linguagens OOP adotaram funções como mapear ou reduzir como métodos de algumas classes padrão (por exemplo, em Array ou Collections).

Em vez de objetos com atributos ou campos, normalmente se usa registros na programação funcional. De muitas maneiras, a diferença não é enorme:

função createUser (nome: string, idade: int) { retornar {nome, idade}}função getOlder (u) { retornar {... u, idade: u.age + 1}}deixar usuário = createUser ("Peter", 18)deixe usuário1 = getOlder (usuário)deixe usuário2 = getOlder (usuário1)deixe usuário3 = getOlder (usuário2)user3.age === 21

vs

usuário da classe { nome: string age: int construtor (nome: string, idade: int) { this.name = name this.age = idade } envelhecer () { this.age = this.age + 1 }}deixar usuário = novo usuário ("Peter", 18)user.getOlder ()user.getOlder ()user.getOlder ()user.age === 21

Uma diferença é que a instância do usuário no OOP é alterada, os campos são substituídos em cada chamada de método. Na variante funcional, sempre haverá um novo registro.

Embora existam linguagens como Haskell que se esforçam com sua pureza para trabalhar apenas com esse estado imutável e também controlar efeitos colaterais através de meios chamados "Mônadas" - a maioria das linguagens de programação funcionais não é pura. Idiomas como Common Lisp ou OCaml combinam programação funcional com recursos imperativos opcionais, estado mutável e até programação orientada a objetos. Com essa linguagem de programação, você não precisa decidir qual paradigma é “melhor”, mas apenas use a que mais facilmente permite descrever a solução para suas tarefas de codificação.