|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Волею судеб пришлось временно перейти с Java на .Net. Пишу, значит, разный относительно _низкоуровневый_ код, и доходит дело до написания универсального обработчика коллекций. И у меня просто волосы встают дыбом от того, как имплементированы коллекции в .Net. Это просто стыд и срам. 1) ICollection не имеет метода Add. ICollection<> имеет. IDictionary<> имеет. Даже IDictionary имеет. А ICollection нет. То есть это абсолютно бессмысленный интерфейс, который не добавлять практически ничего полезного к IEnumerable. В итоге, если у меня есть в руках ICollection, я не могу добавить туда элемент. Стыд и срам. 2) Нет общей иерархии классов. ICollection<> не имеет ничего общего с ICollection. С Dictionary та же проблема. В итоге, что бы определить, что у меня в руках коллекция, нужно писать трехэтажные неэффективные выражения через рефлекшн. 3) Иерархия некоторых коллекций просто повергает в ужас. Например, ConcurrentDictionary<> имплементирует IDictionary<>, логично. Наверное, тогда и типизированный ConcurrentBag<> будет имлементировать ICollection<>, правда? Неа, он имплементирует ICollection, и какой-то совершенно идиотский типизированный producer-consumer. 4) Нет кучи полезных специализированных коллекций. Нет read-only коллекций (вернее, есть одна - для списка, а set? а dictionary?), конкаррент коллекции появились только в 4.0 и имеют отвратительнейшую иерархию, нет synchronized-оберток, как в Java. Поэтому для реализации банальнейшего сценария - выдать пользователю unmodifiable коллекцию, что бы он не наломал дров - нужно писать какие-то свои обретки. А с имеющейся иерархией попробуйте ка написать универсальную такую обертку И весь этот сыр бор нужен только для того, что бы иметь в рантайме информацию о дженерик типе. В Джава этой информации нет, type erasure. Верите-нет, но она на практике нафиг никому не нужна. Лежат в коллекции объекты, и лежат. Зато есть простая и лаконичная иерархия классов, с которой работать - одно удовольствие. После нее от всего этого стыдобища в .Net просто глаза на лоб лезут. Вопрос - кто проектировал это? Вам комфортно работать с коллекциями в .Net? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2014, 23:55 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
cdtyjvВам комфортно работать с коллекциями в .Net? да. Особенно при использовании Linq For Objects ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2014, 23:57 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
cdtyjv[...бред поскипан...]Очередное свеномное обострение... За сим предлагаю топик закрыть. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 00:11 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
cdtyjv1) ICollection не имеет метода Add. ICollection<> имеет. IDictionary<> имеет. Даже IDictionary имеет. А ICollection нет. То есть это абсолютно бессмысленный интерфейс, который не добавлять практически ничего полезного к IEnumerable. В итоге, если у меня есть в руках ICollection, я не могу добавить туда элемент. Стыд и срам. свойство Count. а у IEnumerable его нет, который вообще может быть бесконечной «коллекцией». ICollection и ICollection<T> -- разные по смыслу и замыслу интерфейсы, это совсем не тоже самое «только с типом». это и касается IDictionary/IDictionary<T>. но детский неокрепший мозг видит одинаковые слова , и его мир начинает рушится... cdtyjv2) Нет общей иерархии классов. ICollection<> не имеет ничего общего с ICollection. С Dictionary та же проблема. В итоге, что бы определить, что у меня в руках коллекция, нужно писать трехэтажные неэффективные выражения через рефлекшн. конечно, а с какого перепугу, это вдруг, должно? я не понял, зачем себя ставить в такую идиотскую ситуацию, чтобы выяснять «что за коллекция»? cdtyjv3) Иерархия некоторых коллекций просто повергает в ужас. Например, ConcurrentDictionary<> имплементирует IDictionary<>, логично. Наверное, тогда и типизированный ConcurrentBag<> будет имлементировать ICollection<>, правда? Неа, он имплементирует ICollection, и какой-то совершенно идиотский типизированный producer-consumer. всё логично, если подумать тем местом, что называется голова. я же сказал ICollection и ICollection<T> никак не коррелируют друг с другом, да и были спроектированы с довольно большим интервалом времени. кое что доосмыслилось при проектировании типизированных коллекций, а старое менять нельзя, надеюсь сам понимаешь почему. очень надеюсь. cdtyjv4) Нет кучи полезных специализированных коллекций. Нет read-only коллекций (вернее, есть одна - для списка, а set? а dictionary?), конкаррент коллекции появились только в 4.0 и имеют отвратительнейшую иерархию, нет synchronized-оберток, как в Java. Поэтому для реализации банальнейшего сценария - выдать пользователю unmodifiable коллекцию, что бы он не наломал дров - нужно писать какие-то свои обретки. А с имеющейся иерархией попробуйте ка написать универсальную такую обертку всё там есть. IReadOnlyDictionary, IReadOnlyCollection и IReadOnlyList. для ISet видимо это без надобности, т.к. есть IsReadOnly на такой редкий случай. cdtyjvВ Джава этой информации нет, type erasure. Верите-нет, но она на практике нафиг никому не нужна. когда была жёсткая необходимость покодить на Java, я чуть не блеванул. серьёзно. хотя знаю, что имеются толпы миллионов Java-кодеров, которые вполне комфортно себя чувствуют в среде Java, но лично я после C# на Java чувствовал себя вышвырнутым за пределы нормальной цивилизации. cdtyjvВопрос - кто проектировал это? много людей, соответственно до идеала конечно далеко. cdtyjvВам комфортно работать с коллекциями в .Net? вполне. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 01:09 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
cdtyjv, чтоб понять, почему ICollection<T> никак не может наследоваться от ICollection, рассмотрим вот такую коллекцию: Код: c# 1.
благодаря тому, что .NET точно знает тип и размер элементов коллекции, он может разместить их эффективно в непрерывном блоке памяти . приведём эту коллекцию к ссылке на интерфейс ICollection, который представляет собой коллекцию, хранящую какие-то Object, т.е. ссылки на объекты в куче. стоит заморачиваться и объяснять, почему это в принципе невозможно? с другой стороны может возникнуть вопрос, почему же тогда можно привести типизированную коллекцию к нетипизированному IEnumerable? ответ прост. потому что IEnumerable это вовсе не коллекция по сути. это интерфейс, который содержит метод, возвращающий итератор. итератор же упаковывает значение элемента и возвращает ссылку (это называется boxing, и в случае, если не применяется duck typing), или просто ссылку, если элементы коллекции являются экземплярами класса. в Java таких заморочек нет, потому что там нет типов-значений, что позволяет .NET уделывать Java как котёнка в плане производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 01:46 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
hVostt, автор это интерфейс, который содержит метод, возвращающий итератор. итератор же упаковывает значение элемента и возвращает ссылку в типизированых коллекциях, в случае со значениями, упаковки не проходит, там даже итератор живет живет в виде структуры. За это, в свое время воевали наши отцы и деды. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 02:13 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Где-то в степив типизированых коллекциях, в случае со значениями, упаковки не проходит, там даже итератор живет живет в виде структуры. За это, в свое время воевали наши отцы и деды. http://msdn.microsoft.com/ru-ru/library/system.collections.ienumerator.current.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 02:49 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
hVosttГде-то в степив типизированых коллекциях, в случае со значениями, упаковки не проходит, там даже итератор живет живет в виде структуры. За это, в свое время воевали наши отцы и деды. http://msdn.microsoft.com/ru-ru/library/system.collections.ienumerator.current.aspx Сказать-то что хотел? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 07:57 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
hVosttкогда была жёсткая необходимость покодить на Java, я чуть не блеванул +1, я когда ставил JEE у меня постоянно сыпались ошибки в инсталяторе, каждая - гугление и исправление по полчаса-час, на пятой итерации я нажал кнопку кансел ну ее нахрен эту яву, для линуксоидов самое то - чтоб запрограммировать хеллоу ворд - надо собрать под себя ядро ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:54 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
17-77+1, я когда ставил JEE у меня постоянно сыпались ошибки в инсталяторе, каждая - гугление и исправление по полчаса-час, на пятой итерации я нажал кнопку кансел Java то здесь причём? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 09:05 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
cdtyjv1) ICollection не имеет метода Add. ICollection<> имеет. IDictionary<> имеет. Даже IDictionary имеет. А ICollection нет. То есть это абсолютно бессмысленный интерфейс, который не добавлять практически ничего полезного к IEnumerable. В итоге, если у меня есть в руках ICollection, я не могу добавить туда элемент. Стыд и срам. А зачем работать с нетипизированными коллекциями? Я вот за последние несколько лет не работал, и надобности такой не вижу. cdtyjvНет общей иерархии классов. ICollection<> не имеет ничего общего с ICollection. С Dictionary та же проблема. Оно не имеет ничего общего по той простой причине, что это разные вещи. Просто интерфейсы похожи. cdtyjvВ итоге, что бы определить, что у меня в руках коллекция, нужно писать трехэтажные неэффективные выражения через рефлекшн Это очень сильно. А что, вы не знаете, где у вас коллекция, а где - нет? Приведите пример, а то у меня сомнения возникают в том, что вы грамотно подошли к архитектуре приложения с учетом особенностей .Net cdtyjvНет кучи полезных специализированных коллекций. Нет read-only коллекций Есть, и много. Примеры выше приводились. cdtyjvпопробуйте ка написать универсальную такую обертку Универсальные обертки, как и таблетки, не существуют. cdtyjvИ весь этот сыр бор нужен только для того, что бы иметь в рантайме информацию о дженерик типе. В Джава этой информации нет, type erasure. Верите-нет, но она на практике нафиг никому не нужна Не верю :-) cdtyjvЛежат в коллекции объекты, и лежат. Зато есть простая и лаконичная иерархия классов, с которой работать - одно удовольствие. После нее от всего этого стыдобища в .Net просто глаза на лоб лезут. Я когда с Delphi на .Net переходил, тоже долго плевался. Казалось все нелогичным, и сделано через одно место. Сейчас мне кажется ровно наоборот. Все недостатки Delphi убраны, преимущества - сохранены (кроме визуальной составляющей). Так и с Java. Вы привыкли к нему, лучше ориентируетесь в базовых классах, и знаете подход. К .Net нужно просто привыкнуть. И я вам искренне говорю, что 1) в .Net (точнее C#) гораздо удобнее в плане синтаксиса и конструкций 2) VS 2013 - крутая штука, очень. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 10:02 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
В общем "какая дурацкая штука - этот ваш мотоцикл! где педали? как я поеду, если педалей нет, нечего крутить" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 10:35 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Arm79Все недостатки Delphi убраны, преимущества - сохранены ( кроме визуальной составляющей ).Да?! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 10:46 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Алексей КДа?! Да. Я знаю, Алексей, про ваше творчество на WPF :-) Но когда я переходил, были унылые WinForms. Как мне не хватало полноценного наследования форм.... Потом появился Wpf, концептуально крутая штука, но я пока не вижу никакого его развития. И предсказать, на какую технологию как мейнстрим будет ориентироваться Microsoft для разработки клиентской части, я не в состоянии. WinForms умер, Silverlite тоже, WPF в загоне, JS + HTML - слишком медленно... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:07 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Упаковка в правильно написаны дженерик конструкциях не должна приветствоваться равно как и надо постараться что бы упаковаться, списки ли методы разницы нет. Код: c# 1. 2. 3. 4. 5.
проверим через приведение Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:14 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Где-то в степиУпаковка в правильно написаны дженерик конструкциях не должна приветствоваться чуть больше веселья cо специальным Nullable<T> типом ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:19 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Arm79Потом появился Wpf, концептуально крутая штука, но я пока не вижу никакого его развития.Он вполне юзабелен в существующем виде. Его можно и не развивать. Arm79JS + HTML - слишком медленно...Ничего там не медленно. Типовой набор jQuery+Knockout+Bootstrap+TypeScript умеет в разы больше чем Delphi. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:21 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
hVostt, а чем же он специальный? это обыкновенная структура? со своим сахаром ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:24 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Где-то в степиа чем же он специальный? это обыкновенная структура? со своим сахаром сахар это всего лишь пол беды, попробуй вот это: Код: c# 1. 2. 3. 4. 5.
что будет в some в обоих случаях? а с рефлекшеном там вообще целая эпопея. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:32 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
hVostt, ну а что Вас смутило? упаковка nullable имеет свои определенные правила. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:38 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
равно как и распаковка ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:39 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Где-то в степину а что Вас смутило? упаковка nullable имеет свои определенные правила. поэтому я и говорю что это специальный тип, а не обыкновенная структура. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:43 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
Где-то в степиравно как и распаковка Nullable<T> не может быть распакован, так как он и не упаковывается вовсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:44 |
|
Почему в .Net такие убогие коллекции?
|
|||
---|---|---|---|
#18+
а где собственно топикстартер? букварь читает? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:44 |
|
|
start [/forum/topic.php?fid=20&msg=38679435&tid=1402627]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 167ms |
0 / 0 |