Mientras leo algunos libros de texto de algoritmos, están llenos de procedimientos inteligentes para algunos problemas (clasificación, ruta más corta) o algunos métodos generales (algoritmos recursivos, división y conquista, programación dinámica ...). Encontré pocos rastros de programación orientada a objetos allí; (¿Por qué están más orientados a los procedimientos?).
Entonces estaba pensando:
- ¿Cuál es la relación entre algoritmos y OOP? ¿Son dos temas independientes?
- ¿Hay algunos problemas que solo pueden ser presentados y resueltos por OOP?
- ¿Cómo puede ayudar OOP a los algoritmos? ¿O en qué dirección puede afectarlo?
object-oriented
algorithms
Ahmad
fuente
fuente
Respuestas:
Primero, definamos qué entendemos por OOP. Por OOP me refiero principalmente a:
Ahora para responder a tu pregunta:
Si.
No. OOP primario ofrece conveniencia y capacidad de razonar sobre el código para el programador. No aumenta tu poder expresivo.
Como dije anteriormente. Ambos puntos describí OOP como se aplican aquí. Poder ocultar detalles de algoritmos y sus estructuras de datos puede ayudar a razonar sobre todo el asunto. Muchos algoritmos contienen detalles con los que no desea que el usuario de ese algoritmo juegue. Ocultar esos detalles ayuda mucho.
La capacidad de tener un comportamiento polimórfico también es genial.
List
se define como poder agregar / eliminar / borrar los elementos en cualquier lugar de la colección. Pero puede implementarse como una matriz redimensionable, doble o simple, etc. Tener una única API para múltiples implementaciones puede ayudar a reutilizar.Como dije, OOP no es necesario para implementar un algoritmo. Además, muchos algoritmos son antiguos y se crearon cuando OOP aún no estaba muy extendido. Por lo tanto, también podría ser algo histórico.
fuente
Los algoritmos y OOP son dos términos dispares, que solo tienen en común, que son términos CS . Simplemente: un algoritmo es como una receta de cocina : para hacer x necesitas los siguientes ingredientes y hacer el paso 1, 2, 3, 4, 5, 6 ... entonces tienes tu comida preparada.
Dicho esto, parece natural que los algoritmos se describan de manera procesal . Procedimiento significa nada más que: primero haz xy luego haz y .
Un problema común es: »¿Cómo ordenar un conjunto de x ?«. Una solución fácil de entender es
bubble-sort
:Esa es la descripción algorítmica / verbal del
bubblesort
algoritmo.Aquí viene una implementación de procedimiento / pseudocódigo
Eso fue fácil.
¿Cómo se relaciona eso con OOP ? Podría usar este algoritmo para tratar colecciones (un objeto en sí mismo) de objetos :
Ejemplo en Javascript (aunque no tiene una OO-Lingo limpia , pero es casi inexistente y fácil de entender)
Tenemos a) una colección
objects
, b) un método común a esta colecciónsort
que contiene / extrae el algoritmo de clasificación yc) nuestros objetos Peter , Paul y Mary . La especificación para la clasificación se encuentra aquí .Por lo que se dijo, debería quedar claro, la respuesta debería ser: sí, son independientes.
OOP es solo un estilo de programación. No puede ayudar de ninguna manera. De lo contrario, se podría implementar un algoritmo en un lenguaje OO para hacer algo a los objetos (como se muestra)
No puedo pensar en uno (pero eso no significa que sea imposible). Pero si lo mira al revés: OOP es útil, si desea modelar algunos problemas y resolverlos con un algoritmo apropiado. Digamos que tiene un registro de
friends
que podría modelar comoobjects
conproperties
y si quieres unalist
de lasfriends
ordenados de ninguna manera, se puede usar el ejemplo de código dado anteriormente para hacer exactamente eso.Como se dijo: es más natural , ya que el procedimiento es el carácter de los algoritmos.
fuente
tienes un problema.
El modelo de dominio comercial describe su problema, y los conceptos del dominio del problema con el que va a estar lidiando.
Los algoritmos describen la forma en que va a resolver sus problemas, conceptualmente; ¿Cómo será su implementación? y cómo manejas tu problema después de traducirlo a términos de "Ciencias de la Computación".
El paradigma de programación, ya sea OOP, funcional, lógico, de procedimiento o incluso no estructurado, describe cómo estructurará su solución, qué forma adoptará, qué conceptos de "Ingeniería de software" va a emplear y cuáles " Teoría del lenguaje de programación "conceptos que va a emplear.
Para decirlo de manera más simple, los algoritmos describen en general su solución al problema ("Esto es lo que voy a hacer"). Mientras que el paradigma de programación se ocupa de su implementación real ("Así es como lo voy a hacer").
fuente
Algoritmos = contar la historia " Cómo " (es decir, cómo manipular los datos de entrada utilizando estructuras de datos a tiempo para producir los resultados deseados)
OOP = una " Metodología " facilitada por los lenguajes OO para escribir programas (= algoritmos + estructuras de datos) que le brinda seguridad y abstracción de la memoria
OOP es solo un paradigma de implementación de algoritmos.
Buena analogía : películas
Puede grabar escenas empleando un especialista o no. El guión (algoritmo) no cambia. La gente no debería ver ninguna diferencia en el resultado final.
EDITAR: puede probar un MOOC de buena calidad: https://www.coursera.org/course/algs4partI que entrelaza los temas discutidos (especialmente el enfoque OOP) y le da la esencia de lo que pregunta aquí.
fuente
Alexander Stepanov es el creador original de la Biblioteca de plantillas estándar de C ++ (STL), que es la biblioteca de algoritmos fundacional para C ++. C ++ es un lenguaje multi-paradigmático que incluye características "Orientadas a Objetos", pero Alexander Stepanov tiene esto que decir sobre la Orientación de Objetos:
http://www.stlport.org/resources/StepanovUSA.html
Stepanov expresó su biblioteca de algoritmos no con objetos, sino con iteradores genéricos .
fuente
Los algoritmos describen lo que debe hacer la computadora. La estructura describe cómo se presenta el algoritmo [en el código fuente]. OOP es un estilo de programación que aprovecha ciertas estructuras "orientadas a objetos".
Los libros de algoritmos a menudo evitan la POO porque se centran en el algoritmo, no en la estructura. Los fragmentos de código que dependen en gran medida de la estructura tienden a ser malos ejemplos para poner en un libro de algoritmos. Del mismo modo, los libros de OOP a menudo evitan los algoritmos porque desordenan la historia. El punto de venta de OOP es su fluidez, y vincularlo a un algoritmo lo hace parecer más rígido. Se trata más del enfoque del libro que de cualquier otra cosa.
En el código de la vida real, usará ambos lado a lado. No puede resolver problemas informáticos sin algoritmos, por definición, y le resultará difícil escribir buenos algoritmos sin estructura (POO o de otro modo).
Como ejemplo de dónde se difuminan, tome la Programación dinámica. En un libro de algoritmos, describiría cómo tomar un conjunto de datos homogéneo en una matriz y utilizar la Programación dinámica para llegar a una solución. En un libro de OOP, puede encontrarse con una estructura como Visitor, que es una forma de hacer algoritmos arbitrarios en un conjunto de objetos heterogéneos. El ejemplo del libro DP podría considerarse como un visitante muy simple que opera en objetos en un orden generalmente ascendente. El patrón Visitante podría considerarse como el esqueleto de un problema de DP, pero falta la carne y las papas. En realidad, encontrará que a menudo necesita ambos juntos: usa el patrón Visitor para tratar la heterogeneidad en su conjunto de datos (DP es malo en eso), y usa DP dentro de la estructura de Visitor para organizar su algoritmo para minimizar el tiempo de ejecución (Visitor no
También vemos algoritmos que funcionan sobre los patrones de diseño. Es más difícil redactar ejemplos en un espacio pequeño, pero una vez que tiene estructura, comienza a querer manipular esa estructura y utiliza algoritmos para hacerlo.
Esta es una pregunta más difícil de responder de lo que piensas. Para el primer orden, no hay una razón computacional por la que necesite OOP para resolver cualquier problema. La prueba simple es que cada programa OOP se compila en ensamblador, que es un lenguaje decididamente no OOP.
Sin embargo, en el esquema general de las cosas, la respuesta comienza a ser tímida hacia sí. Raramente está limitado simplemente por las metodologías informáticas. La mayoría de las veces hay cosas como las necesidades comerciales y la habilidad del desarrollador que son factores que influyen en la ecuación. Muchas aplicaciones hoy en día no podrían escribirse sin OOP, no porque OOP sea de alguna manera fundamental para la tarea, sino porque la estructura proporcionada por OOP fue esencial para mantener el proyecto en buen camino y dentro del presupuesto.
Esto no dice que nunca abandonaremos OOP en el futuro por alguna nueva estructura divertida. Simplemente dice que es una de las herramientas más efectivas en nuestra caja de herramientas para una fracción sorprendentemente grande de tareas de programación que existen hoy en día. Los problemas futuros pueden hacer que nos acerquemos al desarrollo utilizando diferentes estructuras. Por un lado, espero que las redes neuronales requieran un enfoque de desarrollo muy diferente, que puede resultar o no "Orientado a Objetos".
No veo la desaparición de OOP en el futuro cercano debido a la forma en que piensan los diseñadores de algoritmos. Hasta la fecha, el patrón habitual es que alguien diseña un algoritmo que no aprovecha la POO. La comunidad OOP se da cuenta de que el algoritmo realmente no se ajusta a la estructura OOP, y realmente no es necesario, por lo que envuelven todo el algoritmo en una estructura OOP y comienzan a usarlo. Considere
boost::shared_ptr
. Los algoritmos de conteo de referencia que descansan en el interiorshared_ptr
no son muy amigables con la POO. Sin embargo, el patrón no se hizo popular hasta que seshared_ptr
creó un envoltorio de OOP a su alrededor que expuso las capacidades de los algoritmos en un formato estructurado de OOP. Ahora, es tan popular que se convirtió en la última especificación para C ++, C ++ 11.¿Por qué es tan exitoso? Los algoritmos son excelentes para resolver problemas, pero a menudo requieren una inversión inicial sustancial en investigación para comprender cómo usarlos. El desarrollo orientado a objetos es muy efectivo para envolver dichos algoritmos y proporcionar una interfaz que requiere menos inversión inicial para aprender.
fuente
Además de las excelentes respuestas, mencionaré una comunidad conceptual adicional entre OOP y Algoritmos.
Tanto OOP como Algoritmos enfatizan fuertemente el uso de precondiciones y postcondiciones para asegurar la corrección del código.
En general, esta es una práctica estándar en todas las áreas de la informática; sin embargo, este principio rector da como resultado una ruta evolutiva en OOP que hace que sea mutuamente beneficioso implementar algoritmos en el entorno OOP.
En OOP, se puede crear un grupo de objetos que puedan satisfacer el mismo contrato (condiciones previas y condiciones posteriores) para implementar una interfaz. El usuario de dicha interfaz no necesitará saber qué implementación se usa en el objeto subyacente, excepto en algunas situaciones raras (en las que ocurre una abstracción con fugas).
Un algoritmo es una implementación de pasos utilizados para realizar un cálculo, uno que tomará la condición previa y producirá la condición posterior.
Por lo tanto, uno puede tomar prestada la idea de abstracción en forma de precondiciones y postcondiciones, y aplicarla a los algoritmos. Encontrará que a veces los algoritmos complicados pueden descomponerse en pasos más pequeños, y estos pasos más pequeños pueden permitir diferentes estrategias de implementación siempre que se cumplan las mismas condiciones previas y posteriores.
Al implementar algoritmos en OOP, uno puede hacer que estos pasos más pequeños sean intercambiables.
Finalmente, tenga en cuenta que FP y OOP no son mutuamente excluyentes. Cualquier cosa descrita anteriormente puede ser igualmente aplicable a FP también.
fuente
Los algoritmos tratan sobre cómo resolver un problema (cómo generar resultados a partir de la entrada dada), OOP trata sobre cómo formular o expresar nuestra solución (los pasos del algoritmo).
Un algoritmo se puede describir en lenguaje natural o en lenguaje ensamblador, pero los conceptos que tenemos en un lenguaje natural nos ayudan a escribirlo y comprenderlo mejor. Por ejemplo, el algoritmo para ordenar burbujas podría ser:
Para ocultar los detalles
swap
y relacionarlos con elA
, utilizamos una sintaxis y función OOP, luego OO acerca el algoritmo a nuestro lenguaje natural y comprensión.No, si considera que cualquier programa (o algoritmo) en una computadora se traducirá a un conjunto de instrucciones ejecutadas en la CPU ( Turing Machine ) y si consideramos estas instrucciones como el último algoritmo que resuelve el problema en una computadora , entonces OOP No puedo hacer algo más. Simplemente lo acerca al entendimiento humano y al razonamiento. Es una forma de empaquetar nuestros procedimientos y estructuras de datos.
Puede ser útil establecer o formular un algoritmo más fácil o más comprensible. Puede ocultar detalles y proporcionar una visión general de la solución.
En teoría, el algoritmo es el primero y lo implementa el segundo . Pero en realidad, no podemos estar seguros de que nuestro algoritmo funcione como se espera hasta que lo rastreemos o generemos el resultado esperado. Las computadoras nos ayudan a hacer eso, pero no espera escribirlo en lenguaje de máquina (ensamblaje).
En este sentido, OOP facilita la implementación, prueba y refinamiento de nuestro algoritmo en computadoras y lo escribe para una computadora en un idioma cercano a nuestro lenguaje natural.
fuente