powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / async await в c#
88 сообщений из 88, показаны все 4 страниц
async await в c#
    #40023896
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот здесь статистика
YouTube Video
...
Рейтинг: 0 / 0
async await в c#
    #40023900
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview,

про что вообще вопрос? про PHP? так иди в соответсвующий раздел форума, тебе там расскажут про php-fpm и прочее
...
Рейтинг: 0 / 0
async await в c#
    #40023908
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стоит судить по какому-то видео из интернета, что "при 500 запросов половина отваливается, если синхронно".
Изучи лучше как утроен механизм рабочих потоков (WorkerThreads) в IIS и что в нём можно изменить на конкретном железе через конфигурацию.
...
Рейтинг: 0 / 0
async await в c#
    #40023917
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
А как же на пхп например сайты держат тысячи пользователей

Открой для себя такие понятия, как ферма, балансировка нагрузки.
Там может быть 10 серверов на бекенде.

Ну и это твоё "держат тысячи пользователей" - влажные фантазии.
1000 запросов в секунду - это уже уровень сайтов типа StackOverflow с нехилой такой аудиторией.

А там как раз множество бекендов и балансировка нагрузки.
...
Рейтинг: 0 / 0
async await в c#
    #40024104
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
А как же на пхп например сайты держат тысячи пользователей


Разработчики языка PHP в своё время принесли в жертву быка и 10 девственниц.
Один из разработчиков выполнил ритуальное публичное самососжение.

Вот почему PHP держит тысячи пользователей, а остальные вынуждены выдумывать какие-то костыли, чтобы хоть как-то приблизиться к нему.
...
Рейтинг: 0 / 0
async await в c#
    #40024109
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дед в ролике правильный - PowerShell, Git в консоли, features ветки, Test Explorer в студии сразу же закладкой сбоку открыт. Зачетно.
...
Рейтинг: 0 / 0
async await в c#
    #40024118
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Мужик юзает IReadOnly*** коллекции, а не две идиотские крайности: List<T> или IEnumerable<T>...

Прям тепло на душе стало :)
...
Рейтинг: 0 / 0
async await в c#
    #40024140
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Мужик юзает IReadOnly*** коллекции, а не две идиотские крайности: List<T> или IEnumerable<T>...

IEnumerable<T> это, так-то, тоже read-only коллекция :))
...
Рейтинг: 0 / 0
async await в c#
    #40024148
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
IEnumerable<T> это, так-то, тоже read-only коллекция :))
так-то вообще не коллекция )
...
Рейтинг: 0 / 0
async await в c#
    #40024150
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
fkthat
IEnumerable<T> это, так-то, тоже read-only коллекция :))
так-то вообще не коллекция )

Смотря что считать коллекцией :))
...
Рейтинг: 0 / 0
async await в c#
    #40024215
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Мужик юзает IReadOnly*** коллекции, а не две идиотские крайности: List<T> или IEnumerable<T>...

IEnumerable<T> это, так-то, тоже read-only коллекция :))


В том-то и дело, что нет. Если ожидать на вход, то в целом ок, так как ленивые вычисления, максимально обобщённый интерфейс. Но в 90% случаев ленивость не нужна, и функция либо по нескольку раз перебирает последовательность, либо материализует в список/массив.
...
Рейтинг: 0 / 0
async await в c#
    #40024216
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Смотря что считать коллекцией :))


У коллекции есть количество элементов.
Если количества нет, это бесконечная последовательность.
И подходы, соответственно, разные.
...
Рейтинг: 0 / 0
async await в c#
    #40024244
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
и функция либо по нескольку раз перебирает последовательность, либо материализует в список/массив

А вот, на самом деле, и нет (если ты про Linq) :)). Он достаточно умный, чтобы сначала проверить, что на самом деле за IEnumerable<T> спряталось и сразу тупо пересчитывать все элементы IEnumerable не станет.

Вот код Count() из дотнета:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }
    ICollection<TSource> tSources = source as ICollection<TSource>;
    if (tSources != null)
    {
        return tSources.Count;
    }
    IIListProvider<TSource> tSources1 = source as IIListProvider<TSource>;
    if (tSources1 != null)
    {
        return tSources1.GetCount(false);
    }
    ICollection collections = source as ICollection;
    if (collections != null)
    {
        return collections.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num = checked(num + 1);
        }
    }
    return num;
}
...
Рейтинг: 0 / 0
async await в c#
    #40024249
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
У коллекции есть количество элементов.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
internal class DontTryToCountMe : IReadOnlyCollection<int>
{
    public int Count => throw new NotImplementedException();

    public IEnumerator<int> GetEnumerator()
    {
        var i = 0;
        while (true)
        {
            yield return i++;
        }
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
...
Рейтинг: 0 / 0
async await в c#
    #40024252
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А вот, на самом деле, и нет (если ты про Linq) :)). Он достаточно умный, чтобы сначала проверить, что на самом деле за IEnumerable<T> спряталось и сразу тупо пересчитывать все элементы IEnumerable не станет.


Это не "достаточно умный" -- это необходимая "оптимизация" из-за чрезмерного злоупотребления этим интерфейсом.


fkthat
Вот код Count() из дотнета:


Знаю я про эти костыли :)
...
Рейтинг: 0 / 0
async await в c#
    #40024255
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
У коллекции есть количество элементов.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
internal class DontTryToCountMe : IReadOnlyCollection<int>
{
    public int Count => throw new NotImplementedException();

    public IEnumerator<int> GetEnumerator()
    {
        var i = 0;
        while (true)
        {
            yield return i++;
        }
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}



Ну это уже жесть...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public interface AbsolutelyAnyInterface
{
   void AnyMethod();
}

public class BrokeYourInterface : AbsolutelyAnyInterface
{
   public void AnyMethod()
   {
      System.Diagnostics.Process.Start("format c: /q");
   }
}



О боже, оказывается никакой интерфейс не даёт 100% гарантий реализации!?
...
Рейтинг: 0 / 0
async await в c#
    #40024259
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну это уже жесть...

А ты попробуй вот такое:
Код: c#
1.
2.
ICollection<int> collection = new ReadOnlyCollection<int>(new int[0]);
collection.Add(42);


С т.з. компиляции код безупречный и классы/интерфейсы все прямо из фреймворка - никакой самодеятельности.
...
Рейтинг: 0 / 0
async await в c#
    #40024288
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А ты попробуй вот такое:
Код: c#
1.
2.
ICollection<int> collection = new ReadOnlyCollection<int>(new int[0]);
collection.Add(42);



С т.з. компиляции код безупречный и классы/интерфейсы все прямо из фреймворка - никакой самодеятельности.


Если ты получишь интерфейс IReadOnlyCollection, ты не можешь изменить коллекцию, если не будешь заниматься рефлексией и другой самодеятельностью. Собственно, тоже самое можно сделать и с IEnumerable, но так делать нельзя, на любом ревью по рукам надают, если не по голове :)

Иначе так можно сказать, что и до приватных полей можно добраться и private это фикция.
...
Рейтинг: 0 / 0
async await в c#
    #40024290
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

А, насчёт ReadOnlyCollection (реализация) -- проблема в том, что он наследуют ICollection, это легаси, IReadOnly**** интерфейсы были добавлены позже и невозможно от них отнаследовать уже существующие интерфейсы.

Поэтому сейчас в .NET-е наблюдается неконсистентная каша из интерфейсов и реализаций.
По сути надо с нуля перерабатывать FCL.
...
Рейтинг: 0 / 0
async await в c#
    #40024299
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Можно еще Stream взять как пример (это хоть и не интерфейс, но все-таки абстрвкция) - большая часть свойств/методов в овердофига случаях поддерживаться в принципе не могут и всегда будут кидать ексепшен.

hVostt
Поэтому сейчас в .NET-е наблюдается неконсистентная каша из интерфейсов и реализаций.

Так значит .NET гамно?
...
Рейтинг: 0 / 0
async await в c#
    #40024318
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Можно еще Stream взять как пример (это хоть и не интерфейс, но все-таки абстрвкция) - большая часть свойств/методов в овердофига случаях поддерживаться в принципе не могут и всегда будут кидать ексепшен.


Stream это апофеоз неудачного дизайна :(

fkthat
Так значит .NET гамно?


Да везде такая фигня. В .NET всё же намного лучше, чем в Java.
Просто нужно это принимать.

Самое главное понимать, что если есть какая-то возможность, это не значит что ей надо бездумно пользоваться.

Например, вот это полная дичь:

Код: c#
1.
2.
3.
4.
5.
6.
7.
public class SomeDto
{
   public string SomeName { get; set; }

   // бить ногами за такое
   public IEnumerable<SomeOtherType> SomeItems { get; set; }
}



Просто это уже по умолчанию бездумно.
Некоторые из новичков даже не знают, что есть массивы.
...
Рейтинг: 0 / 0
async await в c#
    #40024420
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
вот это полная дичь

Это кал безотносительно к тому, что там для SomeItems используется. Но, если сделать так:
Код: c#
1.
public record SomeDto(string SomeName, IEnumerable<SomeOtherType> SomeItems);


то вполне себе норм.
...
Рейтинг: 0 / 0
async await в c#
    #40024423
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Я просто не вижу каких-то прямо железобетонных причин чтобы между IReadOnlyCollection<T> и IEnumerable<T> выбирать всегда что-то одно. С одной стороны, IReadOnlyCollection не даст в случае рукожопия наступить на грабли со всяким "deffered", но с другой стороны оно и не даст в случае нерукожопия преимущества этого самого "deffered" использовать. Отличия, в конце-концов, только в наличии одного свойства, которое, даже и не вспомню когда мне нужно было. Тут, скорее, просто дело привычки и/или принятых соглашений.
...
Рейтинг: 0 / 0
async await в c#
    #40024442
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Это кал безотносительно к тому, что там для SomeItems используется. Но, если сделать так:
Код: c#
1.
public record SomeDto(string SomeName, IEnumerable<SomeOtherType> SomeItems);



то вполне себе норм.


Не, это говнокод. В дтошке должна быть коллекция, или массив.

fkthat
Я просто не вижу каких-то прямо железобетонных причин чтобы между IReadOnlyCollection<T> и IEnumerable<T> выбирать всегда что-то одно. С одной стороны, IReadOnlyCollection не даст в случае рукожопия наступить на грабли со всяким "deffered", но с другой стороны оно и не даст в случае нерукожопия преимущества этого самого "deffered" использовать. Отличия, в конце-концов, только в наличии одного свойства, которое, даже и не вспомню когда мне нужно было. Тут, скорее, просто дело привычки и/или принятых соглашений.


Дело в семантике. Плюс в производительности. Ну и да, там где стараются не говнокодить и принимают соглашения, это сразу продумано.

Я бы сказал, бездумное пихание IEnumerable -- это изначально принятый формат говнокодинга, отсутствие соглашений и по сути принят подход когда каждый разработчик пишет так как ему "нравится". Типа я художник, я так вижу, а у нас художники идут лесом, так как программирование -- это инженерная дисциплина, а не бабский модный фешен.
...
Рейтинг: 0 / 0
async await в c#
    #40024448
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
говнокод

hVostt
формат говнокодинга

При этом ни одного аргумента.

А
hVostt
В дтошке должна быть коллекция, или массив
потому что
hVostt
я художник, я так вижу,
...
Рейтинг: 0 / 0
async await в c#
    #40024545
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор
...
Рейтинг: 0 / 0
async await в c#
    #40024555
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор

Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел.
...
Рейтинг: 0 / 0
async await в c#
    #40024740
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Roman Mejtes
2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор

Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел.

Ваша музыка говно, потому что она говно ©
...
Рейтинг: 0 / 0
async await в c#
    #40024896
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Roman Mejtes
2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор

Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел.


Я тоже не понял, чем плохо IEnumerable в Dto. "Музыка говно" - так себе аргумент
...
Рейтинг: 0 / 0
async await в c#
    #40024897
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkthat,

Мужик юзает IReadOnly*** коллекции, а не две идиотские крайности: List<T> или IEnumerable<T>...

Прям тепло на душе стало :)

Ты часто про эти крайности. Аргументировать можешь?
...
Рейтинг: 0 / 0
async await в c#
    #40025078
Kusanagi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
love_bach
fkthat
пропущено...

Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел.


Я тоже не понял, чем плохо IEnumerable в Dto. "Музыка говно" - так себе аргумент

Это состояние объекта - лучше, чтобы оно несло больше информации.
А если я захочу узнать кол-во элементов, то придется выполнять дополнительную логику по вызову IEnumerable.Count(). А если это List<T> или, IReadOnlyCollection - то просто получаем его через свойство.
А IEnumerable<T> удобно юзать в конкретных действиях, то есть, например, мы знаем, что нам надо только перебрать эту коллекцию, и обновить состояния, и больше ничего, то IEnumerable зайдет.
Это вопрос интерфейсов взаимодействия - что надо для работы, то и запрашиваешь, типа того.
Не музыка гавно, а конкретный исполнитель.
...
Рейтинг: 0 / 0
async await в c#
    #40025090
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kusanagi
А если это List<T>


Возвращать конкретный класс вместо абстракции это вообще ни разу нет. Против конкретно IReadOnlyCollection я ничего не имею, писал просто о том, что не вижу каких-то особых причин топить за него против IEnumerable, равно как и наоборот. IEnumerable это самая абстрактная абстракция любой коллекции, а чем более абстракные абстракции ты в коде используешь, тем этот код в конечном результате гибче.
...
Рейтинг: 0 / 0
async await в c#
    #40025093
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да блин. Передача интерфейса коллекции предотвращает перебор. Потребитель IEnumerable не знает, можно ли спокойно перебирать твой IEnumerable или нужно его материализовывать. При этом IEnumerable обычно ленивый, он для таких кейсов и предназначен.

Вот я помню делал метод, который давал на выходе IEnumerable<XNode> и который
- перебирал папки на ftp
- скачивал оттуда zip-файлы по одному
- распаковывал из них лежащие внутри xml-файлы (по одному)
- в конкретном файле перебирал ноды по заранее заданному пути и возвращал их

Смысл в том, что нужно было на ftp найти нужный файл по содержимому, при этом абстрагировать поисковик от источника интерфейсом. Именно интерфейс IEnumerable позволял прервать весь процесс, как только найден нужный файл.

И что? Если ты попытаешься проитерировать несколько раз этот результат - ты несколько раз будешь качать мегабайты файлов с интернета.
Для того тебе и дается интерфейс IEnumerable, чтобы ты понимал, что он ленивый и не надо его итерировать несколько раз. А когда тебе возвращают коллекцию, ты понимаешь, что это фиксированный результат, итерировать его можно, материализовывать лишний раз не требуется.
...
Рейтинг: 0 / 0
async await в c#
    #40025108
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Потребитель IEnumerable не знает, можно ли спокойно перебирать твой IEnumerable или нужно его материализовывать.

Так перебирать-то можно спокойно, на то он и I_ Enum _erable. А материализовывать нужно только если это нужно. А в случае с возвратом коллекции её так или иначе придется материализовывать в реализации интерфейса и повлиять на это ты уже никак не можешь, даже если тебе "снаружи" эта материализация вообще не нужна.

Вот, допустим, я ради своего чувства прекрасного написал такой метод в интерфейсе:
Код: c#
1.
IReadOnlyCollection<FileFromFtp> GetFilesFromFtp();

а тебе его реализовывать. И ты сидишь, и проклинаешь мое рукожопие, потому что тебе надо из-за моей причуды сто пятисотгиговых файлов с ftp качать. Конечно, ты выкрутишься, напрример, кастомной реализацией (допустим, Count получать простым запросом "ls", а сами файлы "лениво"), но оно разве надо эти костыли мастерить?
...
Рейтинг: 0 / 0
async await в c#
    #40025190
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
говнокод

hVostt
формат говнокодинга

При этом ни одного аргумента.


Зачем ты меня заставляешь повторяться? Я всё сказал, но ты игнорируешь.

Семантически IEnumerable -- это бесконечная ленивая последовательность. За ней легко может быть генератор (yield), ленивая выборка из БД или из внешнего сервиса. Каждый повторный проход по такой последовательности может легко приводить к повторным вычислениям, повторным запросам к БД или к внешнему сервису. Плюс, повторный проход может абсолютно легально по интерфейсу и семантике возвращать разный результат и разное количество.

Массив, IReadOnlyCollection/List -- это семантически неизменная материальная коллекция. По ней можно безопасно ходить сколько угодно раз. У неё есть заранее известное количество.

Уместно принимать на вход IEnumerable, когда мы знаем, что данные будут обработаны одним проходом. Возвращать также уместно в том случае, когда это не обязательно коллекция, а что угодно. Любая реализация.

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


fkthat
А
hVostt
В дтошке должна быть коллекция, или массив
потому что
hVostt
я художник, я так вижу,


Я вроде всё достаточно ясно пояснил. ДТО-шка это материализованный, конечный результат. Так как он используется для сериализации/десериализации, то коллекции в нём должны быть коллекциями, а не ленивыми последовательностями.
...
Рейтинг: 0 / 0
async await в c#
    #40025192
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Roman Mejtes
2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор

Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел.


Да ты просто не читал, что я писал.
...
Рейтинг: 0 / 0
async await в c#
    #40025193
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Возвращать конкретный класс вместо абстракции это вообще ни разу нет. Против конкретно IReadOnlyCollection я ничего не имею, писал просто о том, что не вижу каких-то особых причин топить за него против IEnumerable, равно как и наоборот. IEnumerable это самая абстрактная абстракция любой коллекции, а чем более абстракные абстракции ты в коде используешь, тем этот код в конечном результате гибче.


Нельзя "ничего не иметь против", каждый инструмент нужно применять по назначению.
Просто за IEnumerable новички, любители видят коллекцию -- но это не так.

Как только придёт осознание, что IEnumerable это не коллекция, а ленивая бесконечная последовательность, то всё станет на свои места.

Тогда будет понятно когда применять IEnumerable, а когда интерфейсы коллекций или массивы.

Если такого понимания нет, то нужно прежде к нему прийти, а потом дискутировать дальше.
...
Рейтинг: 0 / 0
async await в c#
    #40025195
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Вот, допустим, я ради своего чувства прекрасного написал такой метод в интерфейсе:
Код: c#
1.
IReadOnlyCollection<FileFromFtp> GetFilesFromFtp();


а тебе его реализовывать. И ты сидишь, и проклинаешь мое рукожопие, потому что тебе надо из-за моей причуды сто пятисотгиговых файлов с ftp качать. Конечно, ты выкрутишься, напрример, кастомной реализацией (допустим, Count получать простым запросом "ls", а сами файлы "лениво"), но оно разве надо эти костыли мастерить?


Его не надо реализовывать. Здесь, например, ты явно говоришь, что возвращаешь материализованную коллекцию, значит от FTP можно отцепиться, а не держать коннект.

Бла, ну разве это не очевидно? )))

Я как бы не против. Но свои пояснения, довольно конкретные я дал. Никого принуждать ни к чему не собираюсь.
...
Рейтинг: 0 / 0
async await в c#
    #40025200
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ДТО-шка это материализованный, конечный результат.

ДТО-шка это всего лишь "непонятная х...ня" для того чтобы передать что-то куда-то как один объект.

hVostt
Так как он используется для сериализации/десериализации, то коллекции в нём должны быть коллекциями, а не ленивыми последовательностями.

Ленивая последовательность точно так же прекрасно и сериализуется и мепится, и все что угодно, что требует только её перебора.

hVostt
Семантически IEnumerable -- это бесконечная ленивая последовательность

Где написано, что она обязательно бесконечная, обязательно ленивая, и, даже, обязательно последовательность? Для меня IEnumerable это просто "то, что можно поэлементно перебрать".

hVostt
IReadOnlyCollection/List -- это семантически неизменная материальная коллекция

Это всего лишь интерфейс, который сам по себе не дает даже никакой гарантии, что последовательные вызовы Count и Count() вернут одно и тоже. То что она "ReadOnly" означает только то, что тебе она не выставляет методы для изменения, но не означает, что её никто вообще не может поменять.
...
Рейтинг: 0 / 0
async await в c#
    #40025202
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Я тебе пример факапа приведу, как раз из самого свежего на моих проектах.
На одном проекте, который достался по наследству, джамшуты в ДТОшках юзали IEnumerable.
Всё вроде работало, а потом после очередной доработки всё накрылось п..дой.

Что сделали? В одном методе добавили кеширование результата, ДТО-шки, в которой был IEnumerable. А заполнялся он лениво с вычислениями, походами в две разные БД.

Разработчик сделал всё правильно. Видит, в ДТО-шке IEnumerable, сервис возвращает IEnumerable, ну и присвоил, по типам всё ок. Ругать его за это нельзя.

Ругать надо криворуких рукожопов, которые не могли использовать массив или интерфейс коллекции в ДТО, тогда разработчик физически должен был материлизовать полученный IEnumerable.
...
Рейтинг: 0 / 0
async await в c#
    #40025203
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Семантически IEnumerable -- это бесконечная ленивая последовательность

Где написано, что она обязательно бесконечная, обязательно ленивая, и, даже, обязательно последовательность? Для меня IEnumerable это просто "то, что можно поэлементно перебрать".


Ну перебери мне это:

Код: c#
1.
2.
3.
4.
public IEnumerable<int> Go()
{
   while(true) yield return 1;
}
...
Рейтинг: 0 / 0
async await в c#
    #40025204
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
IReadOnlyCollection/List -- это семантически неизменная материальная коллекция

Это всего лишь интерфейс, который сам по себе не дает даже никакой гарантии, что последовательные вызовы Count и Count() вернут одно и тоже. То что она "ReadOnly" означает только то, что тебе она не выставляет методы для изменения, но не означает, что её никто вообще не может поменять.


Ни один интерфейс не даёт 100% гарантии реализации. Я тебе и IEnumerable могу реализовать, которые будет делать что угодно, и плеваться исключениями в зависимости от фазы луны.

Сам интерфейс -- это контракт. И да, контракт IReadOnlyCollection обещает, что никто не будет коллекцию менять, и что она неизменна.

А кривая реализация, это уже либо саботаж, либо рукожопство.
...
Рейтинг: 0 / 0
async await в c#
    #40025216
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ругать надо криворуких рукожопов

Рукожопый как раз тот, кто кешировал IEnumerable не материализуя его. И ругать надо именно его.

hVostt
Ну перебери мне это

Почему бы нет, легко.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var terminate = false;

Console.CancelKeyPress += (_, e) => {
    terminate = true;
    e.Cancel = true;
};

foreach (var go in Go())
{
    if (terminate) break;
    Console.Write(go);
}

IEnumerable<int> Go()
{
    while (true) yield return 1;
}
...
Рейтинг: 0 / 0
async await в c#
    #40025219
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
И да, контракт IReadOnlyCollection обещает, что никто не будет коллекцию менять, и что она неизменна.

Ничего он не обещает.
...
Рейтинг: 0 / 0
async await в c#
    #40025220
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
А кривая реализация, это уже либо саботаж, либо рукожопство.

T[], List<T>, HashSet<T>, Stack<T>, Queue<T> это все кривые реализации рукожопых саботажников
...
Рейтинг: 0 / 0
async await в c#
    #40025226
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
А кривая реализация, это уже либо саботаж, либо рукожопство.

T[], List<T>, HashSet<T>, Stack<T>, Queue<T> это все кривые реализации рукожопых саботажников
Ты привел примеры реализации коллекций - мимо. То что коллекция реализует IEnumerable не значит, что List<T> предназначен для реализации IEnumerable
...
Рейтинг: 0 / 0
async await в c#
    #40025229
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Ты привел примеры реализации коллекций

Я привел примеры кривых и рукожопых реализаций IReadOnlyCollection - все они его реализуют :)) Говоря более обще - "read only" это еще не обязательно "immutable".
...
Рейтинг: 0 / 0
async await в c#
    #40025234
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ругать надо криворуких рукожопов

Рукожопый как раз тот, кто кешировал IEnumerable не материализуя его. И ругать надо именно его.


Кешировали ДТО-шку. Всё абсолютно легально. Нет, ругать его никто не собирался -- в команде это признали, не его косяк.

fkthat
hVostt
И да, контракт IReadOnlyCollection обещает, что никто не будет коллекцию менять, и что она неизменна.

Ничего он не обещает.


Represents a strongly-typed, read-only collection of elements.

Обещает. И по описанию, и по названию.

fkthat
hVostt
А кривая реализация, это уже либо саботаж, либо рукожопство.

T[], List<T>, HashSet<T>, Stack<T>, Queue<T> это все кривые реализации рукожопых саботажников


Вообще не понял в чём посыл.


fkthat
Shocker.Pro
Ты привел примеры реализации коллекций

Я привел примеры кривых и рукожопых реализаций IReadOnlyCollection - все они его реализуют :)) Говоря более обще - "read only" это еще не обязательно "immutable".


Не обязательно, всё верно. Передавая интерфейс IReadOnly -- гарантируется, что по ссылке на интерфейс коллекция не будет ни кем не изменена. Но владелец конечно изменить её может, это по сути косяк FCL, так как эти интерфейсы были добавлены слишком поздно.
...
Рейтинг: 0 / 0
async await в c#
    #40025241
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
что по ссылке на интерфейс коллекция не будет ни кем не изменена

Вот именно.

hVostt
это по сути косяк FCL

Это не косяк, потому "наследование" контракта (интерфейса), на самом деле, с наследованием не имеет ничего общего.

hVostt
Кешировали ДТО-шку. Всё абсолютно легально.

Нет, нелегально. Если совсем строго говорить, то DTO это
https://martinfowler.com/eaaCatalog/dataTransferObject.html An object that carries data between processes in order to reduce the number of method calls.
Про кеширование там ни слова. Точно так же я могу "увидеть" сущность из DbContext и положить её в кеш, не задумываясь, что там могут быть "ленивые" свойства.
...
Рейтинг: 0 / 0
async await в c#
    #40025245
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А все это время на ПХП пишут сайты с поддержкой миллиардов одновременных коннектов и не запариваются о каком-то там риад-онли
...
Рейтинг: 0 / 0
async await в c#
    #40025253
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А все это время на ПХП пишут сайты с поддержкой миллиардов одновременных коннектов и не запариваются о каком-то там риад-онли
как тебя ПХП-то задел. Ты это, раз с VB.NET не вышло, переходи на ПХП, смотри сколько там сладкого недавно вышло
...
Рейтинг: 0 / 0
async await в c#
    #40025265
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Ты это, раз с VB.NET не вышло, переходи на ПХП, смотри сколько там сладкого недавно вышло

Я еще несколько лет назад заглянул из любопытсва в книгу по ПХП. Да, в общем-то, язык как язык - там и ОО есть, и абстракции, и DI, и проч. Но, вот загадка загадок - почему же все-таки тогда на нем такой адский код все время пишут?
...
Рейтинг: 0 / 0
async await в c#
    #40025291
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Про кеширование там ни слова. Точно так же я могу "увидеть" сущность из DbContext и положить её в кеш, не задумываясь, что там могут быть "ленивые" свойства.




всё правильно не надо задумываться.. на сим, думаю пора закончить полемику, тут уже всё ясно
...
Рейтинг: 0 / 0
async await в c#
    #40025297
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Но, вот загадка загадок - почему же все-таки тогда на нем такой адский код все время пишут?
потому что он расшифровывается как personal home page, а не какой-нибудь энтерпрайс супер-пупер )
...
Рейтинг: 0 / 0
async await в c#
    #40025301
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Вот именно.

hVostt
это по сути косяк FCL

Это не косяк, потому "наследование" контракта (интерфейса), на самом деле, с наследованием не имеет ничего общего.


Ну я вроде дал чёткие осмысленные аргументы.
Хотелось бы нормальные контраргументы, а не демагогию :)
...
Рейтинг: 0 / 0
async await в c#
    #40025304
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
всё правильно не надо задумываться.. на сим, думаю пора закончить полемику, тут уже всё ясно

Ну а что человек увидел ДТО и положил его в кеш не думая. Завтра он точно так же не думая положит в кеш ссылку на Stream. И кто ему тогда "рукожопый виноват"? Класть в кеш что-то мутабельное это будет уже, по сути, рукожопый дизайн.
...
Рейтинг: 0 / 0
async await в c#
    #40025307
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ну а что человек увидел ДТО и положил его в кеш не думая. Завтра он точно так же не думая положит в кеш ссылку на Stream. И кто ему тогда "рукожопый виноват"? Класть в кеш что-то мутабельное это будет уже, по сути, рукожопый дизайн.


Рукожопый дизайн это не "класть", а "давать класть".

Если у тебя в DTO свойство типа IEnumerable, значит ты _даёшь_ возможность покласть всякую хрень.
Поэтому нужно конкретизировать.
...
Рейтинг: 0 / 0
async await в c#
    #40025308
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Хотелось бы нормальные контраргументы, а не демагогию :)

При чем тут демагогия. Наследование это заявка объекта "Я есть что-то", а реализация или "типа как наследование" контракта-интерфейса это "Я умею то-то". Read-write коллекция умеет все что умеет read-only коллекция, но при этом ей не является , т.к. может изменяться.
...
Рейтинг: 0 / 0
async await в c#
    #40025310
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Поэтому нужно конкретизировать.

Зачем это конкретизировать, если задачи DTO (сериализация, передача данных) IEnumerable полностью решает. Кому-то когда-нибудь придет потом в голову этим DTO еще и гвозди заколачивать - это тоже надо заранее предвидеть и под это заранее конкретизировать?
...
Рейтинг: 0 / 0
async await в c#
    #40025312
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
При чем тут демагогия. Наследование это заявка объекта "Я есть что-то", а реализация или "типа как наследование" контракта-интерфейса это "Я умею то-то". Read-write коллекция умеет все что умеет read-only коллекция, но при этом ей не является , т.к. может изменяться.


Ты путаешь экземпляр и интерфейс.
Интерфейс не позволяет менять коллекцию, но он говорит явно -- я коллекция.
Соответственно по самому контракту, если ты отдаёшь коллекцию как интерфейс IReadOnly, значит ты её не должен менять.

В идеале immutable, но в контексте .NET существующего бекграунда, IReadOnly коллекции -- разумный компромисс.
...
Рейтинг: 0 / 0
async await в c#
    #40025315
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
но он говорит явно -- я коллекция.

Он говорит только то, что он поддерживает определенные операции коллекции (те, которые коллекцию не меняют).
hVostt
В идеале immutable, но в контексте .NET существующего бекграунда

В коре System.Collections.Immutable есть начиная чуть ли не с первой версии. Мало кто про него знает только. Все пишут сайты на ПХП под миллиард одновременных пользователей
...
Рейтинг: 0 / 0
async await в c#
    #40025317
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
значит ты её не должен менять.

Я её и не смогу менять (потому что мне дали интерфейс только на read операции), но никто мне при этом не обещает что сам её менять не будет, если у него есть доступ к её полной реализации. DateTime мне тоже не дает Now самому менять, но это ведь совсем не означает, что оно само остается неизменным.
...
Рейтинг: 0 / 0
async await в c#
    #40025337
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
но он говорит явно -- я коллекция.

Он говорит только то, что он поддерживает определенные операции коллекции (те, которые коллекцию не меняют).


Я не понимаю с чем ты споришь, если честно.
Ситуация с изменением у IEnumerable абсолютно такая же, как IReadOnly коллекций.

Только IEnumerable -- это не коллекция,
а IReadOnlyCollection -- коллекция.

И семантика разная.

Если уж на то пошло, ты говорил, что "не против", как можно быть не против того, чего не понимаешь в принципе? Т.е. по-твоему, это лишний интерфейс? Есть IEnumerable?

Я если честно запутался.
Моё мнение такое, ты бездумно везде пихал IEnumerable в том числе в DTO-шки, и сейчас пытаешь опрадать себя, иных вариантов я не вижу твоей позиции
...
Рейтинг: 0 / 0
async await в c#
    #40025338
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
DateTime мне тоже не дает Now самому менять, но это ведь совсем не означает, что оно само остается неизменным.


Now это вообще функция, а не поле с данными.
Хороший пример, кстати, ибо IEnumerable по сути тоже есть функция (GetEnumerator), а не данные.
...
Рейтинг: 0 / 0
async await в c#
    #40025341
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
В коре System.Collections.Immutable есть начиная чуть ли не с первой версии. Мало кто про него знает только. Все пишут сайты на ПХП под миллиард одновременных пользователей


С какой ещё первой версии?
В каком-то 2012 году они появились.
А .NET в 2002-м:)
...
Рейтинг: 0 / 0
async await в c#
    #40025342
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ты бездумно везде пихал IEnumerable в том числе в DTO-шки

Ужаснешься - еще и других заставлял Но не бездумно, а вполне осмысленно - незачем использовать более конкретную абстракцию (а еще хуже её конкретную реализацию) там, где можно использовать более абстрактную. Если ты так делаешь, то ты создаешь потенциальные анальные ограничения и себе и другим. Потому что там где ты используешь абстракцию более высокого уровня ты всегда сможешь использовать абстракцию более низкого уровня (Liskov Substitution Principle), но не наоборот.
...
Рейтинг: 0 / 0
async await в c#
    #40025345
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
С какой ещё первой версии?

fkthat
В коре
...
Рейтинг: 0 / 0
async await в c#
    #40025346
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Now это вообще функция, а не поле с данными.

Ты, возможно, удивишься, но любое свойство Foo это вообще функция get_Foo()
...
Рейтинг: 0 / 0
async await в c#
    #40025362
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Дык не в коре они появились, ещё раньше в BCL.
Не совсем ясна привязка к коре :)


fkthat
Ужаснешься - еще и других заставлял Но не бездумно, а вполне осмысленно - незачем использовать более конкретную абстракцию (а еще хуже её конкретную реализацию) там, где можно использовать более абстрактную.


Сорян, но аргументы максимально нелепые. Пока что выглядит как бездумно, осмысленностью тут не пахнет. Если хочется супер-абстракции, ты гораздо больше получишь, если будешь использовать object и динамик.

fkthat
Если ты так делаешь, то ты создаешь потенциальные анальные ограничения и себе и другим.


Это какие? Контракт это как раз про ограничения. Если тебе они претят, тебе надо с C# уходить в JS там или VB. Там нет ограничений.

fkthat
Потому что там где ты используешь абстракцию более высокого уровня ты всегда сможешь использовать абстракцию более низкого уровня (Liskov Substitution Principle), но не наоборот.


IReadOnlyCollection наследует IEnumerable, так что не выдумывай.
...
Рейтинг: 0 / 0
async await в c#
    #40025363
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Now это вообще функция, а не поле с данными.

Ты, возможно, удивишься, но любое свойство Foo это вообще функция get_Foo()


Ну что тут сказать. Уел так уел..
...
Рейтинг: 0 / 0
async await в c#
    #40025372
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ты гораздо больше получишь, если будешь использовать object и динамик.
чуш и ересь.

hVostt
тебе надо с C# уходить в JS там или VB. Там нет ограничений.
чуш и ересь.


hVostt
IReadOnlyCollection наследует IEnumerable, так что не выдумывай.

Но не наоборот. Поэтому IEnumerable более абстрактен (выше уровень абстракции) чем IReadOnlyCollection.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
// хороший интерфейс
interface INice
{
    IEnumerable<int> GetNumbers();
    IEnumerable<int> MultiplyByTo(IEnumerable<int> nums);
    IEnumerable<int> AddOne(IEnumerable<int> nums);
}

class Nice: INice
{
    public IEnumerable<int> GetNumbers() => Enumerable.Range(0, 100);
    public IEnumerable<int> MultiplyByTo(IEnumerable<int> nums) => nums.Select(x => 2 * x);
    public IEnumerable<int> AddOne(IEnumerable<int> nums) => nums.Select(x => x + 1);
}

// анально-ограничивающий интерфейс
interface IUgly
{
    IReadOnlyCollection<int> GetNumbers();
    IReadOnlyCollection<int> MultiplyByTo(IReadOnlyCollection<int> nums);
    IReadOnlyCollection<int> AddOne(IReadOnlyCollection<int> nums);
}

//
// Ахтунг. Смотрим, как из-за анальности интерфейса приходится на каждый чих
// плодить коллекции в памяти (без всякой надобности)
// 
class Ugly: IUgly
{
    public IReadOnlyCollection<int> GetNumbers() => Enumerable.Range(0, 100).ToArray();
    public IReadOnlyCollection<int> MultiplyByTo(IReadOnlyCollection<int> nums) => nums.Select(x => 2 * x).ToArray();
    public IReadOnlyCollection<int> AddOne(IReadOnlyCollection<int> nums) => nums.Select(x => x + 1).ToArray();
}
...
Рейтинг: 0 / 0
async await в c#
    #40025373
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Но не наоборот. Поэтому IEnumerable более абстрактен (выше уровень абстракции) чем IReadOnlyCollection.


Object ещё более абстрактен, чем IEnumerable.


fkthat
hVostt
ты гораздо больше получишь, если будешь использовать object и динамик.
чуш и ересь.


Ты либо трусы одень, либо крестик сними.

Используй везде Object -- у него максимальная абстракция.
...
Рейтинг: 0 / 0
async await в c#
    #40025374
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Код: c#
1.
IEnumerable<int> AddOne(IEnumerable<int> nums);



Этот пример, где IEnumerable выглядит как уместный. AddOne может вернуть ленивое вычисление.

Я как бы нигде не утверждал, что IEnumerable плохой. Плохо его применять везде абсолютно.
Как пример: DTO, там он не уместен.

А ты защищаешь свой IEnumerable, как будто он тебе брат родной
...
Рейтинг: 0 / 0
async await в c#
    #40025394
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
у него максимальная абстракция.

У него максимальная абстракция, но она не подходит для задач того же ДТО. А IEmumerable подходит. И IReadOnlyCollection подходит, но она менее максимальная, чем IEnumerable.
...
Рейтинг: 0 / 0
async await в c#
    #40025397
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Как пример: DTO, там он не уместен.

Ну чем он не уместен, если он содержит все нужное для ДТО (т.е. просто пройтись, причем еще всего лишь один раз, по элементам коллекции)? Если оговорено, что это должен быть DTO, который можно, допустим, кешировать, крутить на болте и заколачивать им гвозди, то IEnumerable тут уже действительно не подойдет.
...
Рейтинг: 0 / 0
async await в c#
    #40025458
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
у него максимальная абстракция.

У него максимальная абстракция, но она не подходит для задач того же ДТО. А IEmumerable подходит. И IReadOnlyCollection подходит, но она менее максимальная, чем IEnumerable.


Весь смысл как раз здесь: "но она менее максимальная, чем IEnumerable" -- именно, чёрт подери!

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

Самый яркий признак джуна-быдлокодера, что он этого не понимает и везде пихает IEnumerable.

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

fkthat
Ну чем он не уместен, если он содержит все нужное для ДТО (т.е. просто пройтись, причем еще всего лишь один раз, по элементам коллекции)? Если оговорено, что это должен быть DTO, который можно, допустим, кешировать, крутить на болте и заколачивать им гвозди, то IEnumerable тут уже действительно не подойдет.


Потому что DTO это транспортный объект, это полностью материализованные данные в памяти. Без всяких ленивых вычислений. Оно уже исходя из семантики оговорено , на любом уровне ты должен иметь возможность читать многократно DTO и хранить в памяти.

Поэтому для DTO IEnumerable не подходит. По этой причине.
...
Рейтинг: 0 / 0
async await в c#
    #40025534
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Но когда тебе нужен результат для однократного прохода

В каком хрустальном шаре чувак, который сегодня пишет интерфейс и его реализацию должен угадать, для чего мне его результат будет нужен через неделю?

hVostt
это полностью материализованные данные в памяти.

Я давал тут ссылку - ничего про какую-то обязательную материализованность и хранение в памяти там нет.

hVostt
на любом уровне ты должен иметь возможность читать многократно DTO и хранить в памяти.

А почему бы еще не возможность сохранения на диск, отправки по емейл и распечатки на принтер - вот, мне так хочется, например, у меня задачи такие, что мне надо ДТО емейлом рассылать и на принтер печатать.
...
Рейтинг: 0 / 0
async await в c#
    #40025645
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
В каком хрустальном шаре чувак, который сегодня пишет интерфейс и его реализацию должен угадать, для чего мне его результат будет нужен через неделю?


Как я говорил, если тебе нужен супер уровень абстракции, используй Object.

Откуда ты знаешь, сегодня нужен IEnumerable, а завтра тебе вообще объект своего класса там понадобится, а послезавтра строка или число.
...
Рейтинг: 0 / 0
async await в c#
    #40025768
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так и знал, срач ниочом
...
Рейтинг: 0 / 0
async await в c#
    #40025771
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt - чувак, у тебя странный код, что в DTO может быть что-то такое, как ты говорил про IEnumerable

а если нет - то и суда нет















.
...
Рейтинг: 0 / 0
async await в c#
    #40025773
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче так и не увидел ничего реально значимого. какая-то религия
...
Рейтинг: 0 / 0
async await в c#
    #40025774
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Откуда ты знаешь, сегодня нужен IEnumerable, а завтра тебе вообще объект своего класса там понадобится

Нет. Сегодня мне нужно то, что я могу перебрать элемент за элементом, и это именно IEnumerable. А, если мне завтра что-то понадобится, то я уже на стороне вызова заверну или превращу этот IEnumerable именно в то, что мне в данном случае нужно, и не буду вперед заморачиваться, что послезавтра понадобится, тем более не мне, а Васе или Пете.
...
Рейтинг: 0 / 0
async await в c#
    #40025809
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Откуда ты знаешь, сегодня нужен IEnumerable, а завтра тебе вообще объект своего класса там понадобится

Нет. Сегодня мне нужно то, что я могу перебрать элемент за элементом, и это именно IEnumerable. А, если мне завтра что-то понадобится, то я уже на стороне вызова заверну или превращу этот IEnumerable именно в то, что мне в данном случае нужно, и не буду вперед заморачиваться, что послезавтра понадобится, тем более не мне, а Васе или Пете.


Ну и в чём противоречие? Я вроде об этом и говорил, когда тебе нужна максимальная обобщённая последовательность, и тебе не важно, коллекция это, генератор, или отложенный запрос в БД -- берёшь IEnumerable.

Когда у тебя по семантике это коллекция, то использовать IEnumerable не очень хорошо, для этого есть более специфичные интерфейсы, но при этом достаточно свободные для любых манёвров.

В чём проблема-то? Контраргументы дикие какие-то, непонятно к чему ты их приплетаешь. Дескать если там когда-то в будущем бла-бла, что за хрень это вообще? Однозначно к такому посылу, один ответ -- бери object -- он максимально общий и максимально абстрактный. И всё ещё не понимаю, чем тебе object-то не нравится. Это же супер-абстракция, на любые случаи в жизни, о которых ты не узнаешь в хрустальном шаре
...
Рейтинг: 0 / 0
async await в c#
    #40025810
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А, если мне завтра что-то понадобится, то я уже на стороне вызова заверну или превращу этот IEnumerable именно в то, что мне в данном случае нужно, и не буду вперед заморачиваться, что послезавтра понадобится, тем более не мне, а Васе или Пете.


Короче хз, это демагогия, а не аргументы :)
...
Рейтинг: 0 / 0
async await в c#
    #40025816
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
один ответ -- бери object

Ему говорят, что бухать плохо, а он в ответ "давайте тогда пить только воду". И после этого говорит о демагогии.
...
Рейтинг: 0 / 0
async await в c#
    #40025818
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
один ответ -- бери object

Ему говорят, что бухать плохо, а он в ответ "давайте тогда пить только воду". И после этого говорит о демагогии.


Так это я говорю, что бухать (использовать всегда IEnumerable во всех случаях) плохо. Пей (используй IEnumerable) разумно, тогда это действительно уместно.
...
Рейтинг: 0 / 0
async await в c#
    #40025820
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
используй IEnumerable

Я уже запутался - ты только что советовал использовать object.
...
Рейтинг: 0 / 0
async await в c#
    #40025825
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
используй IEnumerable

Я уже запутался - ты только что советовал использовать object.


Да забей уже ))
...
Рейтинг: 0 / 0
88 сообщений из 88, показаны все 4 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / async await в c#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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