"Normalización" orientada a objetos

28

En la programación de bases de datos hay una técnica llamada "normalización" que usted hace a los datos que desea almacenar.

¿Alguien ha tratado de aplicar este concepto al diseño de objetos? ¿Cómo hizo? Como resulto?

Editar: para ampliar / aclarar, la normalización de la base de datos es más que un conjunto de principios para reducir la redundancia. En realidad, hay pasos y etapas por las que pasas y al menos medidas moderadamente objetivas que te indican en qué etapa te encuentras. El diseño de objetos tiene sus propios principios, y existe el concepto de olor, pero ¿hay alguna manera de hacer algo similar que te diga que estás en XX-form0,1,2 ... etc ... y métodos para pasar al siguiente nivel más "normalizado"?

Edward extraño
fuente
2
... ¿Quiere decir que hemos intentado no tener múltiples variables redundantes en nuestras clases y no tener múltiples clases redundantes en nuestros proyectos? ¿Eso incluso funcionaría?
Satanicpuppy
2
@ Steven A. Lowe: ¿Dónde estabas hace cinco años cuando estaba decidiendo un tema de mi tesis de maestría? ;)
Nunca lo he intentado (por eso estoy respondiendo como un comentario), pero supongo que podría hacerlo con un caché de datos compartidos, punteros de objetos a los datos compartidos en caché y algún tipo de mecanismo de inyección de dependencia señalar los punteros de los casos a los datos compartidos ...
FrustratedWithFormsDesigner
Una pregunta muy interesante la encuentro.
55
Creo que la refactorización cubre prácticamente tanto la POO como otras metodologías de programación.
JohnFx

Respuestas:

27

Si bien algunas de las tensiones subyacentes que impulsan la normalización de la base de datos no están presentes en un sistema OO, algunas sí lo están. Estos han dado lugar a patrones y principios de diseño OO que de alguna manera son análogos a la normalización, al menos en la medida en que los sistemas OO son análogos a las bases de datos relacionales. Por ejemplo:

En otras palabras, ¿alguien ha intentado aplicar técnicas de normalización de bases de datos a OOP? No, porque OOP ya tiene soluciones para los problemas compartidos que la normalización resuelve para las bases de datos relacionales.

Rein Henrichs
fuente
+1 ¡Mucho mejor de lo que intentaba escribir!
Michael K
Sin embargo, esos son principios, no técnicas. ¿Cómo usaría esos principios para "normalizar" un diseño de objeto?
Edward Strange
3
La normalización de la base de datos también es un principio. En ambos casos, hay patrones (o técnicas) que describen cómo tomar decisiones con respecto a estos principios. Mire los libros de Martin Fowler sobre refactorización y los libros de Kent Beck sobre patrones, por ejemplo. La diferencia es que el diseño de la base de datos es un dominio más pequeño y menos complejo que es más fácil de cuantificar y convertir en un conjunto simple de reglas.
Rein Henrichs
55
@Crazy Eddie: ¿Cómo lo haces con una base de datos relacional? Busca instancias donde se viola un principal y lo corrige. Si ve una clase con tres trabajos, la reescribe como tres clases. Si está buscando un verbo como "normalizar", tal vez sea su "refactor", aunque no es tan específico, es inclusivo.
Jeremy
1
@Rein: el diseño de la base de datos no es ni más pequeño ni menos complejo que OOP, pero tenía una gran ventaja: comenzó con una base teórica sólida y un modelo matemático. OOP ha desarrollado muchas heurísticas, pero aún no tiene formalismo completo.
Steven A. Lowe
18

Si, si tengo

Me he mantenido callado sobre este tema durante mucho tiempo; Es hora de hablar.

  • ¿Alguien ha tratado de aplicar este concepto al diseño de objetos?

Sí. Llevo más de 20 años trabajando en la formalización de la normalización de objetos (y, por lo tanto, en la teoría subyacente orientada a objetos).

  • ¿Cómo hizo?

Al darse cuenta de que los datos y el código son intercambiables, al menos en teoría. Esto significa que los principios de normalización y las operaciones relacionales pueden aplicarse tanto al código como a los datos.

  • Como resulto?

Hasta ahora funcionó bastante bien: creo que las ideas obtenidas han sido las "armas secretas" de mis habilidades de diseño, análisis y refactorización.

No he dicho nada al respecto públicamente antes de esto porque pensé que eventualmente tendría tiempo para terminar la investigación, y producir las herramientas implícitas, yo mismo.

Pero he llegado a la conclusión de que con todo lo que sucede en mi vida que es más importante, más divertido y / o más rentable, no voy a tener tiempo para terminar la investigación yo mismo. Siempre. También existe la posibilidad significativa de que simplemente no tenga los fundamentos teóricos de CS necesarios para completar el trabajo solo.

He preguntado en la universidad local acerca de patrocinar a un candidato a doctorado o dos si desean abordar la causa, pero lamentablemente nuestra universidad local no enseña una base adecuada en la programación de la semántica del lenguaje.

Ha habido algunas investigaciones interesantes en esta área, pero todas, que yo sepa, no han alcanzado el objetivo. O supone incorrectamente que, debido a que la normalización proviene de un fondo relacional, no se aplica a los modelos orientados a objetos, o supone que la normalización solo se aplica a los datos definidos por los objetos. Sin embargo, hay algunos proyectos muy interesantes para fallar ...

Las cosas realmente interesantes suceden cuando aplicas la normalización al código, lo que diría que es la base de toda refactorización .

Así que ahora estoy pensando que lo mejor que se puede hacer es correr la voz, tal vez pidiendo hablar en DevDays 2011 en DC, y descubrir si hay una comunidad tan entusiasmada con estas cosas como yo.

Aquí hay un adelanto: la normalización es el proceso de hacer algo mínimo y no redundante. El principio Don't Repeat Yourself (DRY) de la programación orientada a objetos es, por lo tanto, una clara manifestación de los objetivos de la normalización. Creo que puedo demostrar que todos los conocidos principios de diseño / programación / refactorización orientados a objetos son la consecuencia lógica de la normalización de objetos. Creo que también puedo mostrar que hay cosas más interesantes que se pueden hacer con los sistemas en Forma Normal de Objetos (ONF) que la simple refactorización.

Steven A. Lowe
fuente
1
¿Algún documento más sustancial?
Steve314
44
¡PUBLICAR! (¿por favor?) (¿bonita por favor?) Si necesita ayuda para obtener documentos en orden, etc. contácteme.
AJ01
1
@ChrisCirefice: siéntete feliz, envíame un correo electrónico a [email protected]
Steven A. Lowe
1
@ChrisCirefice: solo para su información, el candidato a doctorado se mudó a una universidad diferente; proyecto en segundo plano (pero estoy escribiendo un libro sobre DDD)
Steven A. Lowe
1
Hola @ StevenA. Lowe Estoy realmente interesado en tu investigación. He encontrado un documento bastante corto encriptado.google.com/… ¿Tiene algún comentario al respecto? Por cierto, ¿tal vez puedas ilustrar tu idea un poco más escribiendo primero una publicación de blog? Gracias.
Wei Qiu
5

Esto comenzó como un comentario sobre la excelente respuesta de Rein Henrich , pero se hizo demasiado largo ...

La normalización se aplica a los datos relacionales. Se utiliza para evitar la duplicación, lo que facilita asegurar la integridad de los datos, ya que cada dato se almacena en un solo lugar. Normaliza una base de datos al encontrar violaciones de un formulario normalizado y corregirlas.

La programación orientada a objetos se aplica a las operaciones con datos. Está destinado a agrupar formas de manipular datos juntos. Puede aplicar técnicas similares a las clases para eliminar métodos duplicados, quizás observando de qué datos manipula o depende la operación. Por ejemplo, 1NF en una perspectiva OO no tendría ninguna operación duplicada dentro de una clase. 3NF podría corresponder con una buena estructura de herencia en la que el código de uso común está en una superclase. Estoy seguro de que también podría encontrar un lugar para la inyección de dependencia. Alcanza un mejor diseño (aunque aún no se han descubierto formas normales) al encontrar violaciones de los buenos principios de diseño y refactorización.

Realmente no hay ningún método algorítmico para alcanzar un buen diseño en ninguno de los dos mundos. Como señala Rein Hendrichs, hay muchos principios que pueden identificar problemas potenciales (también conocidos como olores de código). Los patrones de diseño y las mejores prácticas son algunas de las formas en que las personas han tratado de abordarlos. El desarrollo impulsado por pruebas intenta encontrarlos temprano ejercitando el código como lo hará externamente. Al igual que en el desarrollo de bases de datos, la mejor solución se encuentra con la experiencia y el análisis.

Michael K
fuente
2
Mi opinión es que los principios son una declaración sobre la forma ideal de resolver un conjunto de tensiones. Los patrones son una heurística para aplicar un principio. Los principios IOW son una declaración sobre la estructura del espacio del problema y los patrones son reglas para transformarlos en un espacio de solución. Pero soy un poco loco por las matemáticas, así que me parece raro :)
Rein Henrichs
2

Un enfoque muy bueno para diseñar objetos de modelo de negocio que es similar a la normalización es el modelado en color UML .

Es una estrategia de diseño encontrada por Peter Coad que ayuda a abstraer los objetos del modelo de negocio.

Desafortunadamente el libro - Modelado Java en color con UML: Componentes y procesos empresariales - está agotado y solo puede comprar los usados.

Hay un par de artículos en Internet sobre esta técnica.

Si está familiarizado con el diseño relacional, encontrará que el modelado UML en color es útil para guiarlo:

Lucas Machado
fuente
0

¿Ha investigado el uso de anotaciones Java ORM en su código al crear su diagrama de clase? Hibernate generaría la base de datos una vez que finalice la etapa de modelado. El diagrama en este ejemplo es solo un visor del código.

UML_GURU
fuente
0

Las referencias a objetos o punteros son similares a las claves foráneas. Eso es tan profundo como estoy dispuesto a pensar en esto. :)

En realidad pensaré más profundo. Si modela sus objetos con 0 duplicación de datos y podría "consultar" sus objetos y realizar actualizaciones basadas en conjuntos en ellos, no habría desconexión. De hecho, PUEDES hacer esto haciendo una biblioteca de consumidor de objetos. Microsoft ya ha pensado en esto, pero tomó la dirección de hacer que la sintaxis LINQ basada en conjuntos sea parte de C # sobre una "biblioteca de consultas".

jojo
fuente