|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Я уже не помню как и откуда, но усвоил никогда не возвращать из метода интерфейс, а только конкретный тип. ЕМНИП если возвращать интерфейс, страдает производительность. Но тут попал в дурдом, где все методы возвращают интерфейсы. Типа Код: c# 1.
против привычного Код: c# 1.
Помогите объяснить в конкретных терминах, чем это плохо. Нутром чую что это неправильно, но уже не помню откуда это взял. Вариант где может вернуться разный класс не рассматриваются Код: c# 1. 2. 3. 4. 5.
В этой конкретной ситуации метод возвращает только один тип. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 23:15 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
если речь про скорость вызова метода через класс или интерфейс то этим можно пренебречь. Есть такой принцип что нужно отдавать максимально специфичный тип и потреблять максимально общий. Я с ним не согласен и предпочитаю потреблять и отдавать максимально общий тип в контексте задачи, естественно. IEnumerable стоит особняком, с ним лучше аккуратнее так как он может быть реализован по разному и может получится что один и те же тяжелые вычисления(ну ил запросы куда то) делаются много раз + возможны ленивые вычисления. Я часто предпочитаю IReadonlyCollection, если в методе кроются вычисления. Иногда приходится тип делать более конкретным, но все равно предпочитаю оставлять его общим в рамках задачи. К примеру, если я знаю что возвращаю коллекцию по логике в которой нужно будет что то искать, я по ситуации могу вернуть, например, ISet<> ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 23:47 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Gobzo Koblerпротив привычного Код: c# 1.
Никогда. Ещё раз. Никогда. Публичные методы. Не должны. Возвращать List !!! Насчёт IEnumerable. Всё верно, если возвращать IEnumerable, производительность страдает. Но страдает не только производительность, это семантически не верно в большинстве случаев. IEnumerable это БЕСКОНЕЧНОЕ перечисление по своей сути. Конечно, оптимизированные методы пытаются привести его к ICollection, чтобы прочитать количество элементов. Основной свод правил такой: Возвращаем (в порядке предпочтительности) 1. IReadOnlyCollection 2. IReadOnlyList 3. ICollection 4. IList 5. [] -- массив 5. IEnumerable (только в случаях, когда возвращаемый набор данных вычисляется лениво, например, с помощью LINQ или yield). Но никогда нельзя возвращать List! Принимам (в порядке предпочтительности) 1. IReadOnlyCollection 2. IReadOnlyList 3. IEnumerable (только в том случае, если принимающий метод проходит по списку один раз и заранее ему не требуется знать количество элементов) 4. ICollection 5. IList 6. [], params [] Нет, нельзя принимать List! По поводу List. Его можно использовать только внутри реализации, можно принимать/отдавать только внутри приватных методов, даже не protected, только private. Gobzo KoblerЯ уже не помню как и откуда, но усвоил никогда не возвращать из метода интерфейс, а только конкретный тип. Я понятия не имею, откуда вам удалось «усвоить» этот бред. Но выкиньте его из головы. Если желаете работать на профессиональном уровне, в достойных командах, не делайте так. Всегда предпочитайте интерфейсы в публичных контрактах. Конечно без фанатизма, так как есть и обратный вариант тупизны, это везде бездумно использовать IEnumerable, это тоже не правильно, и как раз тут может пострадать и производительность и даже вовсе код может работать неправильно, так как IEnumerable это однопроходная коллекция, только для чтения. Никто не гарантирует, что при втором проходе вы получите тот же результат или вообще не словите ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 01:20 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Gobzo Koblerпротив привычного Код: c# 1.
Как же долго нам приходится выбивать вот эту дурь из головы джуниоров. Сколько копий сломано... Ээээх... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 01:24 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Gobzo KoblerПомогите объяснить в конкретных терминах, чем это плохо. Объясняю на пальцах. Возвращая List, вы по сути выставляете кишками наружу реализацию. Естественно, это будет не единичный случай, другие методы будут ожидать List. Ещё хуже это сказывается при использовании generics, например, для async/await. Просто физически будет крайне сложно провести хоть какой-то рефакторинг. Например, проксировать, декорировать коллекции будет тупо невозможно. Невозможно будет заменить List на более подходящую в данном конкретном случае коллекцию. А также с тестированием будут сложности и проблемы. На каком-нибудь лабораторном примере из сотни строк кода, да, проблему здесь трудно увидеть. Но лучше изначально приучать себя кодить правильно, а не как джун. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 01:29 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
hVosttЕщё хуже это сказывается при использовании generics, например, для async/await. И ко/контрвариантность работает только с интерфейсами, для классов будет облом. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 03:44 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныhVosttЕщё хуже это сказывается при использовании generics, например, для async/await. И ко/контрвариантность работает только с интерфейсами, для классов будет облом. Спасибо за дополнение :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 03:50 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Ко/контравариантность в C# это реализация принципов Контрактного программирования (DbC). Собственно, ковариантность - это _возвращение_ типа, производного от базового (который определен в интерфейсе C#) - это контракты на то, что возвращаемое значение/тип (посткондиция в терминах DbC) вызывающей ф-ции/производного класса должны оба удовлетворяться (в т.ч быть совместимыми по типам). Т.е возвращаемый тип должен ужесточать/сужать требования по типу и значениям! Аналогично, контравариантность - это _получение_ типа, производного от базового. И является прекондицией - в этом случае в вызывающей функции/производном классе должно выполняться хоть один из контрактов(для шарпа это применяется в делегатах). Таким образом по иерархии классов в сторону наследников или субвызовов мы можем расширять принимаемые типы. Так что тов.Хвост, с точки зрения абстрактной теории, таки прав на 50%. На практике же все не так однозначно. Конечно, придется рефакторить при смене иерархий, но зато мы исключаем(снижаем) вероятность такого замечательного Иксепшна "Ой, а что это за неизвестный тип мне прилетел, я не умею!" Ну а с точки зрения производительности .vs. C# + интерфейсы это уже совсем попендикулярная история. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 09:18 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
hVosttGobzo KoblerПомогите объяснить в конкретных терминах, чем это плохо. Объясняю на пальцах. Возвращая List, вы по сути выставляете кишками наружу реализацию. Естественно, это будет не единичный случай, другие методы будут ожидать List. Ещё хуже это сказывается при использовании generics, например, для async/await. Просто физически будет крайне сложно провести хоть какой-то рефакторинг. Например, проксировать, декорировать коллекции будет тупо невозможно. Невозможно будет заменить List на более подходящую в данном конкретном случае коллекцию. А также с тестированием будут сложности и проблемы. На каком-нибудь лабораторном примере из сотни строк кода, да, проблему здесь трудно увидеть. Но лучше изначально приучать себя кодить правильно, а не как джун.Ну давай класс String тоже за интерфейсом скроем... А то мало ли чего... Простите, не удержался... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 09:53 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Алексей КНу давай класс String тоже за интерфейсом скроем... А то мало ли чего... Простите, не удержался... Толку его скрывать за интерфейсом, если он иммутабельный. Вот StringBuilder - ага, можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 10:15 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Siemarglно зато мы исключаем(снижаем) вероятность такого замечательного Иксепшна "Ой, а что это за неизвестный тип мне прилетел, я не умею!" Возможность ко/контрвариации контролируются на этапе компиляции. О каком эксепшене речь? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 10:18 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
SiemarglТак что тов.Хвост, с точки зрения абстрактной теории, таки прав на 50%. На практике же все не так однозначно. У нас кодовая база на 100% этому следует. На практике, приходят джуны и начинают городить List<T>. Вот и всё. SiemarglКонечно, придется рефакторить при смене иерархий, но зато мы исключаем(снижаем) вероятность такого замечательного Иксепшна "Ой, а что это за неизвестный тип мне прилетел, я не умею!" Вот здесь не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 10:25 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Алексей КНу давай класс String тоже за интерфейсом скроем... А то мало ли чего... Простите, не удержался... Да ты... да понятно уже всё с тобой ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 10:26 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 10:27 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
hVostt, нельзя так категорично, в разных ситуациях используют разную логику. возьмём к примеру ItemsControl Код: c# 1.
пожалуйста, никаких интерфейсов и свойство Public. Вариантов таких много. Меня больше раздражает то, что интерфейсы очень часто используют там, где они нафиг не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 11:46 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныАлексей КНу давай класс String тоже за интерфейсом скроем... А то мало ли чего... Простите, не удержался... Толку его скрывать за интерфейсом, если он иммутабельный. Вот StringBuilder - ага, можно.Ну и что, что иммутабельный... Надо возвращать IEnumerable<char> . А то вдруг чего! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 12:25 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Roman Mejtesнельзя так категорично, в разных ситуациях используют разную логику. возьмём к примеру ItemsControl Код: c# 1.
пожалуйста, никаких интерфейсов и свойство Public. Вариантов таких много. ItemCollection, это изначально публичный контракт. Но даже такого в фреймворке уже с недавних пор все меньше и меньше. Roman MejtesМеня больше раздражает то, что интерфейсы очень часто используют там, где они нафиг не нужны. Например? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 13:52 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Алексей КНу и что, что иммутабельный... Надо возвращать IEnumerable<char> . А то вдруг чего! Чего сказать-то хотел? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 13:53 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
hVosttGobzo KoblerПомогите объяснить в конкретных терминах, чем это плохо. Объясняю на пальцах. Возвращая List, вы по сути выставляете кишками наружу реализацию. Естественно, это будет не единичный случай, другие методы будут ожидать List. Ещё хуже это сказывается при использовании generics, например, для async/await. Просто физически будет крайне сложно провести хоть какой-то рефакторинг. Например, проксировать, декорировать коллекции будет тупо невозможно. Невозможно будет заменить List на более подходящую в данном конкретном случае коллекцию. А также с тестированием будут сложности и проблемы. На каком-нибудь лабораторном примере из сотни строк кода, да, проблему здесь трудно увидеть. Но лучше изначально приучать себя кодить правильно, а не как джун. Полностью поддерживаю!!! Плюс еще одна тонкость - затраты времени на выделение и запись в памяти. List или Array это статические объекты, в которые нужно выделить и в них аккуратненько сложить данные. А потом, чаще всего, по ним просто так "быстро пробегают" итератором. Да пробежать сферический, уже подготовленный, список - быстрее по индексу. Но если данные изначально должнны быть откуда-то (с помощью LINQ хе-хе) найдены, а потом запихнуть их в список - прощай производительность и быстродействие, а потом рассказывают байки что LINQ тормозной и память жрет. Лучше вообще не использовать всякие там ToList и ToArray ;) начинающими. Так что, если вы знаете что LINQ запрос вернет миллион значений, нужно очень сильная необходимость для складывания этого дела в список, лучше уж вернуть IEnumerable наверх для дальнейших действий. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 13:57 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
eny, Вопрос был не про linq, а про то в чем возвращать список из 10 строк. Справочник валют какой нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 15:46 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
hVosttАлексей КНу и что, что иммутабельный... Надо возвращать IEnumerable<char> . А то вдруг чего! Чего сказать-то хотел? ) Ну юмор у него на 5 баллов))). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 15:47 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Roman MejtesМеня больше раздражает то, что интерфейсы очень часто используют там, где они нафиг не нужны.+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 15:50 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Petro123Roman MejtesМеня больше раздражает то, что интерфейсы очень часто используют там, где они нафиг не нужны.+1 Так можно сказать про что угодно. Единственный момент, что можно исправить, это перестать раздражаться )) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 16:59 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныSiemarglно зато мы исключаем(снижаем) вероятность такого замечательного Иксепшна "Ой, а что это за неизвестный тип мне прилетел, я не умею!" Возможность ко/контрвариации контролируются на этапе компиляции. О каком эксепшене речь?Когда ты получил максимально общий (базовый) тип на возврате - часто придется приводить тип к нужному потомку. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 17:30 |
|
Производительность - возвращенный интерфейс
|
|||
---|---|---|---|
#18+
Petro123eny, Вопрос был не про linq, а про то в чем возвращать список из 10 строк. Справочник валют какой нибудь. Тогда вообще никакой разницы в быстродействии, но использование IEnumerable предпочтительней, ибо дает определенную гибкость и архитектурные плюшки. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 17:33 |
|
|
start [/forum/topic.php?fid=20&msg=39628794&tid=1399417]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 179ms |
0 / 0 |