|
async await в c#
|
|||
---|---|---|---|
#18+
2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2020, 12:41 |
|
async await в c#
|
|||
---|---|---|---|
#18+
Roman Mejtes 2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2020, 12:51 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat Roman Mejtes 2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел. Ваша музыка говно, потому что она говно © ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2020, 19:51 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat Roman Mejtes 2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел. Я тоже не понял, чем плохо IEnumerable в Dto. "Музыка говно" - так себе аргумент ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2020, 18:46 |
|
async await в c#
|
|||
---|---|---|---|
#18+
hVostt fkthat, Мужик юзает IReadOnly*** коллекции, а не две идиотские крайности: List<T> или IEnumerable<T>... Прям тепло на душе стало :) Ты часто про эти крайности. Аргументировать можешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2020, 18:48 |
|
async await в c#
|
|||
---|---|---|---|
#18+
love_bach fkthat пропущено... Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел. Я тоже не понял, чем плохо IEnumerable в Dto. "Музыка говно" - так себе аргумент Это состояние объекта - лучше, чтобы оно несло больше информации. А если я захочу узнать кол-во элементов, то придется выполнять дополнительную логику по вызову IEnumerable.Count(). А если это List<T> или, IReadOnlyCollection - то просто получаем его через свойство. А IEnumerable<T> удобно юзать в конкретных действиях, то есть, например, мы знаем, что нам надо только перебрать эту коллекцию, и обновить состояния, и больше ничего, то IEnumerable зайдет. Это вопрос интерфейсов взаимодействия - что надо для работы, то и запрашиваешь, типа того. Не музыка гавно, а конкретный исполнитель. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 20:49 |
|
async await в c#
|
|||
---|---|---|---|
#18+
Kusanagi А если это List<T> Возвращать конкретный класс вместо абстракции это вообще ни разу нет. Против конкретно IReadOnlyCollection я ничего не имею, писал просто о том, что не вижу каких-то особых причин топить за него против IEnumerable, равно как и наоборот. IEnumerable это самая абстрактная абстракция любой коллекции, а чем более абстракные абстракции ты в коде используешь, тем этот код в конечном результате гибче. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 21:40 |
|
async await в c#
|
|||
---|---|---|---|
#18+
Да блин. Передача интерфейса коллекции предотвращает перебор. Потребитель IEnumerable не знает, можно ли спокойно перебирать твой IEnumerable или нужно его материализовывать. При этом IEnumerable обычно ленивый, он для таких кейсов и предназначен. Вот я помню делал метод, который давал на выходе IEnumerable<XNode> и который - перебирал папки на ftp - скачивал оттуда zip-файлы по одному - распаковывал из них лежащие внутри xml-файлы (по одному) - в конкретном файле перебирал ноды по заранее заданному пути и возвращал их Смысл в том, что нужно было на ftp найти нужный файл по содержимому, при этом абстрагировать поисковик от источника интерфейсом. Именно интерфейс IEnumerable позволял прервать весь процесс, как только найден нужный файл. И что? Если ты попытаешься проитерировать несколько раз этот результат - ты несколько раз будешь качать мегабайты файлов с интернета. Для того тебе и дается интерфейс IEnumerable, чтобы ты понимал, что он ленивый и не надо его итерировать несколько раз. А когда тебе возвращают коллекцию, ты понимаешь, что это фиксированный результат, итерировать его можно, материализовывать лишний раз не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 22:27 |
|
async await в c#
|
|||
---|---|---|---|
#18+
Shocker.Pro Потребитель IEnumerable не знает, можно ли спокойно перебирать твой IEnumerable или нужно его материализовывать. Так перебирать-то можно спокойно, на то он и I_ Enum _erable. А материализовывать нужно только если это нужно. А в случае с возвратом коллекции её так или иначе придется материализовывать в реализации интерфейса и повлиять на это ты уже никак не можешь, даже если тебе "снаружи" эта материализация вообще не нужна. Вот, допустим, я ради своего чувства прекрасного написал такой метод в интерфейсе: Код: c# 1.
а тебе его реализовывать. И ты сидишь, и проклинаешь мое рукожопие, потому что тебе надо из-за моей причуды сто пятисотгиговых файлов с ftp качать. Конечно, ты выкрутишься, напрример, кастомной реализацией (допустим, Count получать простым запросом "ls", а сами файлы "лениво"), но оно разве надо эти костыли мастерить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 23:57 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat hVostt говнокод hVostt формат говнокодинга При этом ни одного аргумента. Зачем ты меня заставляешь повторяться? Я всё сказал, но ты игнорируешь. Семантически IEnumerable -- это бесконечная ленивая последовательность. За ней легко может быть генератор (yield), ленивая выборка из БД или из внешнего сервиса. Каждый повторный проход по такой последовательности может легко приводить к повторным вычислениям, повторным запросам к БД или к внешнему сервису. Плюс, повторный проход может абсолютно легально по интерфейсу и семантике возвращать разный результат и разное количество. Массив, IReadOnlyCollection/List -- это семантически неизменная материальная коллекция. По ней можно безопасно ходить сколько угодно раз. У неё есть заранее известное количество. Уместно принимать на вход IEnumerable, когда мы знаем, что данные будут обработаны одним проходом. Возвращать также уместно в том случае, когда это не обязательно коллекция, а что угодно. Любая реализация. Если ты не знаешь когда тебе применять IEnumerable, значит есть проблемы с пониманием того, как писать хорошо сопровождаемый, ясный, правильный код, в котором возможность выстрелить себе в ногу сведены к минимуму. fkthat А hVostt В дтошке должна быть коллекция, или массив hVostt я художник, я так вижу, Я вроде всё достаточно ясно пояснил. ДТО-шка это материализованный, конечный результат. Так как он используется для сериализации/десериализации, то коллекции в нём должны быть коллекциями, а не ленивыми последовательностями. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 12:45 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat Roman Mejtes 2_fkthat, сам же знаешь, что не прав, но набрасываешь на вентилятор Ну так кто-нибудь объяснит толком, в чем неправ? Пока что никаких аргументов кроме "это говнокод, потому что я считаю это говнокодом" я не увидел. Возможно, плохо смотрел. Да ты просто не читал, что я писал. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 12:46 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat Возвращать конкретный класс вместо абстракции это вообще ни разу нет. Против конкретно IReadOnlyCollection я ничего не имею, писал просто о том, что не вижу каких-то особых причин топить за него против IEnumerable, равно как и наоборот. IEnumerable это самая абстрактная абстракция любой коллекции, а чем более абстракные абстракции ты в коде используешь, тем этот код в конечном результате гибче. Нельзя "ничего не иметь против", каждый инструмент нужно применять по назначению. Просто за IEnumerable новички, любители видят коллекцию -- но это не так. Как только придёт осознание, что IEnumerable это не коллекция, а ленивая бесконечная последовательность, то всё станет на свои места. Тогда будет понятно когда применять IEnumerable, а когда интерфейсы коллекций или массивы. Если такого понимания нет, то нужно прежде к нему прийти, а потом дискутировать дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 12:48 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat Вот, допустим, я ради своего чувства прекрасного написал такой метод в интерфейсе: Код: c# 1.
а тебе его реализовывать. И ты сидишь, и проклинаешь мое рукожопие, потому что тебе надо из-за моей причуды сто пятисотгиговых файлов с ftp качать. Конечно, ты выкрутишься, напрример, кастомной реализацией (допустим, Count получать простым запросом "ls", а сами файлы "лениво"), но оно разве надо эти костыли мастерить? Его не надо реализовывать. Здесь, например, ты явно говоришь, что возвращаешь материализованную коллекцию, значит от FTP можно отцепиться, а не держать коннект. Бла, ну разве это не очевидно? ))) Я как бы не против. Но свои пояснения, довольно конкретные я дал. Никого принуждать ни к чему не собираюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 12:50 |
|
async await в c#
|
|||
---|---|---|---|
#18+
hVostt ДТО-шка это материализованный, конечный результат. ДТО-шка это всего лишь "непонятная х...ня" для того чтобы передать что-то куда-то как один объект. hVostt Так как он используется для сериализации/десериализации, то коллекции в нём должны быть коллекциями, а не ленивыми последовательностями. Ленивая последовательность точно так же прекрасно и сериализуется и мепится, и все что угодно, что требует только её перебора. hVostt Семантически IEnumerable -- это бесконечная ленивая последовательность Где написано, что она обязательно бесконечная, обязательно ленивая, и, даже, обязательно последовательность? Для меня IEnumerable это просто "то, что можно поэлементно перебрать". hVostt IReadOnlyCollection/List -- это семантически неизменная материальная коллекция Это всего лишь интерфейс, который сам по себе не дает даже никакой гарантии, что последовательные вызовы Count и Count() вернут одно и тоже. То что она "ReadOnly" означает только то, что тебе она не выставляет методы для изменения, но не означает, что её никто вообще не может поменять. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:01 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat, Я тебе пример факапа приведу, как раз из самого свежего на моих проектах. На одном проекте, который достался по наследству, джамшуты в ДТОшках юзали IEnumerable. Всё вроде работало, а потом после очередной доработки всё накрылось п..дой. Что сделали? В одном методе добавили кеширование результата, ДТО-шки, в которой был IEnumerable. А заполнялся он лениво с вычислениями, походами в две разные БД. Разработчик сделал всё правильно. Видит, в ДТО-шке IEnumerable, сервис возвращает IEnumerable, ну и присвоил, по типам всё ок. Ругать его за это нельзя. Ругать надо криворуких рукожопов, которые не могли использовать массив или интерфейс коллекции в ДТО, тогда разработчик физически должен был материлизовать полученный IEnumerable. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:03 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat hVostt Семантически IEnumerable -- это бесконечная ленивая последовательность Где написано, что она обязательно бесконечная, обязательно ленивая, и, даже, обязательно последовательность? Для меня IEnumerable это просто "то, что можно поэлементно перебрать". Ну перебери мне это: Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:05 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat hVostt IReadOnlyCollection/List -- это семантически неизменная материальная коллекция Это всего лишь интерфейс, который сам по себе не дает даже никакой гарантии, что последовательные вызовы Count и Count() вернут одно и тоже. То что она "ReadOnly" означает только то, что тебе она не выставляет методы для изменения, но не означает, что её никто вообще не может поменять. Ни один интерфейс не даёт 100% гарантии реализации. Я тебе и IEnumerable могу реализовать, которые будет делать что угодно, и плеваться исключениями в зависимости от фазы луны. Сам интерфейс -- это контракт. И да, контракт IReadOnlyCollection обещает, что никто не будет коллекцию менять, и что она неизменна. А кривая реализация, это уже либо саботаж, либо рукожопство. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:07 |
|
async await в c#
|
|||
---|---|---|---|
#18+
hVostt Ругать надо криворуких рукожопов Рукожопый как раз тот, кто кешировал IEnumerable не материализуя его. И ругать надо именно его. hVostt Ну перебери мне это Почему бы нет, легко. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:16 |
|
async await в c#
|
|||
---|---|---|---|
#18+
hVostt И да, контракт IReadOnlyCollection обещает, что никто не будет коллекцию менять, и что она неизменна. Ничего он не обещает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:19 |
|
async await в c#
|
|||
---|---|---|---|
#18+
hVostt А кривая реализация, это уже либо саботаж, либо рукожопство. T[], List<T>, HashSet<T>, Stack<T>, Queue<T> это все кривые реализации рукожопых саботажников ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:22 |
|
async await в c#
|
|||
---|---|---|---|
#18+
fkthat hVostt А кривая реализация, это уже либо саботаж, либо рукожопство. T[], List<T>, HashSet<T>, Stack<T>, Queue<T> это все кривые реализации рукожопых саботажников ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:33 |
|
async await в c#
|
|||
---|---|---|---|
#18+
Shocker.Pro Ты привел примеры реализации коллекций Я привел примеры кривых и рукожопых реализаций IReadOnlyCollection - все они его реализуют :)) Говоря более обще - "read only" это еще не обязательно "immutable". ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:37 |
|
async await в c#
|
|||
---|---|---|---|
#18+
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, так как эти интерфейсы были добавлены слишком поздно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:49 |
|
async await в c#
|
|||
---|---|---|---|
#18+
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 и положить её в кеш, не задумываясь, что там могут быть "ленивые" свойства. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 14:01 |
|
|
start [/forum/topic.php?fid=18&msg=40025203&tid=1354595]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 169ms |
0 / 0 |