Автор оригинала: atv
Почему выводы касательно использования ORM распространены на ООП? Как будто в "тупом отображении данных из базы на страницу" нет места ООП.
ORM и ООП тесно связаны - ORM как раз-таки находится на стыке функцинального и объектного программирования, фактически, это мост между ними, и являются очень хорошим местом, где можно невзначай "прострелить себе ногу".
Большинство веб-сайтов ни что иное, как интерфейс к базе данных. По классической схеме ООП, магазин, трогующий карандашами, бубликами и яхтами должен, был бы выглядеть так: классы Покупатель, Заказ, Товар; классы Карандаш, Бублик, Яхта наследуют от Товара. Все здорово - берем вычитываем в книжке Фаулера про шаблон Active Record и храним все объекты в базе. Но это работает только в том случае, если все классы в модели известны заранее, а в случае с магазином это не так.
Между карандашами, бубликами и яхтами нет ничего общего кроме идентификатора, поэтому класс Товар сделать можно, но кроме технических полей он ничего полезного содержать не будет. Как добвлять\удалять потомки класса Товар? Попытака генерить классы кодогенератором и компилировать их после того, как пользователь добавит их в интерфейсе CMS обречена - пользователь может не знать английского языка, принципов ООП, и вообще он может в любой момент удалить поля товара, так что расчитывать на неизменную структуру класса не стоит. Классы в мейнстримовых языках не могут изменяться, поэтому на арену выходят всякие DataSet'ы, RecordSet'ы, ассоциативные массивы. В этом месте вы будете вынуждены пересмореть классическую схему и заменить классы-товары на ассоциативные массивы, которые и хранить в базе.
В ООП классы содержат ссылки друг на друга. Чтобы получить все товары, заказанные Покупателем вам надо путем переходов по графу объектов перебрать часть графа, пока не будет найдено то, что нужно. Я не буду утомлять объяснениями, почему навигационная система классов в реальной жизни проигрывает запросной системе SQL.
Вместо классов - массивы, вместо навигации - запросы. Признаем очевидное: вы эмулируете с помощью ООП-языка фишки функциональных языков. Даже бизнес-логика, если она есть, работает не над объектом, а над ассоциативным массивом. А если это все равно эмуляция, не проще ли добавить ФП в уже существующий ООП-язык? Так оно и проиcходит: забегали люди с лопатами и начали хоронить кто С++, кто Java. "Нас не интересует судьба Java - если Java умрет, мы перейдем на Scala." - говорят они. Все больше IDE поддерживат Ruby и Groovy; всеми любимый Miсrosoft вводит элементы ФП в С# 3.0 и спонсирует разработку F#; в PHP проснулись и робко заговорили о лямбдах и замыканиях; отчаявшишиь расшевелишь Sun, энтузиасты хачат Java. Растущее количество процессоров прямо подталивает к рапараллеливаню, как следствие к ФП. Люди устали от старых, дряхлых языков, и гиганты индустрии неохотно вынуждены реагировать на это.
Первые популярные ORM появились давно - тогда попытка подогнать данные под объекты казалась естественной. Испытание временем показало: иногда это работает, иногда нет. Сейчас ситуация меняется - чем больше ФП проникет в мейнстрим, тем меньше приходится извращаться, но чтобы успешно использовать это (или наоборот - избегать ошибок) требуется изменить сознание и начать думать иначе. Например, использоать ROM вместо ORM, интересующиеся могут поискать в сети на тему Microsoft LINQ to SQL или зайти на форум rsdn.ru - там эти темы часто обсасываются.