powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Зацените WTF
19 сообщений из 19, страница 1 из 1
Зацените WTF
    #40015054
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся сегодня в проекте:
Код: c#
1.
2.
3.
4.
public interface IRepository<T> where T : class
{
    DbSet<T> DbSet { get; }
}



PS. Сейчас при копипасте в Code Lense увидел, что на эту жесть почти полсотни references и мне что-то сразу погрустнело...
...
Рейтинг: 0 / 0
Зацените WTF
    #40015376
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

А чего, вполне себе классика.

По сути DbContext реализует данный интерфейс из коробки.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015405
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkthat,

А чего, вполне себе классика.

По сути DbContext реализует данный интерфейс из коробки.

Это классика "Leak of abstraction" и "Ghost object".
...
Рейтинг: 0 / 0
Зацените WTF
    #40015407
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Это классика "Leak of abstraction" и "Ghost object".


Нуачо, вполне себе рабочее решение для типовых проектов :)

Интереснее рассмотреть кейс, в котором подобное решение принесёт боль.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015442
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Интереснее рассмотреть кейс, в котором подобное решение принесёт боль.

The generic repository is just a lazy anti-pattern

The Generic Repository Is An Anti-Pattern

А уж более "Generic" чем то что выше уже даже и вообразить сложно, разве что сделать совсем уж так:
Код: c#
1.
2.
3.
4.
public interface IRepository
{
    BlaBlaBlaDataContext DataContext {get;}
}



Боль в том, что (не)люди разломали всю систему логгирования ASP.NET (заменив её полностью на свою собственную, которая почему-то все сообщения пишет с уровнем Info) и никто полгода это не хочет чинить (надо ведь новые фичи пилить, а не приводить в порядок то что есть). Но зато в проекте при этом тонны вот такого хлама, типа вот такого "репозитория" и около полусотни каких-то ерундовых методов-расширений в одну строчку к типу System.Object (привет интеллисенсу).

И, да. На сегодня у нас нет ни одного юнит-теста.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015460
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зато, наверное, продаётся
...
Рейтинг: 0 / 0
Зацените WTF
    #40015466
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Зато, наверное, продаётся

А энтерпрайзная разработка давно превратилась в отрасль шарлатанства. "Когти жабы от вашей болезни не помогли, но вы еще нам заплатите и мы вас вылечим порошком из бивня дракона". Истратив кучу денег бедолага-больной посылает шарлатанов нахрен, но только для того, чтобы уйти от них к точно таким же. А в это время те, кто ушел от вторых приходит за лечением к первым. На том вся отрасль и держится.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015471
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люблю магию. Будут вакансии - зови )
...
Рейтинг: 0 / 0
Зацените WTF
    #40015475
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Люблю магию. Будут вакансии - зови )

Тут плохая магия. Магия вуду.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015598
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любой литературе по проектированию пишут, что абсолютное и слепое следование всем принципам и паттернам будет имеет обратный эффект, а достичь максимального соответствия этим требования просто невозможно.
Этап, когда я плевался на какой бы то ни было код, лично у меня, давно прошел. Потому, что абсолютно всегда можно сделать лучше чем было, а в процессе легко сделать хуже, переусложнив и т.д.
тут главное пережить переходный период, максимализм, абсолютизм, нигилизм и прочие варианты девиантного поведения :)

p.s. пока одни пишут идеальный код, другие его продают.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015666
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
Потому, что абсолютно всегда можно сделать лучше чем было , а в процессе легко сделать хуже, переусложнив и т.д.


Yes :)


Roman Mejtes
тут главное пережить переходный период, максимализм, абсолютизм, нигилизм и прочие варианты девиантного поведения :)


Это всё неплохо.

Главное понимать, что конкретно тебе даёт то или иное решение.
Или чем конкретно мешает.
Измеримый профит и фейл.

На анти-паттернах сделаны лучшие в мире решения :)
...
Рейтинг: 0 / 0
Зацените WTF
    #40015745
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
В любой литературе по проектированию пишут, что абсолютное и слепое следование всем принципам и паттернам будет имеет обратный эффект,

Давайте же делать все наоборот. И дорогу на красный свет переходить вместо зеленого.

Roman Mejtes
Этап, когда я плевался на какой бы то ни было код, лично у меня, давно прошел.

Я на говнокод особо тоже не плююсь. Но говнокод как раз можно вычистить - это только вопрос времени и усилий. А вот WTF, типа того же выпиливания готовой, работающей системы логирования и замены её на неработающий самодел, это штука обычно куда хуже, чем самый адов говнокод.

Roman Mejtes
а в процессе легко сделать хуже, переусложнив

В том-то и дело, что WTF чаще всего и возникает, когда, чтобы все было нормально, на самом деле, нужно просто ничего не делать . Т.к. то, что есть готовое из коробки, оно уже и так нормально работает. "Официальная" история про русского Левшу умалчивает тот факт, что после того, как он английскую механическую блоху подковал, эта самая блоха полностью перестала работать.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015753
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Интереснее рассмотреть кейс, в котором подобное решение принесёт боль.



Ну вот, пример конкретно по теме. Я всегда пишу юнит-тесты для BL используя EntityFrameworkCore.InMemoryDatabase. Например, создал инстанс, засунул данные, подсунул сервису в конструктор. А теперь мне надо делать то же самое, только еще и создавать и сетапить mock для этого квази-репо:

Код: c#
1.
2.
3.
4.
5.
// for FakeItEasy
var db = CreateMockDataContext();
var repo = A.Fake<IRepository<Customer>>();
A.CallTo(() => db.DbSet).Returns(db.Clients);
var testee = new TheServiceToTest(repo);


или

Код: c#
1.
2.
3.
4.
5.
// for Moq
var db = CreateMockDataContext();
var repoMock = new Mock<Customer>();
repoMock.Setup(m => m.DbSet).Returns(db.Clients);
var testee = new TheServiceToTest(repoMock.Object);


и там и там строки 3 и 4 вообще лишние. А если надо по нескольку репо, то будет еще хуже. И еще умножаем на количество тестов BL, которых много.

Да и вообще, стоит, наверное что-то оценивать не по "принесет ли это боль", а по "принесет ли это пользу". Пользы от этого мусора я не вижу никакой. Хотя бы уж IQueryable тогда возвращали - и то хоть какой-то профит был бы.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015842
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
и там и там строки 3 и 4 вообще лишние. А если надо по нескольку репо, то будет еще хуже. И еще умножаем на количество тестов BL, которых много.


Так это. Ну так ты не можешь замокать хранилище, вместо этого ты подсовываешь реализацию инмемори.

Что это означает? Логику хрен нормально протестишь.
Как и куда бы репо не был засунут, это всего лишь вопрос локализации проблемы, никуда она не девается.
Поэтому, раз уж репо используется, почему бы не сделать его использование простым? :)
...
Рейтинг: 0 / 0
Зацените WTF
    #40015844
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Хотя бы уж IQueryable тогда возвращали - и то хоть какой-то профит был бы.


Ну вообще так часто и делают.
Пока не встретишь людей, который идею юзать IQueryable встречают большими круглыми глазами: ТЫ ШТО!!?? высталять IQueryable наружу?!?? Нельзя-нельзя-нельзя!!! В ад попадёшь! Еритик! Сжечь!

Ахахх..
...
Рейтинг: 0 / 0
Зацените WTF
    #40015898
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну вообще так часто и делают.

Нельзя-нельзя-нельзя. Гореть в аду тем, кто такое делает.
...
Рейтинг: 0 / 0
Зацените WTF
    #40015902
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Репы вообще никто дизайнить не умеет. Я когда в проекте вижу какую-нибудь подпапку, типа, "Repositories", то я всегда ожидаю там увидеть какое-то гамно. И меня это ожидание никогда не обманывает
...
Рейтинг: 0 / 0
Зацените WTF
    #40015937
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt,

Репы вообще никто дизайнить не умеет. Я когда в проекте вижу какую-нибудь подпапку, типа, "Repositories", то я всегда ожидаю там увидеть какое-то гамно. И меня это ожидание никогда не обманывает


Ну вообще репа это только хранилище.
Идеальная репа (упрощённо):

Код: c#
1.
2.
3.
4.
5.
6.
interface IRepo<TAggregate> where TAggregate: AggregateBase
{
   Task<TAggregate> GetAsync(Identity id, CancellationToken ct);
   Task<TAggregate> PutAsync(TAggregate aggragate, CancellationToken ct);
   Task<TAggregate> RemoveAsync(Identity id, CancellationToken ct);
}



всё :)

ничего больше тут не нужно
...
Рейтинг: 0 / 0
Зацените WTF
    #40015970
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Ну вообще репа это только хранилище.
Идеальная репа (упрощённо):

Код: c#
1.
2.
3.
4.
5.
6.
interface IRepo<TAggregate> where TAggregate: AggregateBase
{
   Task<TAggregate> GetAsync(Identity id, CancellationToken ct);
   Task<TAggregate> PutAsync(TAggregate aggragate, CancellationToken ct);
   Task<TAggregate> RemoveAsync(Identity id, CancellationToken ct);
}



всё :)

ничего больше тут не нужно

Да. Это и есть абсолютно правильная репа. А лепят всегда какого-то мутанта-франкенштейна у которого морда от репы, а попа от Unit of work, хотя это два подхода вообще диаметрально противоположные. UoW это когда я пришел в библиотеку и читаю книгу в читальном зале. А репо, это когда я её беру оттуда домой, неделю читаю., а потом обратно приношу.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Зацените WTF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]