powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / async await в c#
25 сообщений из 88, страница 2 из 4
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
25 сообщений из 88, страница 2 из 4
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / async await в c#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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