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



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

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

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

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

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

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


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

Интереснее рассмотреть кейс, в котором подобное решение принесёт боль.
...
Рейтинг: 0 / 0
05.11.2020, 09:59
    #40015442
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
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
05.11.2020, 10:55
    #40015460
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
Зато, наверное, продаётся
...
Рейтинг: 0 / 0
05.11.2020, 11:03
    #40015466
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
Shocker.Pro
Зато, наверное, продаётся

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

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

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


Yes :)


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


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

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

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

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

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

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

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

В том-то и дело, что WTF чаще всего и возникает, когда, чтобы все было нормально, на самом деле, нужно просто ничего не делать . Т.к. то, что есть готовое из коробки, оно уже и так нормально работает. "Официальная" история про русского Левшу умалчивает тот факт, что после того, как он английскую механическую блоху подковал, эта самая блоха полностью перестала работать.
...
Рейтинг: 0 / 0
05.11.2020, 22:09
    #40015753
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
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
06.11.2020, 09:05
    #40015842
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
fkthat
и там и там строки 3 и 4 вообще лишние. А если надо по нескольку репо, то будет еще хуже. И еще умножаем на количество тестов BL, которых много.


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

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


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

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

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

Репы вообще никто дизайнить не умеет. Я когда в проекте вижу какую-нибудь подпапку, типа, "Repositories", то я всегда ожидаю там увидеть какое-то гамно. И меня это ожидание никогда не обманывает
...
Рейтинг: 0 / 0
06.11.2020, 13:49
    #40015937
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
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
06.11.2020, 14:51
    #40015970
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зацените WTF
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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Зацените WTF / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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