Casos de comutação de longa execução ou construções if-else-if são evitados no OOP usando polimorfismo sempre que aplicável.
em vez de ramificar pela correspondência de um valor, a ramificação é feita no próprio nível de classe.
Como uma abordagem semelhante pode ser aplicada no paradigma de Programação Funcional, especificamente no Clojure?
functional-programming
clojure
Amogh Talpallikar
fonte
fonte
Respostas:
Eles não os evitam, eles os abraçam usando a sintaxe de correspondência de padrões.
Porém, a programação funcional é amplamente ortogonal à programação orientada a objetos; portanto, a maioria absoluta das linguagens "funcionais" também é orientada a objetos¹, incluindo clojure. De fato, os multi-métodos do clojure são ainda melhores que os métodos virtuais simples de Java, porque eles podem despachar dinamicamente tipos de múltiplos argumentos, não apenas o primeiro.
Existe uma linguagem puramente funcional que não possui polimorfismo dinâmico, Haskell. No Haskell, você pode definir vários métodos por meio de classes de tipos, mas os tipos são resolvidos em tempo de compilação. Para ter tipos variados em tempo de execução, é necessário criar um tipo de união e você deve escrever a função com correspondência de padrão (que é como a cadeia if, mas com sintaxe mais conveniente) ou pedir ao compilador para derivar o método compondo o método métodos dos tipos constituintes. Ou use a
forall
extensão GHC .Por orientação a objeto, quero dizer que a linguagem possui alguma forma de polimorfismo dinâmico com despacho baseado no tipo de tempo de execução real. Muitas novas linguagens possuem apenas polimorfismos "baseados em características", onde apenas as interfaces podem ser herdadas; Eu considero que, como orientado a objetos, e para o propósito desta resposta, é suficiente.
fonte
forall
extensão ghc , ela é completamente em tempo de compilação.Esta é uma pergunta muito antiga, mas sinto que as respostas estavam faltando.
Como você mencionou, na ramificação OO é freqüentemente movida para o nível de classe. Vamos pensar no que isso significa:
É exatamente assim que você lidaria com isso: uma função de ordem superior. Sua função de ordem superior lida com ramificação, retornando funções simplificadas para consumo.
No contexto da sua pergunta, o polimorfismo é uma abstração para isso - com segurança adicional do tipo.
fonte
Na linguagem de programação funcional, podemos usar funções e parâmetros principais para se livrar de ramificações condicionais. Isso significa usar funções com a condição param em vez de "if esle". Veja o exemplo 3. Como computeSphereArea ({radius: 25.55})
Exemplo 1: OOP // no OOP (use java por exemplo (sourceCode from: http: //developer.51cto.com/art/200907/136506.htm)):
Exemplo 2: funcional como oop. // na programação funcional (use javascript, por exemplo):
// Embora este não seja um exemplo de programa funcional puro, mas com uma interface funcional, como initCircle () initSphere (). Você pode criar mais funções como computeCircleArea () computeSphereArea () para torná-lo mais funcional. // PS: typeOf () está aqui: https://github.com/will-v-king/javascript-showMe
Exemplo3: Ok, vamos torná-lo mais funcional:
fonte