Re[12]: Entity Framework за! и против!
От: Vladek Россия Github
Дата: 18.08.14 17:45
Оценка:
Здравствуйте, gandjustas, Вы писали:

V>>Это зона ответственности репозитория, а снаружи ничего не известно и потому одну реализацию легко заменить на другую.

G>Это в теории.

G>А на практике разберем пример, что все посты хранятся в текстовом файле. Для простоты будем считать, что все оценки и комменты также хранятся вместе с постами (чтобы согласованность изменений была).

G>И вот нам надо получить самые популярные посты за день. Для этого надо "всего лишь" пробежать по всем постам и посчитать оценку за день. Когда постов станет пару тысяч это перестанет работать.
G>Чтобы оно работало надо будет написать фоновый процесс, который при добавлении оценки будет считать оценку за день и обновлять список лучших постов.

Нет, надо выбросить код с текстовыми файлами и написать код, работающий с БД.

G>Замена репозитария будет настолько маленькой проблемой, что её в этом контексте можно не рассматривать.


Что изменится в контракте репозитория? Правильно, ничего.

G>Получается для того, чтобы "одну реализацию легко заменить на другую" нужно чтобы все стореджи поддерживали как минимум SQL, а это значит что они будут поддерживать Linq.

G>Тогда зачем прятать Linq внутри репозитария, если можно IQueryable<T> отдать потребителю, а специфичные вещи спрятать в комбинаторы.

Потому что внешний мир обходится IEnumerable, отфильтрованным, отсортированным и порезанным на странички. ORM отдают IQueryable внешнему миру, а мы не пишем ORM, мы пишем репозиторий. Для нашего ORM весь внешний мир ограничивается репозиторием. А это значит, пользователь репозитория не имеет доступа к объектам ORM, которые маппятся из БД — нечего выдавать в качестве T для IQueryable<T>.

V>>Вместо строк можно использовать другие объекты, никаких ограничивающих правил нет.

G>Какие например? Ну чтобы получить тот же уровень контроля компилятором, как в случае Linq.

PostSortingMethod.

V>>Тогда сортировка просто не будет работать как надо, программист быстро укажет то, что нужно, и всё заработает.

G>Программист может и не заметить. И тестер может не заметить. Ты же понимаешь что это хуже, чем проверка компилятором, что все параметры переданы.

Ещё программить может привести IQueryable к IEnumerable, отсортировать и в цикле выбрать нужные объекты. Компилятор с радостью это скомпилирует. И оно даже будет работать быстро некоторое время.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.