«Normalisation» orientée objet


28

Dans la programmation de base de données, il existe une technique appelée «normalisation» que vous faites pour les données que vous souhaitez stocker.

Quelqu'un a-t-il essayé d'appliquer ce concept à la conception d'objets? Comment as-tu? Comment ça s'est passé?

Edit: Pour étendre / clarifier, la normalisation de la base de données est plus qu'un ensemble de principes pour réduire la redondance. Il y a en fait des étapes et des étapes que vous traversez et au moins des mesures moyennement objectives qui vous indiquent à quelle étape vous vous trouvez. La conception d'objet a ses propres principes, et il y a le concept de l'odorat, mais est-il possible de faire quelque chose de similaire qui vous dirait que vous êtes au format XX0,1,2 ... etc ... et les méthodes pour passer au niveau le plus "normalisé" suivant?


2
... Vous voulez dire que nous avons essayé de ne pas avoir plusieurs variables redondantes dans nos classes, et de ne pas avoir plusieurs classes redondantes dans nos projets? Cela fonctionnerait-il même?
Satanicpuppy

2
@Steven A. Lowe: Où étiez-vous il y a cinq ans lorsque je décidais d'un sujet de ma thèse de maîtrise? ;)

Je ne l'ai jamais essayé (c'est pourquoi je réponds en tant que commentaire) mais je suppose que vous pouvez le faire avec un cache de données partagées, des pointeurs d'objets vers les données partagées en cache et une sorte de mécanisme d'injection de dépendance pointer les pointeurs des instances vers les données partagées ...
FrustratedWithFormsDesigner

Une question très intéressante, je la trouve.

5
Je pense que Refactoring couvre à peu près cela à la fois pour la POO et d'autres méthodologies de programmation.
JohnFx

Réponses:


27

Bien que certaines des tensions sous-jacentes qui conduisent à la normalisation de la base de données ne soient pas présentes dans un système OO, certaines d'entre elles le sont. Celles-ci ont donné naissance à des modèles et principes de conception OO qui sont à certains égards analogues à la normalisation, du moins dans la mesure où les systèmes OO sont analogues aux bases de données relationnelles. Par exemple:

En d'autres termes, quelqu'un a-t-il essayé d'appliquer des techniques de normalisation de base de données à la POO? Non, car la POO a déjà des solutions aux problèmes partagés que la normalisation résout pour les bases de données relationnelles.


+1 Beaucoup mieux que ce que j'essayais d'écrire!
Michael K

Ce sont des principes, pas des techniques cependant. Comment utiliseriez-vous ces principes pour «normaliser» la conception d'un objet?
Edward Strange

3
La normalisation des bases de données est également un principe. Dans les deux cas, il existe des modèles (ou techniques) qui décrivent comment prendre des décisions concernant ces principes. Regardez les livres de Martin Fowler sur le refactoring et les livres de Kent Beck sur les modèles, par exemple. La différence est que la conception de la base de données est un domaine plus petit et moins complexe, plus facile à quantifier et à transformer en un simple ensemble de règles.
Rein Henrichs

5
@Crazy Eddie: Comment faites-vous avec une base de données relationnelle? Vous recherchez les cas où un principal est violé et vous le corrigez. Si vous voyez une classe avec trois jobs, vous la réécrivez en trois classes. Si vous cherchez un verbe comme "normaliser" peut-être son "refactor" bien que ce ne soit pas aussi spécifique, il est inclusif.
Jeremy

1
@Rein: la conception de la base de données n'est ni plus petite ni moins complexe que la POO, mais elle avait un énorme avantage: elle a commencé avec une base théorique solide et un modèle mathématique. La POO a évolué beaucoup d'heuristiques, mais n'a pas encore de formalisme complet.
Steven A. Lowe

18

Oui, oui j'ai

Je suis resté silencieux sur ce sujet depuis longtemps; il est temps de parler.

  • Quelqu'un a-t-il essayé d'appliquer ce concept à la conception d'objets?

Oui. Je travaille sur la formalisation de la normalisation des objets (et donc la théorie sous-jacente orientée objet) depuis plus de 20 ans.

  • Comment as-tu?

En réalisant que les données et le code sont interchangeables, du moins en théorie. Cela signifie que les principes de normalisation et les opérations relationnelles peuvent s'appliquer aussi bien au code qu'aux données.

  • Comment ça s'est passé?

Jusqu'à présent, cela a plutôt bien fonctionné - je pense que les connaissances acquises ont été les «armes secrètes» de mes capacités de conception, d'analyse et de refactorisation.

Je n'ai rien dit à ce sujet publiquement avant cela parce que je pensais que finalement j'aurais le temps de terminer la recherche - et de produire les outils impliqués - moi-même.

Mais je suis arrivé à la conclusion qu'avec tout ce qui se passe dans ma vie qui est plus important, plus amusant et / ou plus rentable, je ne vais pas avoir le temps de terminer la recherche moi-même. Déjà. Il y a aussi la possibilité importante que je n'ai tout simplement pas la base théorique CS requise pour terminer le travail seul.

Je me suis renseigné auprès de l'université locale sur le parrainage d'un ou de deux doctorants s'ils aimeraient défendre la cause, mais hélas, notre université locale n'enseigne pas une base adéquate en programmation de sémantique linguistique.

Il y a eu des recherches intéressantes dans ce domaine, mais toutes - à ma connaissance - n'ont pas été à la hauteur. Soit il suppose à tort que la normalisation provenant d'un arrière-plan relationnel ne s'applique pas aux modèles orientés objet, soit elle suppose que la normalisation ne s'applique qu'aux données définies par les objets. Il existe cependant des projets presque intéressants très intéressants ...

Le truc vraiment intéressant se produit lorsque vous appliquez la normalisation au code - ce qui, selon moi, est le fondement de toute refactorisation .

Alors maintenant, je pense que la meilleure chose à faire est de faire passer le mot, peut-être en demandant à parler aux DevDays 2011 à DC, et à savoir s'il existe une communauté aussi excitée par ce genre de choses que moi.

Voici un aperçu: la normalisation est le processus de création de quelque chose de minimal et de non redondant. Le principe Don't Repeat Yourself (DRY) de la programmation orientée objet est donc une manifestation claire des objectifs de normalisation. Je pense pouvoir montrer que tous les principes bien connus de conception / programmation / refactorisation orientée objet sont la conséquence logique de la normalisation des objets. Je pense que je peux aussi montrer qu'il y a des choses plus intéressantes qui peuvent être faites avec des systèmes en forme normale d'objet (ONF) que le simple refactoring.


1
Des documents plus substantiels?
Steve314

4
PUBLIER! (s'il vous plaît?) (assez s'il vous plaît?) Si vous avez besoin d'aide pour mettre en ordre les documents, etc. contactez-moi.
AJ01

1
@ChrisCirefice: soyez heureux de me tirer un e-mail à steven.lowe@nov8r.com
Steven A. Lowe

1
@ChrisCirefice: juste pour info, le candidat au doctorat est passé à une autre université; projet sur back-burner à nouveau (mais j'écris un livre sur DDD)
Steven A. Lowe

1
Salut @ StevenA.Lowe Je suis vraiment intéressé par vos recherches. J'ai trouvé un document assez court encrypted.google.com/… avez-vous un commentaire à ce sujet? BTW, peut-être pouvez-vous illustrer un peu plus votre idée en écrivant d'abord un blog? Merci.
Wei Qiu

5

Cela a commencé comme un commentaire sur l' excellente réponse de Rein Henrich , mais est devenu trop long ...

La normalisation s'applique aux données relationnelles. Il est utilisé pour éviter la duplication, ce qui facilite la garantie de l'intégrité des données puisque chaque donnée est stockée en un seul endroit. Vous normalisez une base de données en détectant les violations d'un formulaire normalisé et en les corrigeant.

La programmation orientée objet s'applique aux opérations sur les données. Il est destiné à regrouper les moyens de manipuler les données ensemble. Vous pouvez appliquer des techniques similaires aux classes pour éliminer les méthodes en double, peut-être en examinant les données dont l'opération manipule ou dépend. Par exemple, 1NF dans une perspective OO n'aurait aucune opération en double au sein d'une classe. 3NF peut correspondre à une bonne structure d'héritage dans laquelle le code couramment utilisé se trouve dans une superclasse. Je suis sûr que vous pourriez également trouver un endroit pour l'injection de dépendance. Vous atteignez un meilleur design (bien que rien de semblable aux formes normales n'ait encore été découvert) en trouvant des violations des bons principes de design et en refactorisant.

Il n'y a pas vraiment de méthodes algorithmiques pour parvenir à une bonne conception dans l'un ou l'autre monde. Comme le souligne Rein Hendrichs, il existe de nombreux principes qui peuvent identifier les problèmes potentiels (alias. Le code sent). Les modèles de conception et les meilleures pratiques sont quelques-unes des façons dont les gens ont essayé de les résoudre. Le développement piloté par les tests tente de les trouver tôt en exerçant le code tel qu'il sera en externe. Tout comme dans le développement de bases de données, la meilleure solution réside dans l'expérience et l'analyse.


2
À mon avis, les principes sont une déclaration sur la manière idéale de résoudre un ensemble de tensions. Les modèles sont une heuristique pour l'application d'un principe. Les principes IOW sont une déclaration sur la structure de l'espace du problème et les modèles sont des règles pour les transformer en un espace de solution. Mais je suis en quelque sorte un fou des mathématiques, donc je pense que bizarre :)
Rein Henrichs

2

La modélisation UML en couleur est une très bonne approche pour concevoir des objets de modèle métier qui est similaire à la normalisation .

Il s'agit d'une stratégie de conception trouvée par Peter Coad qui permet d'abstraire les objets du modèle commercial.

Malheureusement, le livre - Java Modeling In Color With UML: Enterprise Components and Process - est épuisé et vous ne pouvez en acheter que des d'occasion.

Il existe quelques articles sur Internet sur cette technique.

Si vous êtes familier avec la conception relationnelle, vous trouverez la modélisation UML en couleur utile pour vous guider:


0

Avez-vous étudié l'utilisation des annotations Java ORM dans votre code lors de la création de votre diagramme de classes? Hibernate générerait la base de données une fois l'étape de modélisation terminée. Dans cet exemple, le diagramme n'est qu'un visualiseur du code.


0

Les références d'objets ou les pointeurs sont similaires aux clés étrangères. C'est aussi profond que je suis prêt à y penser. :)

En fait, je vais réfléchir plus profondément. Si vous modélisez vos objets avec une duplication de données nulle et que vous pouviez "interroger" vos objets et effectuer des mises à jour basées sur des ensembles sur eux, il n'y aurait pas de déconnexion. En fait, vous POUVEZ le faire en créant une bibliothèque de consommateurs d'objets. Microsoft a déjà pensé à cela, mais est allé dans le sens d'intégrer la syntaxe LINQ basée sur un ensemble de C # sur une "bibliothèque de requêtes".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.