Об'єктно-орієнтована «нормалізація»


28

У програмуванні баз даних існує техніка, що називається "нормалізація", яку ви робите для даних, які ви хочете зберігати.

Хтось намагався застосувати цю концепцію до дизайну об'єктів? Як ви? Як це вийшло?

Редагування: Щоб розширити / уточнити, нормалізація бази даних - це більше, ніж набір принципів для зменшення надмірності. Насправді є етапи та етапи, якими ви проходите, і, принаймні, помірно об'єктивні заходи, які говорять вам, на якому етапі ви перебуваєте. Дизайн об’єкта має свої принципи, і є концепція запаху, але чи є спосіб зробити щось подібне, яке б вам сказало що ви знаходитесь у XX-form0,1,2 ... і т. д ... і методи переходу до наступного найбільш "нормалізованого" рівня?


2
... Ви маєте на увазі, чи намагалися ми не мати декількох зайвих змінних у наших класах і не мати декількох зайвих класів у наших проектах? Це б навіть спрацювало?
Satanicpuppy

2
@Steven A. Lowe: Де ти був п’ять років тому, коли я вирішував тему моєї магістерської роботи? ;)

Я ніколи не пробував цього (саме тому я відповідаю як коментар), але я здогадуюсь, що ви могли це зробити за допомогою кешу спільних даних, покажчиків від об'єктів до кешованих спільних даних та якимось механізмом введення залежності щоб вказати на вказівники екземплярів на спільні дані ...
FrustratedWithFormsDesigner

Дуже цікаве питання, я знаходжу це.

5
Я думаю, що Refactoring в значній мірі охоплює як OOP, так і інші методології програмування.
JohnFx

Відповіді:


27

Хоча деякі основні напруги, які зумовлюють нормалізацію бази даних, відсутні в системі ОО, деякі з них є. Вони породили схеми та принципи проектування ОО, які певним чином аналогічні нормалізації, принаймні тому, що системи OO є аналогами реляційних баз даних. Наприклад:

Іншими словами, хтось намагався застосувати методи нормалізації бази даних до ООП? Ні, оскільки OOP вже має рішення для спільних проблем, які нормалізація вирішує для реляційних баз даних.


+1 Набагато краще, ніж те, що я намагався написати!
Майкл К

Це принципи, а не техніка. Як би ви використовували ці принципи, щоб "нормалізувати" дизайн об'єкта?
Edward Strange

3
Нормалізація баз даних також є принципом. В обох випадках існують зразки (або методи), які описують, як приймати рішення щодо цих принципів. Наприклад, погляньте на книги Мартіна Фаулера про рефакторинг та книги Кента Бека. Різниця полягає в тому, що дизайн бази даних - це менший, менш складний домен, який легше оцінити і перетворити на простий набір правил.
Рейн Генріхс

5
@ Crazy Eddie: Як це зробити з реляційною базою даних? Ви шукаєте випадки, коли принципал порушено, і виправляєте його. Якщо ви бачите клас із трьома завданнями, ви переписуєте його як три класи. Якщо ви шукаєте дієслово на кшталт "нормалізувати", можливо, його "рефактор", хоча це не настільки конкретно, воно включно.
Джеремі

1
@Rein: розробка баз даних не є ні меншою, ні менш складною, ніж OOP, але вона мала одну величезну перевагу: вона почалася з міцної теоретичної основи та математичної моделі. OOP розвинула багато евристики, але все ще не має повного формалізму.
Стівен А. Лоу

18

Так, так, маю

Я довго мовчав на цю тему; пора говорити.

  • Хтось намагався застосувати цю концепцію до дизайну об'єктів?

Так. Я працюю над формалізацією нормалізації об'єктів (і, отже, основної об'єктно-орієнтованої теорії) більше 20 років.

  • Як ви?

Зрозумівши, що дані та код є взаємозамінними, принаймні теоретично. Це означає, що принципи нормалізації та відносних операцій можуть застосовуватися як до коду, так і до даних.

  • Як це вийшло?

Поки що це спрацювало досить добре - я вважаю, що отримані відомості були "таємною зброєю" моїх здібностей проектування, аналізу та реконструкції.

Я до цього нічого публічно не казав, тому що вважав, що врешті-решт я встигну закінчити дослідження - і виготовити інструменти, що маються на увазі - сам.

Але я дійшов висновку, що з усім іншим, що відбувається в моєму житті, що є більш важливим, веселішим та / або більш вигідним, я не збираюсь сам закінчити дослідження. Колись. Також є значна можливість, що я просто не маю необхідної теоретичної основи CS, щоб завершити роботу самостійно.

Я поцікавився в місцевому університеті щодо спонсорування кандидата або двох кандидатів наук, чи хочуть вони взятися за справу, але, на жаль, наш місцевий університет не викладає належної основи в семантиці мови програмування.

У цій галузі було проведено декілька цікавих досліджень, але все це - про що я знаю - не вийшло. Або неправильно передбачається, що оскільки нормалізація виходить із реляційного фону, вона не застосовується до об'єктно-орієнтованих моделей, або передбачається, що нормалізація стосується лише даних, визначених об'єктами. Однак є декілька дуже цікавих проектів, які є майже міс ...

Дійсно цікаві речі трапляються, коли ви застосовуєте нормалізацію до коду - що я можу стверджувати, є основою всього рефакторингу .

Тож зараз я думаю, що найкраще зробити - це зрозуміти слово, можливо, попросивши виступити на DevDays 2011 в DC і дізнатись, чи є така громада, яка хвилюється цим матеріалом, як і я.

Ось підлий погляд: Нормалізація - це процес створення чогось мінімального та непотрібного. Тому принцип повторення себе (DRY) об'єктно-орієнтованого програмування є чітким проявом цілей нормалізації. Я вважаю, що можу показати, що всі відомі об'єктно-орієнтовані принципи проектування / програмування / рефакторингу є логічним наслідком нормалізації об'єкта. Я думаю, що я можу також показати, що є більш цікаві речі, які можна зробити із системами в Object Normal Form (ONF), ніж просто рефакторинг.


1
Ще якісь суттєві документи?
Steve314

4
ПУБЛІКУВАТИ! (будь ласка?) (досить, будь ласка?) Якщо вам потрібна допомога з отриманням документів на замовлення тощо, зв'яжіться зі мною.
AJ01

1
@ChrisCirefice: з радістю, знімайте мені електронний лист на адресу steven.lowe@nov8r.com
Стівен А. Лоу

1
@ChrisCirefice: просто FYI, кандидат доктора наук перейшов до іншого університету; проект знову на пальниках (але я пишу книгу про DDD)
Стівен А. Лоу

1
Привіт @ StevenA.Lowe Мені дуже цікаво ваше дослідження. Я знайшов досить короткий документ encrypted.google.com/… чи є у вас коментар до цього? До речі, можливо ви можете трохи проілюструвати свою ідею, спочатку написавши допис у блозі? Спасибі.
Вей Циу

5

Це почалося як коментар до відмінної відповіді Рейна Генріха , але отримав занадто довго ...

Нормалізація застосовується до реляційних даних. Він використовується для уникнення дублювання, що полегшує забезпечення цілісності даних, оскільки кожна дата зберігається лише в одному місці. Ви нормалізуєте базу даних, виявляючи порушення нормалізованої форми та виправляючи їх.

Об'єктно-орієнтоване програмування застосовується до операцій над даними. Він призначений для групування способів маніпулювання даними разом. Ви можете застосувати подібні методи до класів, щоб усунути дублікати методів, можливо, переглянувши, якими даними маніпулює та залежить від операції. Наприклад, 1NF в перспективі OO не буде робити жодних повторних операцій у класі. 3NF може відповідати хорошій структурі успадкування, в якій широко використовуваний код знаходиться в надкласі. Я впевнений, що ви також можете знайти місце для ін'єкції залежності. Ви досягаєте кращого дизайну (хоча нічого подібного до звичайних форм досі не виявлено), виявивши порушення належних принципів дизайну та рефакторинг.

Не існує насправді алгоритмічних методів, щоб досягти гарного дизайну в будь-якому світі. Як зазначає Рейн Хендріхс, існує багато принципів, які дозволяють виявити потенційні проблеми (ака. Код пахне). Шаблони дизайну та найкращі практики - це деякі із способів, як люди намагалися вирішити їх. Тестова розробка намагається знайти їх рано, використовуючи код, як це буде зовні. Як і в розробці бази даних, найкраще рішення знайдеться з досвідом та аналізом.


2
На мою думку, принципи - це твердження про ідеальний спосіб вирішити набір напруженості. Шаблони є евристичними для застосування принципу. Принципи IOW - це твердження про структуру простору проблеми, а шаблони - це правила їх перетворення в простір рішення. Але я щось на зразок математичного горіха, тому я думаю, що це дивно :)
Рейн Генріхс

2

Дуже хороший підхід до проектування об'єктів бізнес-моделі, подібний до нормалізації, - це UML-моделювання в кольорі .

Це стратегія дизайну, знайдена Пітером Коадом, яка допомагає абстрагувати об'єкти бізнес-моделі.

На жаль, книга - моделювання Java в кольорі за допомогою UML: Enterprise Components and Process - розпродана, і ви можете придбати лише використані.

В Інтернеті є кілька статей про цю техніку.

Якщо ви знайомі з реляційним дизайном, ви знайдете UML-моделювання в кольорі корисним для наведення:


0

Ви досліджували використання анотацій Java ORM у своєму коді під час створення діаграми класів? Hibernate створить базу даних після завершення етапу моделювання. Діаграма є в цьому прикладі лише переглядачем коду.


0

Посилання на об'єкти або вказівники схожі на зовнішні ключі. Це так глибоко, як я готовий подумати над цим. :)

Насправді я подумаю глибше. Якщо ви змоделюєте свої об'єкти з дублюванням даних 0 і зможете "запитувати" ваші об'єкти та виконувати встановлені на них оновлення, відключення не буде. Насправді ви МОЖЕТЕ це зробити, створивши об’єктову бібліотеку споживачів. Майкрософт вже не зважав на це, але пішов у напрямку, щоб зробити синтаксис LINQ на основі набору частиною C # над "бібліотекою запитів".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.