Мне действительно нужно увидеть честные и вдумчивые дискуссии о достоинствах принятой в настоящее время парадигмы проектирования корпоративных приложений .
Я не уверен, что объекты сущностей должны существовать.
Под объектами сущностей я подразумеваю типичные вещи, которые мы обычно создаем для наших приложений, такие как «Человек», «Учетная запись», «Заказ» и т. Д.
Моя текущая философия дизайна такова:
- Весь доступ к базе данных должен осуществляться через хранимые процедуры.
- Всякий раз, когда вам нужны данные, вызывайте хранимую процедуру и перебирайте SqlDataReader или строки в DataTable.
(Примечание: я также создавал корпоративные приложения с Java EE, люди, использующие Java, пожалуйста, замените эквивалент в моих примерах .NET)
Я не против ОО. Я пишу много классов для разных целей, но не для сущностей. Я признаю, что большая часть классов, которые я пишу, являются статическими вспомогательными классами.
Я не строю игрушки. Я говорю о больших транзакционных приложениях с большим объемом, развернутых на нескольких машинах. Веб-приложения, службы Windows, веб-службы, взаимодействие b2b, что угодно.
Я использовал OR Mappers. Я написал несколько. Я использовал стек Java EE, CSLA и несколько других эквивалентов. Я не только использовал их, но и активно разрабатывал и поддерживал эти приложения в производственных средах.
Я пришел к боевому проверенному выводу , что объекты сущности получает на нашем пути, и наша жизнь была бы так гораздо проще и без них.
Рассмотрим этот простой пример: вы получаете звонок в службу поддержки о том, что определенная страница в вашем приложении работает некорректно, возможно, одно из полей не сохраняется, как должно быть. В моей модели разработчик, которому поручено найти проблему, открывает ровно 3 файла . ASPX, ASPX.CS и файл SQL с хранимой процедурой. Проблема, которая может быть отсутствующим параметром при вызове хранимой процедуры, требует нескольких минут. Но с любой моделью сущности вы неизменно запускаете отладчик, начинаете пошагово выполнять код, и в итоге вы можете открыть 15-20 файлов в Visual Studio. К тому времени, когда вы перейдете в конец стопки, вы забудете, с чего начали. Мы можем держать в голове только определенное количество вещей одновременно. Программное обеспечение невероятно сложное без добавления ненужных слоев.
Сложность разработки и устранение неполадок - это лишь одна сторона моей проблемы.
Теперь поговорим о масштабируемости.
Понимают ли разработчики, что каждый раз, когда они пишут или модифицируют любой код, который взаимодействует с базой данных, им необходимо проводить тщательный анализ точного воздействия на базу данных? И не только копия для разработки, я имею в виду имитацию производства, поэтому вы можете видеть, что дополнительный столбец, который вам теперь нужен для вашего объекта, только что сделал недействительным текущий план запроса, и отчет, который запускался за 1 секунду, теперь займет 2 минуты, просто потому что вы добавили один столбец в список выбора? И оказывается, что индекс, который вам теперь нужен, настолько велик, что администратору базы данных придется изменить физическую структуру ваших файлов?
Если вы позволите людям уйти слишком далеко от физического хранилища данных с помощью абстракции, они создадут хаос для приложения, которое необходимо масштабировать.
Я не фанатик. Я могу быть уверен, что ошибаюсь, и, возможно, ошибаюсь, поскольку существует такой сильный толчок к Linq to Sql, ADO.NET EF, Hibernate, Java EE и т. Д. Пожалуйста, подумайте над своими ответами, если мне что-то не хватает, я действительно хочу знать, что это такое, и почему я должен изменить свое мышление.
[Редактировать]
Похоже, этот вопрос внезапно снова стал активным, поэтому теперь, когда у нас есть новая функция комментариев, я прокомментировал непосредственно несколько ответов. Спасибо за ответы, думаю, это здоровое обсуждение.
Я, наверное, должен был быть более ясным, что говорю о корпоративных приложениях. Я действительно не могу комментировать, скажем, игру, запущенную на чьем-то настольном компьютере, или мобильное приложение.
Одна вещь, которую я должен поставить здесь вверху в ответ на несколько похожих ответов: ортогональность и разделение проблем часто упоминаются как причины для перехода на entity / ORM. Для меня хранимые процедуры - лучший пример разделения задач, о котором я могу думать. Если вы запрещаете любой другой доступ к базе данных, кроме как через хранимые процедуры, вы теоретически можете перепроектировать всю свою модель данных и не нарушать какой-либо код, пока вы поддерживаете входные и выходные данные хранимых процедур. Они являются прекрасным примером программирования по контракту (при условии, что вы избегаете «select *» и документируете наборы результатов).
Спросите кого-нибудь, кто долгое время работал в отрасли и работал с долгоживущими приложениями: сколько уровней приложений и пользовательского интерфейса появилось и исчезло, пока существовала база данных? Насколько сложно настроить и реорганизовать базу данных, когда существует 4 или 5 различных уровней персистентности, генерирующих SQL для доступа к данным? Вы ничего не можете изменить! ORM или любой код, генерирующий SQL, блокируют вашу базу данных на камне .