Обновить
3
0
Дмитрий Сущевский@blowin

Разработчик .NET

Отправить сообщение

И Вас с праздником.

Согласен, лучше было бы в тесте написать код для удаления файла, а не менять public api

Конечно пример надуманный, в реальной жизни вы вряд ли кто-то будет тестировать репозиторий, но вместо его может быть, например, получение курсов валют из сети. Цель статьи - показать проблемы и возможные способы их решения.

Никто не будет приводить сложный код для того, чтобы объяснить проблему. Пример должен уместиться в голове и быть простым для понимания и понятен каждому. Каждый в своём коде использует репозиторий и пример на нём банально нагляден.

Это легко можно решит используя IDisposable

public readonly struct DeleteFileScope : IDisposable
{
    private readonly IFileProvider _fileProvider;
    private readonly string _path;

    public DeleteFileScope(IFileProvider fileProvider, string path)
    {
        _fileProvider = fileProvider;
        _path = path;
    }

    public void Dispose()
    {
        try
        {
            _fileProvider.Delete(_path);
        }
        catch 
        {
        }
    }
}

Сам тест

[Theory]
[MemberData(nameof(TestData))]
public void Save(string expect, List<User> items)
{
    // Arrange
    const string filePath = "tmp.json";
    var fileProvider = new MemoryFileProvider();
    var repository = new UserRepository(filePath, fileProvider);

    using (new DeleteFileScope(fileProvider, filePath))
    {
        // Act
        repository.Save(items);
        var json = fileProvider.ToJson(filePath);
    
        // Assert
        Assert.Equal(expect, json);
    }
}

А в чём противоречие?

В OrderBy может быть любой объект, для сортировки будет использоваться IComparer, по умолчанию Comparer<TKey>.Default.

Т.е у ValueTuple реализован интерфейс сравнения и будет использоваться это сравнение объектов.

Можно даже в один OrderBy)

var items = arr.OrderBy(p => (p.Primary, p.Secondary));

Можно написать roslyn анализатор. Писал как-то такой себе
github.com/blowin/Blowin.Required
написали много слов и никакого конструктива
1)Это не решит проблему банальной невнимательности.
2)А также не решит проблему, если существует несколько solution и человек не знает о них/забыл и не добавил логику. Узнать об этом можно будет только во время исполнения.

С таким подходом, проект просто не соберется
Для этого можно написать абстрактный класс, который будет вызывать общий метод для нужных case
Полностью поддерживаю. Но к великому сожалению, далеко не все могут использовать новую версию NET. Бывают легаси проекты, где приходится жить с тем, что есть.
Вариант return (T)(i32Left + i32Right) не компилируется — нет гарантии, что T это int (хоть мы-то знаем, что это так). Можно попробовать двойное преобразование return (T)(object)(i32Left + i32Right). Сначала сумма упаковывается, затем — распаковывается в T. Это будет работать только если типы до упаковки и после упаковки совпадают.


Вы не правы. В Net очень известный трюк с проверкой generic тип. Результат бенчмарка

image

Исходный код:
Исходный код
[MethodImpl(MethodImplOptions.NoInlining)]
        private static T ThrowInvalidOperation<T>() => throw new InvalidOperationException("Not support type");
        
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static T Add<T>(T lft, T rgt) where T : struct 
        {
            if(typeof(T) == typeof(int))
                return (T)(object)((int)(object)lft + (int)(object)rgt);
            if(typeof(T) == typeof(float))
                return (T)(object)((float)(object)lft + (float)(object)rgt);
            if(typeof(T) == typeof(decimal))
                return (T)(object)((decimal)(object)lft + (decimal)(object)rgt);
            if(typeof(T) == typeof(double))
                return (T)(object)((double)(object)lft + (double)(object)rgt);

            return ThrowInvalidOperation<T>();
        }
    
        [Benchmark]
        public int GenericAdd() => Add(10, 20);

        [Benchmark]
        public int DirectAdd() => 10 + 20;



В данном случае generic оказался быстрее, но это всё в пределах погрешности.

Информация

В рейтинге
Не участвует
Откуда
Полоцк, Витебская обл., Беларусь
Дата рождения
Зарегистрирован
Активность