Re[11]: Re[11]: EntityFramework: (анти)паттерн Repository
От: Au Австралия  
Дата: 30.08.17 00:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Au, Вы писали:


Au>>Этот код покрыт юнит тестами?


AVK>Да.


Au>> Можно их посмотреть (без ненужных подробностей разумеется)?


AVK> А зачем?


Ты привел некоторое решение, хочется видеть насколько оно эффективно с точки зрения полного цикла разработки/поддержки (то есть с тестами).

AVK> Там ничего удивительного нет, прогоняются юзкейсы основные. И без подробностей все равно пользы от них не будет.


Ничего удивительного и не нужно, хочется увидеть как тестируется твое решение. Покажи 1 тест, например который проверяет что ассерт SerialNumberAlreadyUsedForUser срабатывает при нужных условиях.
Re[12]: Re[11]: EntityFramework: (анти)паттерн Repository
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.08.17 07:15
Оценка: +1
Здравствуйте, Au, Вы писали:

AVK>> А зачем?

Au>Ты привел некоторое решение, хочется видеть насколько оно эффективно с точки зрения полного цикла разработки/поддержки (то есть с тестами).

Это в принципе невозможно без подробносьей.

AVK>> Там ничего удивительного нет, прогоняются юзкейсы основные. И без подробностей все равно пользы от них не будет.

Au>Ничего удивительного и не нужно, хочется увидеть как тестируется твое решение.

Совершенно обычным способом. Берется входной набор данных, покрывающий основные сценарии, успешные и сбойные, и прогоняется по этому коду.

Au> Покажи 1 тест, например который проверяет что ассерт SerialNumberAlreadyUsedForUser срабатывает при нужных условиях.


Берем валидный во всех отношениях серийник, прогоняем. Потом прогоняем еще раз и смотрим код ошибки.
[TestCase("****", 1)]
[TestCase("****", 4)]
public async Task ActivateActivated(string serialNumber, int maxActivations)
{
    using (var db = _dbFactory())
    using (var tx = db.BeginTransaction())
    {
        for (var i = 0; i < maxActivations; i++)
            await DoActivation(db, serialNumber);
        var ex = Assert.ThrowsAsync<HttpServiceException>(async () => await DoActivation(db, serialNumber));
        Assert.AreEqual(HttpStatusCode.BadRequest, ex.StatusCode);
        Assert.AreEqual("SerialNumberAlreadyUsed", ex.ErrorCode);
        tx.Rollback();
    }
}


Какие тут еще могут быть варианты?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[13]: Re[12]: Re[11]: EntityFramework: (анти)паттерн Repository
От: Au Австралия  
Дата: 31.08.17 13:37
Оценка:
AVK>Берем валидный во всех отношениях серийник, прогоняем. Потом прогоняем еще раз и смотрим код ошибки.
AVK>
AVK>[TestCase("****", 1)]
AVK>[TestCase("****", 4)]
AVK>public async Task ActivateActivated(string serialNumber, int maxActivations)
AVK>{
AVK>    using (var db = _dbFactory())
AVK>    using (var tx = db.BeginTransaction())
AVK>    {
AVK>        for (var i = 0; i < maxActivations; i++)
AVK>            await DoActivation(db, serialNumber);
AVK>        var ex = Assert.ThrowsAsync<HttpServiceException>(async () => await DoActivation(db, serialNumber));
AVK>        Assert.AreEqual(HttpStatusCode.BadRequest, ex.StatusCode);
AVK>        Assert.AreEqual("SerialNumberAlreadyUsed", ex.ErrorCode);
AVK>        tx.Rollback();
AVK>    }
AVK>}
AVK>


А зачем нужна транзакция для юнит теста? Или используется реальная тестовая БД?
Re[14]: Re[12]: Re[11]: EntityFramework: (анти)паттерн Repository
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.08.17 21:57
Оценка:
Здравствуйте, Au, Вы писали:

Au>А зачем нужна транзакция для юнит теста? Или используется реальная тестовая БД?


Используется реальная тестовая БД. Транзакция ее гарантированно подчищает при любом сбое. Но есть и другие варианты. Здесь такой выбран, потому что серийники генерируются и проверяются сторонней системой, и лень было докручивать клиента для этого.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[14]: EntityFramework: (анти)паттерн Repository
От: Danchik Украина  
Дата: 01.09.17 09:54
Оценка: +1 -1
Здравствуйте, Au, Вы писали:

[Skip]

Au>А зачем нужна транзакция для юнит теста? Или используется реальная тестовая БД?


Я, например, как правило для CI имею бакап эталонной базы, она подымается и тесты проганяются на этой базе. Это автоматически спасает от кучи сторонних эффектов (тригера, индексы, констрейнты, типы данных).
Да тесты работают медленней, зато в продакшине я спокоен.
Re[9]: EntityFramework: (анти)паттерн Repository
От: AngeL B. Россия  
Дата: 13.09.17 16:16
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А новая гвардия что делает? Пишет мегарешение, которое кушает 5 килобаксов в месяц за облако, выполняя при этом малую долю работы похожей системы, тратящей 1.5К в месяц? При том что и у второй системы не все идеально и с перфомансом, и с лишним бойлерплейтом.

AVK>Если что — это как раз реальный пример применения модных технологий и CQRS.

Тут вопрос спорный. Разница в затратах на облако, насколько я понял, где-то $3500. Это меньше нижней з/п одного программиста в США и где-то 1.5 з/п хороших программистов в МСК. С точки хрения бизнеса возникает резонный вопрос: Сколько нужно программистов и какой квалификации (и, соответственно, с какой з/п) чтобы поддерживать и развивать оба этих проекта?

P.S. Я не оправдываю Repository, т.к. пытался использовать его в реальных проектах и быстро пришел к тем же заключениям, которые были описаны выше (короче отказался). Я говорю, что указывать просто затраты на облако с точки зрения бизнеса некорректно.
Re[10]: EntityFramework: (анти)паттерн Repository
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.09.17 20:32
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>Тут вопрос спорный.


Зато результаты совершенно бесспорные.

AB> Разница в затратах на облако, насколько я понял, где-то $3500. Это меньше нижней з/п одного программиста в США и где-то 1.5 з/п хороших программистов в МСК. С точки хрения бизнеса возникает резонный вопрос: Сколько нужно программистов и какой квалификации (и, соответственно, с какой з/п) чтобы поддерживать и развивать оба этих проекта?


О, а тут все еще смешнее. Первый проект большую часть его истории разрабатывал один человек. А второй — целая немаленькая команда. И закончилась его печальная судьба в том числе потому что новые люди очень много времени тратили на въезжание.

AB>P.S. Я не оправдываю Repository


Дело не в Repository, дело в основном в CQRS. И в том что смелые парни решили зачем то написать асинхронный велосипед с распределенными данными, при этом явно не имея в таком даже базового опыта.

AB>, т.к. пытался использовать его в реальных проектах и быстро пришел к тем же заключениям, которые были описаны выше (короче отказался). Я говорю, что указывать просто затраты на облако с точки зрения бизнеса некорректно.


Сколько оговорок. Но видишь ли какое дело — когда стадо виртуалок само себя нагружает работой и имитирует бурную деятельность, при этом чтобы понять что там вообще происходит понадобились очень хорошие спецы и много времени — тут все отсылки на зарплаты программистов не канают.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[10]: EntityFramework: (анти)паттерн Repository
От: Слава  
Дата: 14.09.17 10:27
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>P.S. Я не оправдываю Repository, т.к. пытался использовать его в реальных проектах и быстро пришел к тем же заключениям, которые были описаны выше (короче отказался). Я говорю, что указывать просто затраты на облако с точки зрения бизнеса некорректно.


Лично мне проще пользоваться запросами, чем вот этой необыкновенной ерундой с ORM и развесистой иерархией репозов, которые сами не делают ничего. Вообще, обилие разного рода SQL-бабок, т.е. женщин средних лет, которые занимаются только БД и которым платят не столь много, как бы говорит нам, что уметь пользоваться запросами — это несложно.
Re: EntityFramework: (анти)паттерн Repository
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.09.17 15:40
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Приглашаю высказать свое фи: https://habrahabr.ru/post/335856/


Ты бы размещал статью у нас, а не ссылки бы давал. Было был проще отвечать на конкретные абзацы.

Да и вообще, неуважение какое то. Обсуждать хочешь здесь, а размещаешь там.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: EntityFramework: (анти)паттерн Repository
От: Shmj Ниоткуда  
Дата: 14.09.17 16:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Да и вообще, неуважение какое то. Обсуждать хочешь здесь, а размещаешь там.


Не, это не моя статья. Просто тема интересная, имхо.
Re[11]: EntityFramework: (анти)паттерн Repository
От: Danchik Украина  
Дата: 15.09.17 09:12
Оценка: +1
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, AngeL B., Вы писали:


AB>>P.S. Я не оправдываю Repository, т.к. пытался использовать его в реальных проектах и быстро пришел к тем же заключениям, которые были описаны выше (короче отказался). Я говорю, что указывать просто затраты на облако с точки зрения бизнеса некорректно.


С>Лично мне проще пользоваться запросами, чем вот этой необыкновенной ерундой с ORM и развесистой иерархией репозов, которые сами не делают ничего. Вообще, обилие разного рода SQL-бабок, т.е. женщин средних лет, которые занимаются только БД и которым платят не столь много, как бы говорит нам, что уметь пользоваться запросами — это несложно.


Query Decomposition — вот что голые запросы тебе дать не могут. Получится самопальная склейка строк.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.