Является ли написание собственного уровня доступа к данным / отображения данных «хорошей» идеей?

20

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

У нас есть устаревшее приложение (ASP.NET + SQL Server), где, к сожалению, уровень данных и бизнес-уровень объединены. Система не особенно сложна с точки зрения доступа к данным. Он считывает данные из большой группы (35-40) взаимосвязанных таблиц, манипулирует ими в памяти и сохраняет их в некоторых других таблицах в сводном формате. Теперь у нас есть возможность провести некоторый рефакторинг, и мы ищем подходящие технологии для разделения и правильной структуры нашего доступа к данным.

Какие бы технологии мы ни выбрали, мы бы хотели:

  • есть объекты POCO в нашей доменной модели, которые являются невежественными
  • иметь уровень абстракции, позволяющий нам проводить модульное тестирование объектов нашей доменной модели на основе макета источника данных

Очевидно, что по этому поводу уже есть много вещей, таких как Patterns & Frameworks и т. Д.

Лично я настаиваю на использовании EF в сочетании с модулем ADO.NET Unit Testable Repository Generator / POCO Entity Generator . Он удовлетворяет всем нашим требованиям, может быть легко встроен в шаблон Repo / UnitOfWork, и наша структура БД достаточно развита (уже подверглась рефакторингу), так что мы не будем вносить ежедневные изменения в модель.

Однако другие в группе предлагают полностью / с нуля создать / развернуть наш собственный DAL. (Пользовательские DataMappers, DataContexts, Репозиторий, Интерфейсы повсюду, Избыток внедрения зависимостей для создания конкретных объектов, Пользовательский перевод LINQ-в-основополагающих запросов, Пользовательские реализации кэширования, Пользовательские реализации FetchPlan ...) список можно продолжать и быть откровенным я как безумие

Некоторые аргументы были выдвинуты: «Ну, по крайней мере, мы будем контролировать наш собственный код» или «О, я использовал L2S / EF в предыдущем проекте, и это были только головные боли». (Хотя я раньше использовал и в Production, и обнаружил, что любые проблемы встречаются редко и очень легко решаются)

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

Эойн Кэмпбелл
источник
4
Есть несколько хороших (лучше, если вы спросите меня, но я не начну эту священную войну ... о, подождите) альтернатив EF, где вы сможете "контролировать код", таких как NHibernate.
Брук
@Brook Как это решает вопрос « Является ли написание вашего собственного уровня доступа к данным / отображения данных« хорошей »идеей?
MickyD

Ответы:

22

Оба аргумента против существующих ORM недействительны:

«Ну, по крайней мере, мы будем контролировать наш собственный код»

Почему бы не написать свой собственный язык? Ваша собственная структура? Ваша собственная операционная система? И чтобы быть уверенным, что вы все контролируете, также неплохо создать собственное оборудование.

«О, я использовал L2S / EF в предыдущем проекте, и это были только головные боли»

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


Итак, вы должны написать свой собственный ORM?

Я бы не предложил это. Уже есть ORM профессионального уровня, а это значит, что вы должны писать свои собственные, только если:

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

Конечно, ничто не запрещает вам писать свой собственный ORM просто из любопытства, чтобы изучать вещи. Но вы не должны делать это на коммерческом проекте.


Смотрите также пункты 2–3 моего ответа на вопрос «Изобретая велосипед» и НЕ сожалея об этом. Вы можете видеть, что различные причины для изобретения колеса здесь не применимы.

Арсений Мурзенко
источник
10
1. Управлять критически важными частями системы часто является хорошей идеей. Иногда это может включать в себя написание вашей собственной структуры вместо использования устоявшейся и популярной библиотеки. 2. Иногда популярные инструменты перепроданы или перегружены.
Quant_Dev
3
@quant_dev: если вы пишете программное обеспечение, которое будет управлять ядерной установкой или космическим кораблем, вы правы. Но у меня есть некоторые сомнения, что это так. Кстати, я не уверен, что мы можем назвать EF «устоявшейся и популярной библиотекой».
Арсений Мурзенко
3
Существует хорошо известная библиотека с открытым исходным кодом для оценки производных, называемая Quantlib. Но каждый банк, о котором я знаю, пишет свои собственные библиотеки ценообразования, потому что это является основой их бизнеса. Не должен быть космическим кораблем ...
quant_dev
2
Также проще нанять новых сотрудников, которые имеют опыт работы с используемой вами стандартной платформой, чем обучать каждого нанятого вами человека работе с этой платформой.
HLGEM
2
Почему бы не написать свой собственный язык? Ваша собственная структура? Ваша собственная операционная система? И чтобы быть уверенным, что вы все контролируете, это также хорошая идея - создать собственное оборудование. Вот что Apple сказала :-)
Konamiman
19

Используйте Entity Framework для всех обычных элементов CRUD (от 80 до 95 процентов кода) и используйте пользовательский код доступа к данным для любого оставшегося кода, который необходимо оптимизировать. Это должно удовлетворить интересы тех, кто утверждает, что у вас недостаточно контроля.

Роберт Харви
источник
ура за это. Да, вот где я пытаюсь это подтолкнуть.
Эойн Кэмпбелл
Тем более, что EF - это технология, к которой движется M $. А linq делает жизнь разработчика намного проще.
SoylentGray
Это в значительной степени путь, который успешно завершил StackOverflow, не так ли? Linq-To-SQL для всех обычных вещей и пользовательских вещей, которые превратились в библиотеку Dapper для нужных бит.
Carson63000
5

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

Суть в том, что это может иметь смысл, только при правильных условиях. Эти условия обычно включают в себя:

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

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

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

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

  1. степень, в которой точка зрения кажется точной, хорошо подтвержденной фактами и т. д., и
  2. степень, в которой точка кажется применимой к рассматриваемому проекту.

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

Редактировать:

Если бы я хотел быть особенно противным (или «образовательным» - трудно сказать разницу в этом случае), я бы попросил каждого из вас попытаться составить оценку общих усилий по разработке как с использованием существующего ORM / DAL, так и разработки твой собственный. Хотя это всего лишь предположение, мое непосредственное предположение состоит в том, что большинство людей с грандиозными планами прокручивать свои собственные не потрудились бы изменить свои оценки - к тому времени, когда они пришли к оценке общих усилий, которая была даже удаленно закончена (и реалистично), они поняли бы, что не могли даже приблизиться к конкуренции с использованием существующего кода. В то же время это

Редактировать 2: (вроде как по предложению @ CmdKey): Хотя это явно не указано, я предполагаю, что оценка будет неявно включать оценку риска. В частности, оценка времени обычно должна включать числа в стиле PERT:

  1. Наилучшая оценка того, что можно сделать быстрее, если все пойдет правильно.
  2. «Нормальная» оценка - сколько времени вы ожидаете.
  3. Наихудший пример оценки - самое продолжительное, что может случиться, если все пойдет не так.

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

Джерри Гроб
источник
Спасибо за это Джерри. (этот ответ нуждается в большем количестве голосов :-))
Eoin Campbell
@ Джерри отлично оценил стоимость, в конце концов, это то, о чем заботится руководство, однако вы должны включить меру риска в ваш «образовательный» запрос. Неспособность оценить риски, связанные с проектом, обычно делает проекты с наименьшей ставкой более дорогими, чем другие варианты.
CdMnky
@CdMnky: Хороший вопрос. Редактирование соответственно.
Джерри Коффин
3

Обычно никогда не бывает хорошей идеей изобретать велосипед, и это обычно является признаком технического невежества («я больше ничего не знаю и не хочу учиться») или высокомерия («Х глуп, я могу напиши свой собственный инструмент через две недели! "); Есть зрелые инструменты, которые могут делать вещи намного лучше, чем то, что некоторые среднестатистические разработчики могут взломать вместе за несколько недель.

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

Уэйн Молина
источник
3

Я был в проекте, который отклонил существующие инструменты Java ORM для написания своих собственных, из-за некоторой «критической» функции, отсутствующей в Hibernate. Это было ошибкой в ​​несколько миллионов долларов, и стоимость увеличивается с каждым днем. Они все еще не имеют полной поддержки объектных отношений. Таким образом, в дополнение ко всему времени, затрачиваемому на создание и поддержку фреймворка, они тратят часы на написание кода, который можно написать за считанные минуты с использованием Hibernate, или во многих случаях его вообще не нужно было бы писать.

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

Кевин Клайн
источник
1

Код, который вы должны написать, - это код, который вы должны поддерживать. Время , затраченное на поддержание кода ОРМ время , потраченное не поддерживать приложение. Если ORM не даст вам какое-то стратегическое преимущество, то это не то, что будет приносить деньги для бизнеса, так что это просто накладные расходы. Ваша компания предпочла бы потратить деньги на накладные расходы или улучшить продукт, приносящий доход? Если это для внутреннего приложения, то это может быть не проблема, но вы все еще увеличиваете объем кода, который необходимо будет написать, протестировать и документировать.

TMN
источник
0

Я бы сказал, что развертывание собственного ORM - ПЛОХАЯ идея - если только у вас нет очень-очень веской причины для этого (кстати, те, на которые вы ссылались, недостаточно хороши :)

Однажды я допустил ошибку, когда другие убедили меня не использовать ORM, и я могу сказать вам, что написание всего DAL само по себе замедлило нас, и вместо того, чтобы реализовывать функции, которые имели значение для бизнеса, мы тратили время на DAL (это намного больше работы чем это выглядит).

Новый EF выглядит довольно неплохо, но если вам нужен больший контроль - я бы посмотрел на микро-ORM, например: Drapper http://code.google.com/p/dapper-dot-net/ или PetaPOCO http : //www.toptensoftware.com/petapoco/

Вы также можете смешивать и сочетать - используйте EF для большей части материала и Drapper для некоторой тонкой настройки.

Во всяком случае это только мой 2с;)

славянин
источник