У меня была очень стимулирующая и интересная дискуссия с коллегой об ORM и его плюсах и минусах. На мой взгляд, ORM полезен только в самых редких случаях. По крайней мере, по моему опыту.
Но я не хочу перечислять свои собственные аргументы в настоящее время. Поэтому я спрашиваю вас, что вы думаете об ORM? Какие плюсы и минусы?
Ответы:
Существует довольно большой и разнообразный набор концептуальных и технических трудностей при попытке приблизиться к реляционной базе данных с объектно-ориентированной точки зрения. Эти трудности все вместе известны как объектно-реляционное несоответствие импеданса, и связанная статья Википедии чрезвычайно информативна. В статье упоминается немало, и я не вижу здесь никакого разумного способа их описания. Просто чтобы дать вам общее представление, они каталогизированы как:
Я думаю, что если вы потратите время на прочтение статьи, вы поймете, что тот факт, что ORM иногда называют анти-паттерном, на самом деле неизбежен. Эти два домена настолько различны, что любой подход к тому, чтобы рассматривать один как другой, по умолчанию является анти-паттерном, в том смысле, что анти-паттерн является шаблоном, который идет вразрез с философией домена.
Но я не думаю, что этот термин должен применяться ко всему, что по сути действует как мост между двумя совершенно разными областями. Маркировка паттерна как анти-паттерна имеет смысл только внутри его области. Так что вопрос, является ли это анти-паттерном или нет, не имеет значения.
Но полезно ли это? Да, ORM - один из самых полезных антишаблонов. Вы поймете почему, только если вы окажетесь в практической ситуации, когда вам придется менять базы данных в проекте. Или даже обновить до другой версии той же базы данных. ORM - это одна из тех вещей, которую вы полностью понимаете, только когда они вам действительно нужны.
Конечно, как и все полезное, ORM очень подвержен злоупотреблениям. Если вы думаете, что это как-то заменяет необходимость знать все о базе данных, над которой вы работаете, то она вернется и укусит вас. Жесткий.
Наконец, позвольте мне бесстыдно добавить еще один из моих ответов на тему «Соответствует ли шаблон ActiveRecord принципам разработки SOLID?» вопрос, который для меня является гораздо более актуальным вопросом, чем «это анти-паттерн».
источник
Это все равно, что спросить «Является ли силовая дрель анти-паттерном?». ORM заслужили хорошее место в моем наборе инструментов, уменьшив мой шаблонный код, и я все еще могу использовать собственный SQL, если это необходимо. Так что, если это анти-паттерн, против какого паттерна он идет?
Мой ответ - нет, есть много зрелых ORM, которые делают вашу жизнь намного проще и делают ваш код более понятным. Это в любом случае означает, что вам не нужно понимать SQL, скорее наоборот.
источник
Я бы не стал называть что-то «анти-паттерном», который Мартин Фаулер впервые назвал паттерном, и с тех пор он применяется почти во всех современных языках программирования. (См. Статью в Википедии об ActiveRecord .)
Хороший ORM может привести к гораздо меньшему количеству кода (и гораздо меньшему количеству повторений) в проекте, и ничто не так сильно связано с ошибками, как количество исходного кода.
ORM, как правило, предназначены для обработки наиболее распространенных вариантов использования для работы с базами данных. Сложные запросы все еще могут быть написаны явно. Но я бы настоятельно рекомендовал писать явные запросы для каждого взаимодействия с базой данных. В большинстве случаев это пустая трата времени.
источник
Использование ORM вместо изучения SQL - довольно плохая идея. Если вы точно не знаете тип генерируемого SQL, если вы не понимаете проблемы N + 1 и как их оптимизировать, то это определенно принесет больше вреда, чем пользы. Я чувствую, однако, что я гораздо более продуктивен, используя ORM. Я предпочитаю Rails ActiveRecord, который не пытается притвориться, что базы данных нет, и не мешает вам, если вам просто нужно написать SQL. Я действительно беспокоюсь, что некоторые люди могут доверять идиомам, которые они видят слишком глубоко, без глубокого понимания того, что они делают.
источник
Мой опыт: я использую NHibernate с Linq2NHibernate.
Плюсы:
Минусы:
Я скажу, что это не соответствует обещанию, на которое изначально надеются большинство людей. Я бы не стал обвинять кого-то в том, что он говорит, что это анти-шаблон. В моем случае я обнаружил, что мне все еще необходимо выполнить интеграционные тесты с базой данных SQLite, чтобы убедиться, что мои запросы Linq2NHibernate действительно работают. Так что на самом деле, если вы в любом случае проводите интеграционные тесты с реальной реляционной базой данных, то этот вид устраняет проблему с «волшебными строками».
Если бы я начал новый проект, я не уверен, использовал бы я ORM или нет. Возможно, но я не могу точно сказать, что вы должны. Я бы сказал, что это похоже на разницу между выбором C ++ или Java / .NET для вашего проекта: нужна ли вам гибкость при работе на более низком уровне или вы предпочитаете работать на более высоком уровне и (предположительно) будете более продуктивный? Обычный ответ - работать на таком высоком уровне, на котором вы можете сойти с рук . Обычно это означает использование ORM.
источник
Сила ORM заключается в том, что он позволяет моделировать поведение приложения, используя объектно-ориентированные методы. В тщательно спроектированном мире у вас есть один уровень приложения, в котором язык бизнеса точно соответствует языку команды разработчиков. ORM является активатором этого, если ORM используется разумно.
Слабость в том, что количество людей, которые действительно, действительно, получают объектно-ориентированное программирование, довольно мало. Многие люди пишут спагетти и фрикадельки, с сильно связанными объектами, которые не имеют своего собственного поведения, а фактическое поведение заканчивается в отвратительных 8000-строчных классах «Service» и «Manager», и этот код часто настолько запутан, что все боятся изменить его, потому что они не могут понять, какими будут побочные эффекты.
Кроме того, многие люди не получают реляционную модель. ORM не поможет им получить это, и это не поможет им, абстрагируя реляционную модель. Это просто позволяет вам сосредоточиться на своем доменном уровне на раннем этапе и получить это прямо перед тем, как вы начнете слишком беспокоиться о дизайне базы данных. При правильном применении с помощью разумных инструментов миграции схем ORM может помочь вам предотвратить накопление долгов кода.
Я создал приложения, в которых ORM делал код приложения простым, читаемым и тестируемым, и имел приемлемую производительность. Я также поддерживал приложения, в которых шаблон использовался неправильно, а код был сложным, непроверяемым, медленным и хрупким; оказывается, что сама ORM не имеет к этому никакого отношения, за исключением того, что вместо написания плохого кода, который плохо моделирует область приложения, устаревшая команда инженеров написала плохой код, который плохо смоделировал область приложения И плохой код уровня обслуживания, который пренебрег всем значение, которое их ORM может предоставить им.
ORM не сделают вас умнее, но в руках правильного разработчика могут привести к более удобному и качественному коду.
источник
Возможно, ответ заключается в обратном ответе на ваш вопрос: является ли хорошей идеей хранение данных вашего приложения в чем-то ином, чем реляционная база данных? Какие проблемы вы устраняете, и какие другие проблемы вы поднимаете? Можете ли вы жить без возможности легко перекрестно ссылаться на свои данные (объединения) или быстро отфильтровывать нужные записи по нескольким критериям? Вам не нужна надежная поддержка транзакций (если у вашей альтернативы ее нет)? Не всем приложениям требуется постоянно согласованное и полное хранилище данных.
Я думаю, что настоящим анти-паттерном здесь может быть использование реляционной БД, когда она вам не нужна. Если вам нужен один, то вам нужен ORM, и это определенно не анти-паттерн.
источник
ORM - это инструмент. Как и все инструменты, при правильном использовании они работают довольно хорошо. При неправильном использовании необходим больший молоток и немного клейкой ленты.
В случае текущего проекта, над которым я работаю, он будет поддерживаться не разработчиками (точнее, инженерами-механиками), и поэтому он должен быть простым и легким для понимания. Пройдет несколько лет, прежде чем у этой группы будет бюджет для найма разработчиков (при условии, что следующий президент не упразднит вовлеченное агентство), поэтому возможности нашего будущего обслуживания являются основным фактором в наших соображениях.
источник