¿Alternativas a la programación orientada a objetos?

81

OOP es probablemente el paradigma de programación más utilizado en el diseño de software actual. Mi pregunta es: ¿qué otros paradigmas pueden competir con él y reemplazar a la POO ? Para aclarar esa pregunta, no estoy preguntando qué otros paradigmas existen. Hay muchos, pero me gustaría saber cuál ...

  • Se ha utilizado en la práctica, no solo en teoría.
  • Puede competir con OOP , por lo que se puede utilizar en un gran proyecto con un mínimo de dolor.
  • Se puede utilizar para desarrollar una aplicación de escritorio con lógica empresarial, bases de datos, etc.
  • No se usa junto con OOP, sino como reemplazo de OOP.

Y si hay alguno, cuáles son sus pros / contras, por qué es mejor / peor que OOP, qué lenguajes son los mejores para usarlo, qué hay de usarlo en lenguajes populares, tiene algún patrón de diseño y puede reemplazar totalmente OOP?

Dariusz Woźniak
fuente
1
@Justin Ardini: Sé que hay muchos, pero ¿cuál puede competir con oop? @Tobiasopdenbrouw & Macros: Ok, cambiado.
Dariusz Woźniak
OOP es popular porque es popular, si no te tragas el koolaid de OOP, no tendrás ningún proyecto en el que trabajar ...
aoeu256
La programación orientada a datos es más fácil, donde se preocupa por las colecciones de objetos y sus relaciones en lugar de objetos individuales, donde los métodos de "objeto db" proporcionan encapsulación. JSON y sexpressions endulzan SQL, CSS, HTML, Excel, los scripts de shell son populares y útiles, pero "programación" significa OOP o procedimental. Se agradece a OOP por el mantenimiento de los programas Python / JavaScript a pesar de que OOP es el 20% del código. Closures & JSON se pueden usar el 90% del tiempo en lugar de Objects y son más simples y fáciles de usar.
aoeu256

Respuestas:

50

La programación funcional es otro paradigma de programación que es popular, principalmente entre los académicos. El mejor ejemplo de un lenguaje de programación funcional es Haskell y Standard ML .

La diferencia fundamental entre la programación funcional y la programación orientada a objetos es que está programando en el sentido de flujo de datos en lugar de flujo de control . Vea la presentación Efectos de domesticación con programación funcional de Simon Peyton-Jones para una buena introducción.

Un buen ejemplo de programación funcional utilizada en la industria es Erlang . Se utiliza principalmente en telecomunicaciones, sistemas distribuidos y tolerantes a fallas. Vea la presentación Erlang - Software para un mundo concurrente de Joe Armstrong .

También hay lenguajes de programación funcional más nuevos que combinan la programación funcional con OOP. Dos buenos ejemplos son F # para la plataforma .NET y Scala para la plataforma Java; a menudo pueden usar bibliotecas existentes en la plataforma escritas en otros idiomas.

La tendencia de los nuevos lenguajes de programación ahora es Multi-paradigma , donde múltiples paradigmas como la programación orientada a objetos y la programación funcional se combinan en el mismo lenguaje.

Jonas
fuente
4
Scala tiene como objetivo integrar características de lenguajes funcionales y orientados a objetos.
Philipp
5
Buena respuesta, pero creo que la programación funcional y la programación orientada a objetos no son las dos caras de una medalla, pueden coexistir perfectamente (como mencionaste). Es más así: procedimental VS orientado a objetos, imperativo VS funcional. Lisp es un lenguaje funcional procedimental popular, Java es un lenguaje imperativo orientado a objetos.
fhd
1
@ ventr1s: Sí, la programación funcional puede reemplazar la programación orientada a objetos, pero es más probable que se use junto con la programación orientada a objetos en lenguajes como Scala y F #.
Jonas
1
@ ventr1s: Un buen ejemplo de programación funcional en la industria es la base de datos distribuida NoSQL RIAK escrita en Erlang. riak.basho.com
Jonas
2
@ ventr1s: Vea esta pregunta sobre programación funcional y patrones de diseño: stackoverflow.com/questions/327955/…
Jonas
11

El procesamiento procedimental lo era todo antes de que apareciera la POO, ha producido algunas grandes aplicaciones del mundo real (de hecho, la mayoría de ellas originalmente) y muchos sistemas operativos.

Sin duda, se puede utilizar en productos a gran escala con un mínimo de dolor y un máximo de rendimiento.

Leñoso
fuente
4
Sí, e innumerables estudios de métricas han demostrado que se queda sin gasolina en alrededor de 150K LOC. Mire el SDK de Windows en la época de Petzold para ver un tratado sobre cómo la programación estructurada se desintegra bajo cargas de complejidad: funciones con 8 argumentos, 2 son estructuras con 6-10 miembros. Insertar y extraer datos de cada unidad de cálculo con el tiempo simplemente no funciona.
Rob
1
Bien, pero, ¿cuántas aplicaciones se vuelven tan grandes? El problema con la programación orientada a objetos es que es extremadamente complicado de entender y está diseñado para aplicaciones amplias, pero es el predeterminado incluso para las pequeñas. Esto tiene el efecto opuesto de complicar demasiado la aplicación más pequeña innecesariamente.
niico
La programación orientada a objetos a veces hace que las aplicaciones sean más largas debido a la necesidad de constructores y métodos de obtención / establecimiento largos. Estos primeros lenguajes de procedimiento como C no tenían soporte para metaprogramación, ningún sistema de polimorfismo, cierres o sintaxis fácil para JSON / representación de datos generales. C ni siquiera admitía argumentos opcionales. Las mónadas y macros se pueden utilizar para crear potentes lenguajes específicos de dominio integrados.
aoeu256
Funciones con 8 argumentos: ¿has oído hablar de los argumentos predeterminados? ¿Qué pasa con el soporte procedural + de primera clase para HashTables + cierres como JavaScript, Python, etc.? Tienen muchas de las ventajas de la programación orientada a objetos sin tanto código.
aoeu256
4

El modelado de datos relacionales vectoriales se utiliza para crear modelos de información ejecutables con semántica relevante para el dominio dentro de la Arquitectura de red de información global, un intermediario de modelos residente en la red.

Disruptivo tional
fuente
3

En primer lugar, tenga en cuenta que muchos de los lenguajes de programación que se utilizan actualmente (especialmente los "lenguajes de nivel superior") son de paradigma múltiple . Eso significa que nunca está creando programas que sean puramente OOP (excepto si usa Smalltalk o Eiffel para construir sus grandes proyectos, tal vez).

Eche un vistazo a PHP, por ejemplo:

  • Tiene muchos elementos de programación orientada a objetos (desde la versión 5)
  • Antes era mayoritariamente procedimental
  • Tiene elementos de programación declarativa (por ejemplo, las funciones de matriz)
  • Implementó muchos elementos de programación funcional (desde la versión 5.4)

Básicamente, PHP está uniendo muchos paradigmas diferentes (y es un "lenguaje adhesivo" en sí mismo).

También Java implementa muchos conceptos que no son del paradigma Orientado a Objetos (por ejemplo, de programación funcional).

Eche un vistazo a la lista de lenguajes de programación por tipo en Wikipedia: https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages (no es 100% exacto).

Programación funcional (subconjunto de programación declerativa)

  • Wideley utilizado en la práctica (pasó a formar parte de lenguajes pegados como PHP , también Java y muchos otros han implementado conceptos de programación funcional)
  • Muchas ideas se originan en LISP que definitivamente vale la pena echarle un vistazo.
  • Puede crear aplicaciones completas, por ejemplo, con Haskell, por lo que puede "reemplazar" OOP

Programación procedimental

  • C (como lenguaje mayoritariamente procedimental) sigue siendo uno de los lenguajes más utilizados
  • Muchos lenguajes de pegamento modernos eran procedimentales al principio
  • Aún así, muchos programas son principalmente de procedimiento (por lo que si lo desea, puede "reemplazar" OOP)

Programación lógica

  • El ejemplo más destacado es Prolog. Se utiliza para tareas específicas que se benefician de consultas lógicas basadas en reglas.
  • No puede "reemplazar" la programación orientada a objetos en términos de construcción de un gran proyecto, pero puede reemplazarlo en otros términos

Lenguajes declarativos / específicos de dominio en general

  • ¿Utiliza SQL en sus proyectos? Entonces no son puramente POO, SQL es esencialmente declarativo.
  • Muchos lenguajes específicos de dominio (como CSS) son declarativos

Programación imperativa en general

Esta lista no está completa, solo dará una idea. Solo tenga en cuenta que, por lo general, está utilizando muchos paradigmas diferentes al escribir una gran aplicación e incluso cada lenguaje que está utilizando está implementando múltiples paradigmas.

La programación orientada a objetos generalmente se considera una buena opción para estructurar relaciones grandes y complejas al modelar datos. No siempre es el paradigma a seguir para muchas otras tareas.

Blackbam
fuente
1

FP - Programación funcional es un paradigma de programación extremadamente popular que ha existido durante mucho tiempo y, en años más recientes, ha comenzado a ser cada vez más prominente. FP favorece la inmutabilidad sobre la mutabilidad, recursividad y funciones sin efectos secundarios. Algunos ejemplos de lenguajes fp populares son Erlang, Scala, F #, Haskell y Lisp (entre otros).

Matthew J. Morrison
fuente
-5

Actualmente, no existen paradigmas que realmente puedan reemplazar la POO. El problema con (beneficio de) OOP es que hace una gran cantidad de trabajo por usted: libera recursos automáticamente, valida datos, etc., y facilita la validación del código, sin mencionar que la gran mayoría de las bibliotecas existentes en el mundo están escritos en un lenguaje de programación orientada a objetos como C ++, C # o Java. La realidad de arreglárselas sin bibliotecas a gran escala y tal es sumamente dudosa.

En mundos especializados o académicos, encontrará una gran cantidad de Programación funcional. Sin embargo, si realmente desea hacer un proyecto grande, la programación orientada a objetos es el único camino a seguir.

Creo que la programación genérica va a surgir como un nuevo paradigma. Sin embargo, todavía está en la fase de desarrollo y solo C ++ / D ofrece una programación genérica realmente buena.

Perrito
fuente
3
OOP no hace ninguna de esas cosas. Puede hacerlos más fáciles, pero solo si el diseño del marco OO los incluye, como en .Net, o si está dispuesto a escribirlos.
Matt Ellen
Técnicamente, tienes razón. Sin embargo, la realidad es que todos los lenguajes OO populares incluyen la gestión de recursos como una característica de la orientación a objetos. Sería difícil encontrar un lenguaje de soporte directo de objetos que no lo incluya. Y el OP está claramente interesado en la práctica, no en la teoría.
Puppy
3
La gestión de recursos no es una característica de la orientación a objetos; la administración de recursos es una característica de los lenguajes de programación imperativos, que pueden estar orientados a objetos o no. No conozco ningún lenguaje puramente funcional que le obligue a gestionar los recursos del sistema de forma explícita.
Matthew J Morrison