¿Cuándo usamos realmente la programación orientada a objetos? [cerrado]

35

Estoy escribiendo un programa en Python, que básicamente manipula cadenas, y me preguntaba si debería hacerlo utilizando los principios OOP o no. El cliente me dijo que no le importa el código, solo quiere que se haga .

Sé que el código orientado a objetos no es por definición más limpio y, por el contrario, el código que no es OO no es, por definición, malo. La pregunta que estoy haciendo podría estar más o menos basada en la opinión, pero podría haber algunas reglas que desconozco.

Más información sobre lo que hay que hacer:

  • analizar un .csvarchivo y procesar los datos en función de un archivo de configuración (las columnas pueden ser diferentes, como en el número de columnas o los datos que contienen)
  • use los datos procesados ​​anteriores para crear nuevos datos formateados personalizados (o múltiples archivos basados ​​en algunos de los valores anteriores)
  • use los últimos datos formateados para crear un archivo XML.
  • dividir el archivo XML en varios XMLcorreos electrónicos según su contenido
  • la aplicación debe estar basada en CLI
  • Por supuesto, hay otras cosas como: registrar algunos eventos, analizar argumentos de la CLI, etc.

Ahora, esta no es una aplicación grande / difícil, y también está casi terminada, pero durante todo el proceso de desarrollo me preguntaba si esto debería hacerse usando OOP o no.

Entonces, mi pregunta sería: ¿cómo saben / deciden cuándo usar OOP en una aplicación?

Grajdeanu Alex.
fuente
12
Re: "Al cliente ... no le importa el código, solo quiere que se haga". OK, entonces haz la cosa. Pero, ¿qué tan complejo es esta cosa? ¿Qué tan bien entiendes realmente los requisitos? ¿Qué posibilidades hay de que el cliente le pida en algún momento que cambie la cosa? A veces, un truco rápido y sucio es todo lo que necesita, pero cuanto más tiempo y energía vaya a invertir en él, mayor será la probabilidad de que algún enfoque estructurado para resolver el problema (por ejemplo, diseño OO) lo beneficie.
Solomon Slow
55
No use "EDITAR" u otros apodos similares en sus publicaciones. Cada publicación de Stack Exchange tiene un historial de edición detallado que cualquiera puede revisar. Información como "No pregunté qué era POO" es más apropiada en un comentario de todos modos, no es su pregunta.
Robert Harvey
@RobertHarvey ok, lo tengo. Lo haré la próxima vez.
Grajdeanu Alex.

Respuestas:

60

Python es un lenguaje de paradigmas múltiples, lo que significa que puede elegir el paradigma más apropiado para la tarea. Algunos lenguajes como Java son OO de paradigma único, lo que significa que obtendrá dolores de cabeza si intenta usar cualquier otro paradigma. Los carteles que dicen "siempre use OO" probablemente provengan de un fondo en ese idioma. ¡Pero afortunadamente tienes una opción!

Observo que su programa es una aplicación CLI que lee algunas entradas (csv y archivos de configuración) y produce algo de salida (archivos xml), pero no es interactiva y, por lo tanto, no tiene una GUI o API con estado. Tal programa se expresa naturalmente como una función de entrada a salida, que delega a otras funciones para subtareas.

OO, por otro lado, se trata de encapsular el estado mutable y, por lo tanto, es más apropiado para aplicaciones interactivas, GUI y API que exponen el estado mutable. No es casualidad que OO se haya desarrollado en paralelo con las primeras GUI.

OO tiene otra ventaja, ya que el polimorfismo le permite una arquitectura más débilmente acoplada, donde diferentes implementaciones de la misma interfaz pueden sustituirse fácilmente. Combinado con la inyección de dependencias, esto puede permitir la carga basada en la configuración de dependencias y otras cosas interesantes. Sin embargo, esto es principalmente apropiado para aplicaciones muy grandes. Para un programa del tamaño de lo que describe, sería una sobrecarga excesiva sin beneficio aparente.

Además de las funciones que realmente leen y escriben los archivos, la mayor parte de su lógica se puede escribir como funciones libres de efectos secundarios que toman algo de entrada y devuelven alguna otra salida. Esto es eminentemente fácil de probar, mucho más simple que probar unidades OO donde necesita burlarse de dependencias y demás.

En pocas palabras: sugiero un montón de funciones divididas en módulos para la organización, pero no objetos.

JacquesB
fuente
8
Finalmente una respuesta equilibrada que no solo canta el elogio de OOP :-)
cmaster
1
Ese es el tipo de respuesta que esperaba. ¿Podría ampliar un poco su respuesta? Se ve increíble hasta ahora.
Grajdeanu Alex.
3
@ Dex'ter: Gracias a ti. ¿Qué tipo de información adicional busca?
JacquesB
3
Agregaría a esto que la Programación Funcional podría ser un paradigma para leer.
Andrew dice que reinstale a Mónica el
1
@ Bergi: Sí, ese es el beneficio de un lenguaje de paradigmas múltiples. Puede usar bibliotecas OO sin tener que escribir su propio programa en un estilo OO.
JacquesB
15

Considere un botón en una GUI. Tiene estado (es tamaño, color, posición, etiqueta, etc.). Pueden sucederle cosas (se hace clic, se debe volver a dibujar, etc.). En tales situaciones, modelarlo como un objeto tiene sentido. Como objeto, puede contener su estado, un conjunto de acciones que se pueden realizar en él (métodos) y puede notificar a otras partes de la aplicación que le han sucedido cosas disparando eventos.

OOP es una herramienta excelente para manejar GUI y otras situaciones en las que partes del sistema tienen un estado volátil.

Otras situaciones, como la que usted describe, en la que los datos se leen desde una fuente, se procesan y se escriben en un destino, se manejan bien con un enfoque diferente: la programación declarativa (o función). El código declarativo para el procesamiento de datos tiende a ser más fácil de leer y más corto que las soluciones OOP.

Así como un martillo y una sierra son herramientas poderosas cuando se usan correctamente, también lo son las técnicas de programación orientadas a objetos y declarativas. Probablemente podrías clavar un clavo en un trozo de madera con el mango de una sierra. Del mismo modo, puedes romper un trozo de madera por la mitad con un martillo. Del mismo modo, puede crear una GUI con solo funciones y procesar datos con objetos. Sin embargo, cuando las herramientas se usan correctamente, los resultados son más limpios y simples.

La regla general que uso es que si tengo mucho estado o necesito interacción del usuario, uso objetos; de lo contrario, uso (puro y de orden superior, cuando sea posible) funciones.

David Arno
fuente
6

La programación orientada a objetos agrega cuatro nuevas herramientas a su arsenal:

  1. Encapsulamiento
  2. Abstracción
  3. Herencia
  4. Polimorfismo

Usaría OOP en su aplicación cuando haya crecido lo suficiente y sea lo suficientemente compleja como para beneficiarse de estas herramientas.

Robert Harvey
fuente
18
La abstracción y el polimorfismo son herramientas proporcionadas por muchas "orientaciones" de programación. OOP en realidad ofrece una forma de encapsulación más débil que otros enfoques porque la herencia fomenta los diseños de abstracción con fugas. Lo único que OOP realmente agrega al kit de herramientas es la herencia, que es ampliamente vista como algo malo.
David Arno
44
@DavidArno: Básicamente estás diciendo "Nunca uses OOP".
Robert Harvey
66
Esto se debe a un duro día de trabajo en el que se mira el código de otras personas, una implementación procesal directa de un programa a menudo es mejor que una implementación con una mala comprensión del diseño OO. La arquitectura OO puede ser muy poderosa, pero debe usarse como una especia en la cocina, con conocimiento experto y la cantidad justa. El mal uso del diseño OO es tan común como pedir salsa de tomate en un restaurante malo.
Phill
66
Ninguna de las cuatro herramientas (Encapsulación, Abstracción, Herencia, Polimorfismo) es específica de la POO. Tal vez deberías explicar cómo OOP es diferente de otros paradigmas en estas dimensiones.
Giorgio
44
@gardenhead, tu extraño sentido de superioridad no está haciendo nada por tu posición. Tal vez deberías plantear una pregunta titulada "¿Por qué los idiomas más empleables suelen ser OO? Mejor aún, Ctrl + F y escriba 'GUI'.
Gusdor
1

Esta pregunta me parece un poco confusa. Si lo está escribiendo en Python, seguramente usará objetos. Cuando abre un archivo, devuelve un objeto. Cuando produce el resultado, devuelve un objeto iterador. Cada función que crea es un objeto. Cuestionar el valor de OO en las aplicaciones de Python parece extraño, por decir lo menos.

Según los comentarios aquí, sí, Python admite paradigmas funcionales, pero está principalmente basado en objetos. El lenguaje en sí y las bibliotecas incorporadas están orientadas alrededor de los objetos. Sí, es compatible con lambda (al igual que Java y cualquier otro número de idiomas típicamente descritos como OO), pero es intencionalmente simplista en comparación con un verdadero lenguaje funcional.

Quizás estas distinciones en torno al diseño OO y el diseño funcional se están volviendo obsoletas. Si creo, tomo una función polimórfica en un Objeto * diseñado por OO y le paso un puntero a esa función en un objeto como parámetro para la función funcionalmente diseñada *, ¿es OO o es funcional? Creo que es a la vez un enfoque realmente efectivo para resolver problemas.

Creo que la verdadera pregunta es "¿cuándo debería comenzar a diseñar sus propias clases en lugar de simplemente crear un módulo con funciones?" Creo que la respuesta correcta para eso es: cuando ayuda a simplificar la solución. Daría la misma respuesta básica para cualquier lenguaje orientado a objetos.

* la redundancia es intencional: no quiero ser acusado aquí de suponer que los objetos son OO o que las funciones son funcionales.

JimmyJames
fuente
55
Sí, los objetos no son iguales a OOP. Hay una diferencia entre tener un objeto y estructurar su arquitectura alrededor de los objetos y sus interacciones. algo así como si haces una función que no significa que estás haciendo una programación funcional.
sara
fácilmente podría considerar un objeto Python / JavaScript un Registro, que es bastante funcional. Los lenguajes funcionales tienen objetos. La clave está en la segunda palabra: orientada. Los lenguajes OOP están completamente orientados al uso de objetos, mientras que otros lenguajes simplemente parecen ser otra parte de su caja de herramientas.
Dan Pantry
0

Una de las cosas más importantes de la programación orientada a objetos es que en lugar de razonar sobre el flujo del programa, comienza a razonar sobre el estado.

Muchas veces veo el objeto, veo los métodos, pero lo que también veo es que el pensamiento impulsor detrás del código es el flujo en lugar del estado.

Y una vez que razona sobre el estado, es fácil construir un buen código OOP porque tan pronto como su código se vuelve demasiado complejo, nota que ya no puede razonar sobre su estado y sabe que necesita refactorizar.

Considere su ejemplo: desea analizar un archivo csv. De dónde viene: un archivo en el disco. Lo carga, lo guarda en la memoria y lo analiza. Ahora viene su cliente: oye, también quiero analizar archivos de la web. Así que está contento porque creó una interfaz agradable para cargar su archivo y solo tiene que hacer que el código que lo obtiene de la web y el resto de su programa permanezca exactamente igual.

Y lo bueno es: puedes probar eso.

Pieter B
fuente
3
Su ejemplo con la lectura de un archivo desde el disco frente a la lectura de un archivo desde la web también se puede implementar con diferentes funciones. No necesitas OO para eso.
JacquesB
0

En términos simples:

  • Puede usar OOP o no OOP en cualquier tipo de proyectos que desee.
  • OOP no es la panacea, pero ayuda a gestionar la complejidad.
  • Va más allá de la modularidad, se trata de compartimentación. Piense en los diferentes compartimientos que tiene un barco para retener la flotabilidad si el casco está dañado.
  • OOP es una forma de administrar dependencias para que los errores puedan ser más fáciles de rastrear, ya que solo hay un conjunto definido de formas en que los diferentes componentes de un programa pueden comunicarse entre sí.
  • En un programa hay muchas cosas que funcionan: variables, constantes, métodos, archivos, parámetros, funciones, módulos, etc. Pueden interactuar entre sí de maneras que a veces pueden ser impredecibles. OOP es un conjunto de principios que reducen la cantidad de formas en que las cosas pueden interactuar entre sí. No está obligado a usar OOP para hacer eso, pero ayuda.

Dicho esto, hay otros factores a tener en cuenta:

  • ¿Son sus programadores competentes en OOP / OOD?
  • ¿Sus programadores dominan un lenguaje OOP?
  • ¿Crees que el software se volverá complejo con el tiempo?
  • ¿Planea escalar o reutilizar código en el futuro?
  • ¿Crees que tu "diseño" puede convertirse en un activo? es decir, ¿podrá aprovecharlo para crecer o como base para futuros proyectos?

No me malinterpreten: puede lograr todo eso sin usar OOP, pero con OOP será más fácil.

Pero...

Si su equipo no es experto en OOP / OOD y no tiene experiencia en esa área, vaya con los recursos que tiene.

Tulains Córdova
fuente
-2

Entonces, mi pregunta sería: ¿cómo saben / deciden cuándo usar OOP en una aplicación?

Úselo siempre. Una vez que esté acostumbrado a usarlo, lo usará para todo. Es una excelente manera de garantizar una buena abstracción entre las capacidades y su uso, lo cual es un beneficio significativo para el mantenimiento. Lo usamos, por ejemplo, para

  • los objetos de estructura de datos pequeños, porque estos son a menudo polimórficos, por ejemplo, y la estructura de datos intermedia después de analizar algo a menudo tiene múltiples entidades pequeñas, que tienen un comportamiento común y, sin embargo, también están especializadas. Estos son un gran caso de uso para una clase base o interfaz común, con implementaciones y comportamientos especializados, es decir, una jerarquía de clases (polimorfismo).

  • registro, como ejemplo, porque facilita la sustitución de un registrador diferente

  • grandes piezas de estructura de programa, porque evoca múltiples concurrentes, y tal vez aproveche los procesadores de múltiples CPU. Por ejemplo, un servidor web puede usar trivialmente múltiples manejadores de solicitudes concurrentes, debido a los objetos.

Facilita la refactorización y la reutilización, como mencioné, alienta una buena abstracción, todo lo cual facilita el mantenimiento. OOP debe ser aceptado y utilizado todo el tiempo. Una buena programación de OOP evita métodos estáticos y / o datos estáticos, y usa objetos para todo.

Erik Eidt
fuente
66
No voté negativamente (aunque estaba cerca), pero creo que esta es la razón de los votos negativos que recibiste: "Siempre usa esto, porque es genial" rara vez es un buen consejo. Siempre hay excepciones. Ninguna herramienta viene sin inconvenientes, y OOP no es una excepción. Dígale a la gente que es bueno, diga a la gente para qué es bueno, diga a la gente por qué es bueno, dígale a la gente que evite las alternativas si pueden, pero nunca le diga a la gente que no piense en las alternativas.
cmaster
@cmaster, estoy bien si la gente vota negativamente, es su elección, y yo también lo hice. Sobre el tema, sigo pensando que esta es la respuesta correcta para la persona que hace la pregunta; En mi humilde opinión, el OP necesita saltar y usar OOP, en lugar de tratar de decidir cuándo usar OOP y, en ocasiones, elegir hacer una clase pero escribir código de procedimiento.
Erik Eidt
2
@cmaster Puedo apreciar los consejos de Erik. Tan a menudo como el tipo de respuesta "depende" puede ser el camino políticamente correcto, seamos sinceros, OO se ha convertido en la línea de base para entornos de programación que lo soportan. Así que no nos engañemos, difícilmente puedes equivocarte con OO. El script descrito es, aunque lineal, lo suficientemente complejo como para que los objetos le brinden algunos beneficios.
Martin Maat
2
@ErikEidt "el OP necesita saltar y usar OOP" Podría parafrasear eso como "El OP necesita dejar de pensar en la mejor manera de resolver el problema del cliente y simplemente seguir el Único Camino Verdadero hacia la Iluminación". Por desgracia, he tenido que hacer frente a una gran cantidad de los llamados profesionales de la informática que se hacen seguir esa metodología de diseño de software. Caricatura obligatoria de Dilbert: dilbert.com/strip/1996-02-27
alephzero
1
tan fácil como es alejar esto como "otro fanático OOP sin sentido", creo que hay algo que decir para realmente ir al 100% en algo para realmente internalizarlo y absorberlo. no para que pueda usarlo todos los días por el resto de su vida, sino para que APRENDA las fortalezas y debilidades y no solo lea sobre ellas. Recomiendo a casi cualquier persona que pase unos meses haciendo POO incondicional y unos pocos meses FP (á la haskell) incondicional y unos meses con el procedimiento C y así sucesivamente. solo entra allí y baja y ensuciate con eso.
sara
-2

La programación orientada a objetos proporciona herramientas para crear un marco. Estas herramientas son encapsulación, abstracción, herencia y polimorfismo. Estas ideas lo ayudarán a dividir su programa en dos secciones.

Cómo: esta es la parte del marco de trabajo de su código, donde crea algún tipo de abstracción, decide cómo funcionan sus bloques en general y cómo interactúa con otros bloques.

Qué hacer: esta parte es donde los bloques hacen el trabajo en sí. Aquí las clases se derivan de las clases base creadas en la sección "Cómo".

Uno puede beneficiarse enormemente de OOPS

  1. si puede reutilizar un marco existente y solo tiene que implementar detalles específicos en la sección "qué hacer".
  2. La funcionalidad que se está implementando para el proyecto actual es genérica / de uso común y otros proyectos / proyectos futuros pueden obtener beneficios del marco que se crea durante el desarrollo del proyecto actual.
  3. Desglosando grandes proyectos en patrones comúnmente conocidos para resolver un gran problema.
  4. Use OOPS incluso para proyectos pequeños para acostumbrarse a usarlo y esté listo cuando surjan 1 a 3 tipos de problemas
Rahul Menon
fuente
Entonces, ¿básicamente estás diciendo que siempre debes usar OOP, independientemente de la tarea real que quieras resolver?
JacquesB
No :), hay muchos programas de programación y algunos se prestan para resolver un problema en particular mejor que otros. OOPS no es la mejor solución para todos, pero OOPS es bastante popular. tomará tiempo y práctica construir buenas clases y estructuras en OOPS, por lo que si desea usar OOPS de manera eficiente, comience con proyectos más pequeños. Una vez que lo domines, depende totalmente de ti. Veo los conceptos de OOPS como una herramienta para construir framework principalmente.
Rahul Menon