Объектно-ориентированная «нормализация»

28

В программировании баз данных есть метод под названием «нормализация», который вы делаете с данными, которые хотите сохранить.

Кто-нибудь пытался применить эту концепцию к объектному дизайну? Как ты? Как это получилось?

Редактировать: чтобы расширить / уточнить, нормализация базы данных - это больше, чем набор принципов для уменьшения избыточности. На самом деле есть этапы и этапы, которые вы проходите, и, по крайней мере, умеренно объективные измерения, которые говорят вам, на каком этапе вы находитесь. У дизайна объекта есть свои собственные принципы, и есть понятие обоняния, но есть ли способ сделать что-то подобное, что бы сказать вам что вы в XX-форме0,1,2 ... и т.д. ... и методы для перехода на следующий самый "нормализованный" уровень?

Эдвард Стрендж
источник
2
... Вы имеете в виду, мы пытались не иметь несколько избыточных переменных в наших классах и не иметь несколько избыточных классов в наших проектах? Будет ли это работать?
Satanicpuppy
2
@ Стивен А. Лоу: Где вы были пять лет назад, когда я выбирал тему моей магистерской диссертации? ;)
Я никогда не пробовал (именно поэтому я отвечаю в качестве комментария), но я предполагаю, что вы могли бы сделать это с помощью кэша общих данных, указателей от объектов на кэшированные общие данные и своего рода механизма внедрения зависимостей. указывать указатели экземпляров на общие данные ...
FrustratedWithFormsDesigner
Очень интересный вопрос, я нахожу это.
5
Я думаю, что рефакторинг в значительной степени охватывает это как для ООП, так и для других методологий программирования.
JohnFx

Ответы:

27

Хотя некоторые из основных напряжений, которые приводят к нормализации базы данных, отсутствуют в ОО-системе, некоторые из них есть. Они породили шаблоны и принципы проектирования ОО, которые в некотором роде аналогичны нормализации, по крайней мере, поскольку ОО-системы аналогичны реляционным базам данных. Например:

Другими словами, кто-нибудь пытался применить методы нормализации базы данных к ООП? Нет, потому что ООП уже имеет решения для общих проблем, которые нормализация решает для реляционных баз данных.

Рейн Хенрикс
источник
+1 Гораздо лучше, чем я пытался написать!
Майкл К
Это принципы, а не методы, хотя. Как бы вы использовали эти принципы, чтобы «нормализовать» дизайн объекта?
Эдвард Стрендж,
3
Нормализация базы данных также является принципом. В обоих случаях существуют шаблоны (или методы), которые описывают, как принимать решения относительно этих принципов. Посмотрите, например, книги Мартина Фаулера по рефакторингу и книги Кента Бека по шаблонам. Разница в том, что дизайн базы данных - это меньший, менее сложный домен, который легче количественно определить и превратить в простой набор правил.
Рейн Хенрикс
5
@Crazy Eddie: Как ты делаешь это с реляционной базой данных? Вы ищите случаи нарушения принципала и исправляете его. Если вы видите класс с тремя заданиями, вы переписываете его как три класса. Если вы ищете глагол типа «нормализовать», возможно, его «рефакторинг», хотя это не так уж и конкретно, оно включено.
Джереми
1
@Rein: дизайн базы данных не меньше и не сложнее, чем ООП, но у него было одно огромное преимущество: он начинался с прочной теоретической основы и математической модели. ООП развил много эвристики, но все еще не имеет полного формализма.
Стивен А. Лоу
18

Да да у меня есть

Я долго молчал на эту тему; пришло время высказаться.

  • Кто-нибудь пытался применить эту концепцию к объектному дизайну?

Да. Я работаю над формализацией объектной нормализации (и, следовательно, основополагающей объектно-ориентированной теории) более 20 лет.

  • Как ты?

Понимая, что данные и код взаимозаменяемы, по крайней мере, в теории. Это означает, что принципы нормализации и реляционных операций могут применяться как к коду, так и к данным.

  • Как это получилось?

До сих пор все получалось довольно неплохо - я считаю, что полученные знания стали «секретным оружием» моих способностей проектирования, анализа и рефакторинга.

Я ничего об этом не говорил публично до этого, потому что решил, что со временем у меня будет время, чтобы закончить исследование - и самостоятельно изготовить предполагаемые инструменты.

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

Я спросил в местном университете о спонсировании кандидата или двух кандидатов наук, если они хотели бы заняться этим, но, увы, наш местный университет не преподает адекватную основу в семантике языка программирования.

Было проведено несколько интересных исследований в этой области, но все, что мне известно, не дало результатов. Либо он неверно предполагает, что, поскольку нормализация происходит из реляционного фона, он не применяется к объектно-ориентированным моделям, либо он предполагает, что нормализация применяется только к данным, определенным объектами. Однако есть несколько очень интересных проектов.

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

Так что теперь я думаю, что лучшее, что можно сделать, - это высказать слово, возможно, попросив выступить на DevDays 2011 в Вашингтоне, и выяснить, есть ли сообщество, столь же взволнованное этим материалом, как и я.

Вот краткий обзор: нормализация - это процесс создания чего-то минимального и не лишнего. Следовательно, принцип «не повторяйся» (СУХОЙ) объектно-ориентированного программирования является четким проявлением целей нормализации. Я верю, что могу показать, что все известные принципы объектно-ориентированного проектирования / программирования / рефакторинга являются логическим следствием нормализации объекта. Я думаю, что я также могу показать, что есть более интересные вещи, которые можно сделать с системами в Object Normal Form (ONF), чем просто рефакторинг.

Стивен А. Лоу
источник
1
Есть более содержательные документы?
Steve314
4
ПУБЛИКОВАТЬ! (пожалуйста?) (довольно пожалуйста?) Если вам нужна помощь в приведении документов в порядок и т. д., свяжитесь со мной.
AJ01
1
@ChrisCirefice: будьте счастливы, напишите мне письмо на steven.lowe@nov8r.com
Стивен А. Лоу
1
@ChrisCirefice: только FYI, кандидат PhD перешел в другой университет; Снова проект на задний план (но я пишу книгу о DDD)
Стивен А. Лоу
1
Привет @ StevenA.Lowe Я действительно заинтересован в ваших исследованиях. Я нашел довольно короткую статью encrypted.google.com/… Есть ли у вас какие-либо комментарии по этому поводу? Кстати, может быть, вы можете немного проиллюстрировать свою идею, написав сначала пост в блоге? Спасибо.
Вэй Цю
5

Это началось как комментарий к превосходному ответу Рейн Хенрикс , но получил слишком долго ...

Нормализация применяется к реляционным данным. Он используется, чтобы избежать дублирования, что облегчает обеспечение целостности данных, поскольку каждый элемент данных хранится только в одном месте. Вы нормализуете базу данных, находя нарушения нормализованной формы и исправляя их.

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

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

Майкл К
источник
2
Я считаю, что принципы - это утверждение об идеальном способе преодоления напряженности. Шаблоны - это эвристика для применения принципа. Принципы IOW - это утверждение о структуре пространства проблем, а шаблоны - правила их преобразования в пространство решений. Но я вроде математика, поэтому я думаю, что странно :)
Рейн Хенрикс
2

Очень хороший подход к проектированию объектов бизнес-модели, который похож на нормализацию, - UML Modeling in Color .

Питер Коад разработал стратегию проектирования, которая помогает абстрагировать объекты бизнес-модели.

К сожалению, книга « Цветовое моделирование Java с UML: корпоративные компоненты и процесс» распродана, и вы можете купить только использованные.

В интернете есть пара статей об этой технике.

Если вы знакомы с реляционным дизайном, вы найдете UML Modeling in Color полезным для вас:

Лукас Мачадо
источник
0

Вы пытались использовать Java-аннотации ORM в своем коде при создании диаграммы классов? Hibernate сгенерирует базу данных после завершения этапа моделирования. Диаграмма в этом примере является только средством просмотра кода.

UML_GURU
источник
0

Ссылки на объекты или указатели похожи на внешние ключи. Это так глубоко, как я готов думать об этом. :)

На самом деле я буду думать глубже. Если вы смоделируете свои объекты с дублированием данных 0 и сможете «запросить» ваши объекты и выполнить для них обновления на основе набора, отсоединения не будет. Фактически, вы МОЖЕТЕ сделать это, создав библиотеку объектных потребителей. Microsoft уже думала об этом, но пошла в направлении включения синтаксиса LINQ на основе множеств в C # вместо «библиотеки запросов».

Jojo
источник