ORM - это анти-паттерн? [закрыто]

58

У меня была очень стимулирующая и интересная дискуссия с коллегой об ORM и его плюсах и минусах. На мой взгляд, ORM полезен только в самых редких случаях. По крайней мере, по моему опыту.

Но я не хочу перечислять свои собственные аргументы в настоящее время. Поэтому я спрашиваю вас, что вы думаете об ORM? Какие плюсы и минусы?

derphil
источник
3
Вы читали это: seldo.com/weblog/2011/08/11/orm_is_an_antipattern ?
FrustratedWithFormsDesigner
2
Да. Если у вас нет универсального приложения CRUD, которое ничего не делает с базой данных, в этом случае вам не следует использовать реляционную базу данных.
Райнос
1
@derphil: Вы можете сделать его менее широким, иначе это будет закрыто. Если вы считаете, что это анти-шаблон, возможно, укажите причину, а затем спросите, в каких ситуациях этот анти-шаблон подходит (но он все еще может быть слишком широким).
FrustratedWithFormsDesigner
2
@derphil, есть много контраргументов в комментариях к этому сообщению в блоге, вы их читали?
Петер Тёрёк
2
И только еще одно доказательство того , почему вам не нужно ОРМ: medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

Ответы:

83

Существует довольно большой и разнообразный набор концептуальных и технических трудностей при попытке приблизиться к реляционной базе данных с объектно-ориентированной точки зрения. Эти трудности все вместе известны как объектно-реляционное несоответствие импеданса, и связанная статья Википедии чрезвычайно информативна. В статье упоминается немало, и я не вижу здесь никакого разумного способа их описания. Просто чтобы дать вам общее представление, они каталогизированы как:

  • Несоответствия
    • Объектно-ориентированные концепции
    • Различия типов данных
    • Структурные и целостные различия
    • Манипулятивные различия
    • Транзакционные различия
  • Устранение несоответствия импеданса
    • минимизация
    • Альтернативные архитектуры
    • компенсация
  • раздор
  • Философские различия

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

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

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

Конечно, как и все полезное, ORM очень подвержен злоупотреблениям. Если вы думаете, что это как-то заменяет необходимость знать все о базе данных, над которой вы работаете, то она вернется и укусит вас. Жесткий.

Наконец, позвольте мне бесстыдно добавить еще один из моих ответов на тему «Соответствует ли шаблон ActiveRecord принципам разработки SOLID?» вопрос, который для меня является гораздо более актуальным вопросом, чем «это анти-паттерн».

Яннис
источник
5
+1 за работу во фразе "несоответствие импеданса". Модные слова для гиков, но они мне тоже нравятся!
hardmath
Полностью согласен ... проверьте, что эта ссылка так хорошо объяснена: seldo.com/weblog/2011/08/11/orm_is_an_antipattern
sandino
42

Это все равно, что спросить «Является ли силовая дрель анти-паттерном?». ORM заслужили хорошее место в моем наборе инструментов, уменьшив мой шаблонный код, и я все еще могу использовать собственный SQL, если это необходимо. Так что, если это анти-паттерн, против какого паттерна он идет?

Мой ответ - нет, есть много зрелых ORM, которые делают вашу жизнь намного проще и делают ваш код более понятным. Это в любом случае означает, что вам не нужно понимать SQL, скорее наоборот.

Otávio Décio
источник
11
+1 Я тоже думаю, что это очень полезно, есть изучение кривой. Но это очень хорошо, не нужно вручную заполнять pojos и т. Д.
NimChimpsky
18

Я бы не стал называть что-то «анти-паттерном», который Мартин Фаулер впервые назвал паттерном, и с тех пор он применяется почти во всех современных языках программирования. (См. Статью в Википедии об ActiveRecord .)

Хороший ORM может привести к гораздо меньшему количеству кода (и гораздо меньшему количеству повторений) в проекте, и ничто не так сильно связано с ошибками, как количество исходного кода.

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

Натан Лонг
источник
12
«Я бы не хотел идти против аргумента властью»
Райнос
3
@Raynos: Вы имеете в виду ... вы говорите ... Фаулер, возможно, был ... НЕПРАВИЛЬНО?!?! шокируй и ересь! Богохульство !! : P;)
РазочарованныйWithFormsDesigner
9
@Raynos - Возможно, авторитет не лучший аргумент, но ОП сказал "по моему опыту". По сути, это обращение к личному авторитету, поэтому я считаю разумным противостоять обращению к авторитету и консенсусу. Кроме того, сам термин «анти-паттерн» относится к мнениям. Я привел примеры того, что думают другие люди.
Натан Лонг
3
@NathanLong Я только что указал, что популярность и правильность ортогональны.
Raynos
1
FWIW Data Mapper, вероятно, является шаблоном, который наиболее точно соответствует ORM. ActiveRecord - это другой шаблон, хотя, безусловно, связанный.
JasonTrue
11

Использование ORM вместо изучения SQL - довольно плохая идея. Если вы точно не знаете тип генерируемого SQL, если вы не понимаете проблемы N + 1 и как их оптимизировать, то это определенно принесет больше вреда, чем пользы. Я чувствую, однако, что я гораздо более продуктивен, используя ORM. Я предпочитаю Rails ActiveRecord, который не пытается притвориться, что базы данных нет, и не мешает вам, если вам просто нужно написать SQL. Я действительно беспокоюсь, что некоторые люди могут доверять идиомам, которые они видят слишком глубоко, без глубокого понимания того, что они делают.

Джереми
источник
11

Мой опыт: я использую NHibernate с Linq2NHibernate.

Плюсы:

  • Он избавляется от «Волшебных струн» или, по крайней мере, предлагает единственное в своем роде место для их размещения.
  • Это позволяет мне работать в парадигме ОО все время
  • Код легче читать
  • Код, построенный сверху, легче изменить
  • Это позволяет вам обменять вашу фактическую реляционную базу данных без обслуживания 2 отдельных репозиториев (редко делается, но это одно большое преимущество, если вам это нужно).

Минусы:

  • Код сложнее написать , потому что
  • Это не достаточная абстракция - вы все равно должны быть хорошо знакомы с тем, что он делает в фоновом режиме.

Я скажу, что это не соответствует обещанию, на которое изначально надеются большинство людей. Я бы не стал обвинять кого-то в том, что он говорит, что это анти-шаблон. В моем случае я обнаружил, что мне все еще необходимо выполнить интеграционные тесты с базой данных SQLite, чтобы убедиться, что мои запросы Linq2NHibernate действительно работают. Так что на самом деле, если вы в любом случае проводите интеграционные тесты с реальной реляционной базой данных, то этот вид устраняет проблему с «волшебными строками».

Если бы я начал новый проект, я не уверен, использовал бы я ORM или нет. Возможно, но я не могу точно сказать, что вы должны. Я бы сказал, что это похоже на разницу между выбором C ++ или Java / .NET для вашего проекта: нужна ли вам гибкость при работе на более низком уровне или вы предпочитаете работать на более высоком уровне и (предположительно) будете более продуктивный? Обычный ответ - работать на таком высоком уровне, на котором вы можете сойти с рук . Обычно это означает использование ORM.

Скотт Уитлок
источник
6

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

Слабость в том, что количество людей, которые действительно, действительно, получают объектно-ориентированное программирование, довольно мало. Многие люди пишут спагетти и фрикадельки, с сильно связанными объектами, которые не имеют своего собственного поведения, а фактическое поведение заканчивается в отвратительных 8000-строчных классах «Service» и «Manager», и этот код часто настолько запутан, что все боятся изменить его, потому что они не могут понять, какими будут побочные эффекты.

Кроме того, многие люди не получают реляционную модель. ORM не поможет им получить это, и это не поможет им, абстрагируя реляционную модель. Это просто позволяет вам сосредоточиться на своем доменном уровне на раннем этапе и получить это прямо перед тем, как вы начнете слишком беспокоиться о дизайне базы данных. При правильном применении с помощью разумных инструментов миграции схем ORM может помочь вам предотвратить накопление долгов кода.

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

ORM не сделают вас умнее, но в руках правильного разработчика могут привести к более удобному и качественному коду.

JasonTrue
источник
Я думаю, это сбивает с толку использование ORM в качестве шаблона для доступа к БД и ORM в качестве причудливого генератора кода для облегчения и улучшения доступа к БД.
gbjbaanb
Я не уверен, что вы подразумеваете под этим. Ваш комментарий не имеет большого смысла для меня.
JasonTrue
В том смысле, что ORM делает отличный способ получить доступ к БД, потратив на это массу тяжелой работы, но если вы используете его в качестве шаблона проектирования, притворяясь, что БД - это коллекция объектов, она начинает падать. Что я и думал.
gbjbaanb
Я не думаю, что когда-либо выступал за использование ORM, притворяясь, что у вас есть хранилище магических объектов, которое не требует от вас понимания работы базы данных. Я сказал прямо противоположное: если вы хорошо понимаете объектно-ориентированное программирование и то, как работают базы данных, ORM может помочь вам создать более поддерживаемый код.
JasonTrue
5

Возможно, ответ заключается в обратном ответе на ваш вопрос: является ли хорошей идеей хранение данных вашего приложения в чем-то ином, чем реляционная база данных? Какие проблемы вы устраняете, и какие другие проблемы вы поднимаете? Можете ли вы жить без возможности легко перекрестно ссылаться на свои данные (объединения) или быстро отфильтровывать нужные записи по нескольким критериям? Вам не нужна надежная поддержка транзакций (если у вашей альтернативы ее нет)? Не всем приложениям требуется постоянно согласованное и полное хранилище данных.

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

TMN
источник
1
Хотя я согласен, что использование реляционной базы данных, если она вам не нужна, плохая идея, что если вы используете ее, вам нужен ORM, это просто смешно!
HLGEM
1
Хм, тогда как вы собираетесь получать данные из базы данных и из нее? Где-то что-то должно будет сопоставить ваши объекты с реляционной структурой и воссоздать их, когда они будут считаны из базы данных. Даже если вы пишете запросы вручную и копируете данные в наборы результатов и из них, вы выполняете ORM.
TMN
1
Использование хранимых процедур (единственный приемлемый способ вставить любые финансовые данные по причинам внутреннего контроля) для выполнения всех манипуляций с базой данных - это не ORM. Я никогда не видел никакого значения для ORM для того, кто действительно знает SQL. Также я никогда не работал над системой (и я работаю с очень сложными приложениями Enterprise), которая сильно зависела от ORM, они просто недостаточно хороши, когда то, что вы делаете, сложно.
HLGEM
6
@HLGEM: А как насчет данных, которые вы получаете из базы данных? Когда вы запрашиваете реляционную базу данных, вы не отображаете результаты на объекты? По моему опыту, есть два типа проектов, которые используют реляционные базы данных: те, которые используют сторонние ORM, и те, которые включают свои собственные плохо построенные ORM.
Carson63000
2
+1 Карсон. Вы используете какой-то ORM, несмотря ни на что, если вы просто не вернете необработанные DataSets и добавите их в свой код (самое вопиющее нарушение из всех IMHO), поскольку вам всегда придется сопоставлять результаты этой хранимой процедуры с классами, что и является ОРМ для вас.
Уэйн Молина
4

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

В случае текущего проекта, над которым я работаю, он будет поддерживаться не разработчиками (точнее, инженерами-механиками), и поэтому он должен быть простым и легким для понимания. Пройдет несколько лет, прежде чем у этой группы будет бюджет для найма разработчиков (при условии, что следующий президент не упразднит вовлеченное агентство), поэтому возможности нашего будущего обслуживания являются основным фактором в наших соображениях.

Tangurena
источник