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?
Réponses:
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.
la source
Oui, oui j'ai
Je suis resté silencieux sur ce sujet depuis longtemps; il est temps de parler.
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.
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.
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.
la source
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.
la source
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:
la source
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.
la source
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".
la source