Estou prestes a iniciar um projeto de simulação / modelagem. Eu já sei que o OOP é usado para esse tipo de projeto. No entanto, estudar Haskell me fez pensar em usar o paradigma FP para modelar um sistema de componentes. Deixe-me elaborar:
Digamos que eu tenha um componente do tipo A, caracterizado por um conjunto de dados (um parâmetro como temperatura ou pressão, um PDE e algumas condições de contorno, etc.) E um componente do tipo B, caracterizado por um conjunto de dados diferente (diferente ou mesmo parâmetro, PDE diferente e condições de contorno). Suponhamos também que as funções / métodos que serão aplicados em cada componente sejam os mesmos (um método de Galerkin, por exemplo). O estado mutável do objeto seria usado para parâmetros não constantes.
Se eu usasse uma abordagem OOP, criaria dois objetos que encapsulariam os dados de cada tipo, os métodos para resolver o PDE (a herança seria usada aqui para reutilização de código) e a solução para o PDE.
Por outro lado, se eu usasse uma abordagem FP, cada componente seria dividido em partes de dados e nas funções que atuariam sobre os dados para obter a solução para o PDE. Parâmetros não constantes seriam passados como funções de outra coisa (tempo, por exemplo) ou expressos por algum tipo de mutabilidade (emulação de mutabilidade, etc.) Essa abordagem parece mais simples para mim, assumindo que operações lineares em dados seriam triviais.
Para concluir, a implementação da abordagem FP seria realmente mais simples e mais fácil de gerenciar (adicione um tipo diferente de componente ou novo método para resolver o PDE) em comparação com a abordagem OOP?
Eu venho de um background C ++ / Fortran, além de não ser um programador profissional, portanto, corrija-me em qualquer coisa que eu tenha errado.
fonte
IMHO para quase todas as tarefas de complexidade razoável, a pergunta "é um estilo FP ou OOP, a melhor escolha" não pode ser respondida objetivamente. Normalmente, em tal situação, a questão não é "FP ou OOP", mas como combinar as melhores partes dos dois paradigmas para resolver o seu problema.
O problema que você examinou acima parece ser muito matemático, e acho que você precisará de algumas operações de matriz. OOP é muito bom para modelar tipos de dados abstratos, e o cálculo de matriz pode ser facilmente implementado como "objetos de matriz" com operações em matrizes. Implementar isso de uma maneira em que todas as operações da matriz fazem parte de uma classe de matriz ajuda a manter as coisas que pertencem juntas, mantendo assim uma boa estrutura geral.
Por outro lado, os PDEs são equações de funções e a solução pode funcionar novamente. Portanto, usar uma abordagem funcional para esse tipo de "componentes" pode parecer natural aqui. Essas funções podem ter parâmetros de matriz, mostrando um exemplo de como combinar OOP e FP. Outro exemplo seria uma implementação de classe de matriz, que usa ferramentas funcionais para mapear uma determinada operação para cada elemento da sua matriz. Portanto, aqui também não é "OOP versus FP", mas "OOP combinado com FP" que oferece os melhores resultados.
fonte