2011-01-13 8 views
29

Últimamente estoy perdiendo mi confianza en OOP. Ya he visto muchas quejas sobre el mal uso común de OOP o simplemente el uso excesivo simple. Yo no significa la confusión común entre es-a y tiene-una relación. Quiero decir cosas como los problemas de ORM cuando se trata de bases de datos relacionales, el uso excesivo de la herencia de C# y también varios años de buscar en el código con la misma creencia de encapsulación falsa que Scott Meyers menciona en el elemento 23 de C + EficazSíntomas y alternativas a OOP usado en exceso

Estoy interesado en saber más sobre esto y no OOP software patrones que pueden resolver ciertos problemas mejor que sus OOP contrapartes. Estoy convencido de que hay mucha gente dando buenos consejos sobre cómo usar esto como una ventaja con OOP no puro idiomas como C++.

¿Alguien sabe alguna buena referencia (autor, libro, artículo) para iniciar ?

Por favor, observe que estoy buscando dos cosas diferentes pero relacionados:

  • usos indebidos común de los conceptos de POO (como el punto 23)
  • Patrones en programación orientada a objetos no es la mejor solución (con alternativas)
+1

¿Uso excesivo de la herencia? ¿Que es eso? –

+7

Usando la herencia, donde mejor es usar la agregación. – dzendras

+0

bases de datos relacionales tiene sus propios problemas, es por eso que T-SQL y similares se están convirtiendo en lenguajes completos, puede escribir procedimientos Java SQL Server, etc. Además, hay buenos ORM, me he escrito uno muy útil. y +1 para el comentario de Noah, en realidad, ¿qué uso excesivo de la herencia? – peenut

Respuesta

3

Bueno, puedo recomendarle un libro Agile Principles, Patterns, and Practices in C#. Los ejemplos están en C# por supuesto, pero la idea del libro es universal. No solo cubre Agile, sino que también se centra en las malas prácticas y muestra ejemplos de cómo convertir el código incorrecto en un buen código. También contiene descripciones de muchos patrones de diseño y muestra cómo implementarlos en un ejemplo semi-real de la aplicación de nómina.

0

Yo diría que mirar los motores de los juegos. En su mayor parte, OOP tiene una tendencia a causar ligeras disminuciones en el rendimiento, y la industria del juego aparentemente está obsesionada con la eliminación de ralentizaciones menores (y, a veces, ignorando las grandes). Como tal, su código, aunque generalmente está escrito en un lenguaje que admite OOP, terminará usando solo los elementos de OOP que son necesarios para un código limpio/facilidad de mantenimiento que también equilibra el rendimiento.

EDIT:

Una vez dicho esto, no sé si me gustaría ir a ver realmente irreal. Hacen algunas cosas extrañas por el simple hecho de hacer que su contenido sea más fácil para los desarrolladores ... hace que su código ... bueno, mira si realmente quieres saberlo.

+1

La industria de los juegos está obsesionada en gran medida con cualquier paradigma de programación que fuera genial hace 15 años, porque ahora ya no lo perciben como "demasiado lento". – jalf

+0

yep jalf, eso es porque todos están en OO ahora :) – jsz

2

Esto tiene que hacerse, pero si realmente quiere alejarse de OOP o al menos echar un vistazo a los conceptos que no son OOP pero se utilizan con gran eficacia: Learn you a Haskell. Pruebe un nuevo paradigma de programación y luego comience a ver dónde puede aplicar gran parte de los conceptos a los lenguajes OOP. Esto aborda su segundo punto, no de manera directa, pero confíe en mí, ayudará más de lo que pueda pensar.

2

Es un poco extraño que menciones C#. Tiene muy palabras clave potentes para mantener la miseria de herencia habitual bajo control. El primero debe ser palabra clave interna. La noción de restringir la visibilidad a un módulo . Ese concepto está completamente ausente en C++, el modelo de compilación simplemente no lo admite. De lo contrario, es un gran concepto: "Solo confío en que los miembros de mi equipo lo hagan bien". Por supuesto que sí.

Luego está la slammer one, palabra clave sellada. Extraordinariamente poderoso, "el dinero se detiene aquí, no te metas conmigo". Utilizado con precisión quirúrgica en el marco .NET, nunca he encontrado un caso en el que sellado se haya utilizado de forma inapropiada. También falta en C++, pero con formas oscuras de hacerlo funcionar.

Pero sí, el modelo de objeto WPF apesta bastante pesado. Heredar 6 niveles de profundidad y usar puertas traseras como una propiedad de dependencia es ofensivo. La herencia es difícil, vamos de compras.

+0

En C++, 'static' restringe una función u objeto a la visibilidad del archivo. Sin embargo, no tiene equivalente para 'sellado' (aparte de un truco complicado que involucra herencia virtual). –

+1

Uhm ... C++ tiene una manera clara y simple (lo mismo que C) para limitar el acceso a sus clases a su propio * módulo * (biblioteca/ejecutable): No publique los objetos en los encabezados. Acerca de las clases de sellado ... Conozco el truco desde hace un tiempo, tanto el simple no tonto seguro y el más complejo y más caro de escribir ... pero nunca sentí que realmente necesitaba * sellar * una clase. –

+0

En C++ puede sellar una clase haciendo que su constructor sea privado. (Y luego proporcionar otra forma de instanciarlo, por supuesto.) –

0

Un uso excesivo común está forzando el OOP en programas/scripts que toman alguna entrada, la convierten en salida, luego salen (y no reciben información de ningún otro lugar durante el proceso). La forma de procedimiento es mucho más limpia en estos casos.

Un ejemplo típico de esto es forzar OOP en scripts PHP.