¿Cuándo es más adecuado para OOP? [cerrado]


Desde que empecé a estudiar programación orientada a objetos, leo con frecuencia artículos/blogs diciendo que las funciones son mejores, o no todos los problemas deben ser modelados como objetos. De sus aventuras de programación personal, ¿cuándo cree que un problema se resuelve mejor con OOP?

 28
oop
Author: Henrik P. Hessel, 2008-08-09

16 answers

No hay una regla dura y rápida. Un problema se resuelve mejor con OOP cuando eres mejor resolviendo problemas y pensando en una mentalidad OO. La orientación de objetos es solo otra herramienta que ha llegado a través de tratar de hacer de la computación una mejor herramienta para resolver problemas.

Sin embargo, puede permitir una mejor reutilización del código, y también puede conducir a un código más limpio. Pero muy a menudo estas cualidades altamente elogiadas son, en relidad, de poco valor real. Aplicación de técnicas de OO a un la aplicación funcional realmente podría causar muchos problemas. La habilidad radica en aprender muchas técnicas diferentes y aplicar las más adecuadas al problema en cuestión.

OO se cita a menudo como una solución similar a Nirvana para el desarrollo de software, sin embargo, hay muchas veces en que no es apropiado para ser aplicado al tema en cuestión. Puede, muy a menudo, conducir a la sobreingeniería de un problema para alcanzar la solución perfecta, cuando a menudo no es realmente necesario.

En essence, OOP no es realmente Programación Orientada a Objetos, sino mapear el Pensamiento Orientado a Objetos a un lenguaje de programación capaz de soportar Técnicas OO. Las técnicas de OO pueden ser compatibles con lenguajes que no son inherentemente OO, y hay técnicas que puede usar dentro de los lenguajes funcionales para aprovechar los beneficios.

Como ejemplo, he estado desarrollando software OO durante unos 20 años, por lo que tiendo a pensar en términos de OO al resolver problemas, independientemente del idioma Estoy escribiendo. Actualmente estoy implementando polimorfismo usando Perl 5.6, que no lo soporta de forma nativa. He optado por hacer esto, ya que hará que el mantenimiento y la extensión del código sea una tarea de configuración simple, en lugar de un problema de desarrollo.

No estoy seguro si esto está claro. Hay personas que son duras en la corte OO, y hay personas que son duras en la corte Funcional. Y luego hay personas que han intentado ambos y tratan de tomar lo mejor de cada uno. Tampoco lo es perfecto, pero ambos tienen algunos rasgos muy buenos que puedes utilizar sin importar el idioma.

Si está tratando de aprender OOP, no solo se concentre en OOP, sino que trate de utilizar el Análisis Orientado a Objetos y los principios generales de OO para todo el espectro de la solución del problema.

 28
Author: Xetius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 06:19:42

Soy un viejo, pero también he programado OOP durante mucho tiempo. Personalmente estoy en contra de usar OOP solo para usarlo. Prefiero que los objetos tengan razones específicas para existir, que modelen algo concreto y que tengan sentido.

El problema que tengo con muchos de los desarrolladores más nuevos es que no tienen un concepto de los recursos que están consumiendo con el código que crean. Cuando se trata de una gran cantidad de datos y el acceso a las bases de datos el objeto" perfecto" el modelo puede ser lo peor que puede hacer por el rendimiento y los recursos.

Mi conclusión es que si tiene sentido como un objeto, entonces programarlo como un objeto, siempre y cuando considere el impacto en el rendimiento/recursos de la implementación de su modelo de objetos.

 8
Author: bruceatk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 12:10:09

Creo que encaja mejor cuando se está modelando algo cohesionado con el estado y las acciones asociadas en esos estados. Supongo que eso es un poco vago, pero no estoy seguro de que haya una respuesta perfecta aquí.

Lo que pasa con OOP es que te permite encapsular y abstraer datos e información, lo cual es una verdadera bendición en la construcción de un sistema grande. Puedes hacer lo mismo con otros paradigmas, pero parece que la OOP es especialmente útil en esta categoría.

También depende de la idioma que estás usando. Si es un lenguaje con un rico soporte de OOP, probablemente deberías usarlo a tu favor. Si no lo hace, entonces es posible que necesite encontrar otros mecanismos para ayudar a dividir el problema en piezas más pequeñas y fácilmente comprobables.

 5
Author: Mike Stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-09 09:07:27

Estoy vendido a OOP.

Cada vez que puede definir un concepto para un problema, probablemente puede estar envuelto en un objeto.

El problema con OOP es que algunas personas lo usaron en exceso e hicieron que su código fuera aún más difícil de entender. Si tiene cuidado con lo que pone en objetos y lo que pone en servicios (clases estáticas), se beneficiará del uso de objetos.

Simplemente no coloque algo que no pertenezca a un objeto en el objeto porque necesita que su objeto lo haga algo nuevo que no pensaste inicialmente, refactorizar y encontrar la mejor manera de añadir esa funcionalidad.

 4
Author: mbillard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-09 12:34:42

Hay 5 criterios si debe preferir el código Orientado a Objetos sobre el código Basado en Objetos,Funcional o de Procedimiento. Recuerde que todos estos estilos están disponibles en todos los idiomas, son estilos . Todos estos están escritos en un estilo de " ¿Debo favorecer OO en esta situación?"

El sistema es muy complejo y tiene más de 9k LOC (Solo un nivel arbitrario). -- A medida que los sistemas se vuelven más complejos, los beneficios obtenidos al encapsular la complejidad aumentan un poco. Con OO, as opuesto a las otras técnicas, tiendes a encapsular más y más de la complejidad, lo cual es muy valioso en este nivel. Antes de esto, se debe favorecer el procedimiento o basado en objetos. (Esto no es abogar por un lenguaje en particular. OO C se ajusta a estas características más que OO C++ en mi mente, un lenguaje con una notoria reputación de abstracciones filtrantes y una capacidad para comer tiendas con incluso 1 programador mediocre/obstinado para el almuerzo).

Su código no es operaciones en datos (es decir, basado en bases de datos o basado en matemáticas / análisis). El código basado en bases de datos a menudo se representa más fácilmente a través del estilo de procedimiento. El código basado en análisis a menudo es más fácil de representar en un estilo funcional.

Su modelo es una simulación de algo (OO sobresale en las simulaciones).

Estás haciendo algo para lo que el subtipo basado en objetos dispatch of OO es valioso (también conocido como, necesita enviar un mensaje a todos los objetos de un cierto tipo y varios subtipos y obtener un apropiado, pero diferente, reacción de todos ellos).

Su aplicación no tiene subprocesos múltiples, especialmente en un tipo de método de tarea no trabajador de base de código. OO es bastante problemático en programas que son multihilo y requieren diferentes hilos para hacer diferentes tareas. Si su programa está estructurado con uno o dos hilos principales y muchos hilos de trabajo haciendo lo mismo, el flujo de control confuso de los programas OO es más fácil de manejar, ya que todos los hilos de trabajo se aislarán en lo que tocan y se pueden considerar como una sección monolítica de código. Considere cualquier otro paradigma en realidad. Funcional sobresale en multihilo (la falta de efectos secundarios es una gran bendición), y la programación basada en objetos puede darle bendiciones con algo de la encapsulación de OO, sin embargo, con código de procedimiento más trazable en las secciones críticas de su base de código. Por supuesto, el procedimiento también sobresale en este campo.

 4
Author: Michael Langford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-06 13:42:41

Algunos lugares donde OO no es tan bueno son donde estás tratando con "Conjuntos" de datos como en SQL. OO tiende a hacer que las operaciones basadas en conjuntos sean más difíciles porque realmente no está diseñado para tomar de manera óptima la intersección de dos conjuntos o el superconjunto de dos conjuntos.

Además, hay momentos en que un enfoque funcional tendría más sentido, como este ejemplo tomado de MSDN :

Considere, por ejemplo, escribir un programa para convertir un documento XML en otro forma de datos. Si bien ciertamente sería posible escribir un programa C# que analizara el documento XML y aplicara una variedad de instrucciones if para determinar qué acciones tomar en diferentes puntos del documento, un enfoque posiblemente superior es escribir la transformación como un programa de Transformación del Lenguaje de Hojas de estilos extensibles (XSLT). No es sorprendente que XSLT tenga una gran veta de funcionalismo dentro de ella

 1
Author: lomaxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-09 14:11:47

Encuentro que ayuda pensar en un problema dado en términos de 'cosas'.

Si se puede pensar que el problema tiene una o más 'cosas', donde cada 'cosa' tiene un número de atributos o piezas de información que se refieren a su estado, y un número de operaciones que se pueden realizar en él - entonces OOP es probablemente el camino a seguir!

 1
Author: Chris Roberts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-09 14:17:22

La clave para aprender Programación Orientada a Objetos es aprender sobre el Patrón de Diseño. Al aprender sobre los patrones de diseño, puede ver mejor cuándo se necesitan las clases y cuándo no. Como cualquier otra cosa utilizada en la programación, el uso de clases y otras características de los lenguajes OOP depende de su diseño y requisitos. Al igual que los algoritmos, los patrones de diseño son un concepto de nivel superior.

Un Patrón de diseño juega un papel similar al de los algoritmos para los lenguajes de programación tradicionales. Un el patrón de diseño le indica cómo crear y combinar objetos para realizar alguna tarea útil. Al igual que los mejores algoritmos, los mejores patrones de diseño son lo suficientemente generales como para ser aplicados a una variedad de problemas comunes.

 1
Author: RS Conley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 12:21:05

En mi opinión es más una pregunta sobre ti como persona. Algunas personas piensan mejor en términos funcionales y otras prefieren clases y objetos. Yo diría que la OOP es más adecuada cuando coincide con su modelo mental interno (subjetivo) del mundo.

 1
Author: fluffels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-13 16:59:36

El código orientado a objetos y el código de procedimiento tienen diferentes puntos de extensibilidad. Las soluciones orientadas a objetos facilitan la adición de nuevas clases sin modificar las funciones existentes (consulte el Principio Abierto-Cerrado), mientras que el código de procedimiento le permite agregar funciones sin modificar las estructuras de datos existentes. Muy a menudo diferentes partes de un sistema requieren diferentes enfoques dependiendo del tipo de cambio que se prevé.

 1
Author: Rob Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 14:41:25

OO permite que la lógica relacionada con un objeto se coloque dentro de un solo lugar (la clase u objeto) para que se pueda desacoplar y sea más fácil de depurar y mantener.

Lo que he observado, es que cada aplicación es una combinación de OO y código de procedimiento, donde el código de procedimiento es el pegamento que une todos sus objetos juntos (por lo menos, el código en su función principal). Cuanto más pueda convertir su código de procedimiento en OO, más fácil será mantener el código yor.

 1
Author: Juan Mendes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-03 00:37:43

Por qué se usa OOP para programar:

  1. Su flexibilidad – OOP es realmente flexible en términos de implementaciones de uso.
  2. Puede reducir sus códigos fuente en más de 99.9% – puede sonar como si estuviera exagerando, pero es cierto.
  3. Es mucho más fácil implementar la seguridad – todos sabemos que la seguridad es uno de los requisitos vitales cuando se trata de desarrollo web. El uso de OOP puede facilitar las implementaciones de seguridad en sus proyectos web.
  4. hace Que la codificación más organizado - Todos sabemos que un Programa Limpio es una Codificación Limpia. Usar OOP en lugar de procedimental hace las cosas más organizadas y sistematizadas (obviamente).
  5. Ayuda a su equipo a trabajar entre sí fácilmente-sé que algunos de ustedes tuvieron / han experimentado proyectos de equipo y algunos de ustedes saben que es importante tener el mismo método, implementaciones, algoritmo, etc, etc,
 1
Author: Ashok N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 16:17:58

Depende del problema: el paradigma OOP es útil en el diseño de sistemas distribuidos o framework con mucha entidad viviendo durante las acciones del usuario (ejemplo: aplicación web).

Pero si tienes un problema matemático preferirás un lenguaje funcional (LISP); para sistemas críticos de rendimiento usarás ADA o C, etc etc.

El lenguaje OOP es útil porque también utiliza probabilily el recolector de basura (uso automático de memoria) en la ejecución del programa: usted usted programa en C mucho tiempo debes depurar y corregir manualmente un problema de memoria.

 0
Author: alepuzio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-04 15:29:08

OOP es útil cuando tienes cosas. Un zócalo, un botón, un archivo. Si termina una clase en er, casi siempre es una función que pretende ser una clase. Es más que probable que TestRunner sea una función que ejecute pruebas (y probablemente llamada ejecutar pruebas).

 0
Author: stonemetal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-29 13:46:25

Personalmente, creo que OOP es prácticamente una necesidad para cualquier aplicación grande. No puedo imaginar tener un programa de más de 100k líneas de código sin usar OOP, sería una pesadilla de mantenimiento y diseño.

 0
Author: rbrc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-06 16:41:04

Te digo cuando OOP es malo.

Cuando el arquitecto escribe código OOP realmente complicado, no documentado. Deja la mitad del proyecto. Y muchas de sus piezas de código comunes que usó en varios proyectos tienen código faltante. Gracias a Dios por el Reflector.NET.

Y la organización no estaba ejecutando Visual Source Safe o Subversion.

Y lo siento. 2 páginas de código para iniciar sesión es bastante ridículo, incluso si es muy OOPed....

 -1
Author: etm1109,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-22 18:26:31