:: Не фоксом единым
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
В программировании итератор — это секция кода (метод), возвращающая упорядоченную последовательность значений одинакового типа.
Итератор "в программировании" это просто шаблон проектирования. Итератор/"перечислитель"/Enumerator в C# - реализация такого шаблона. Тип значений может быть и не одинаковым (не-Generic версия оперирует object-ом - т.е. по сути произвольным типом) . Про "упорядоченность" тоже можно говорить лишь условно - это НЕ упорядоченный набор, это ПРОСТО набор перебираемый "по одному элементу".
S-type
Так же, неявно, итератор можно реализовать с помощью IEnumerable, IEnumerable<T>.
Не корректная фраза. Эти интерфейсы не реализуют ничего (и с их помощью ничего такого нельзя реализовать). Они лишь говорят о том что реализующий их тип является "коллекцией" того или иного рода, и дают возможность получить итератор.
S-type
До появления yield необходимо было реализовывать IEnumerable, а так же описывать отдельный класс для реализации IEnumerator.
Только условно - т.е. формально "реализовывать интерфейс" не обязательно (та самая утиная типизация), равно как и "отдельный" класс не требуется (хотя с точки зрения "чистоты кода" да - нужно и прописывать наследование интерфейса IEnumerable типом-коллекцией, и создавать отдельный тип - скорее всего "вложенный" в сам тип коллекции - реализующий IEnumerator).
S-type
Интерфейс IEnumerable (или IEnumerable<T> ) позволяет использовать в цикле foreach итераторы, реализованные с помощью IEnumerator.
Ну эта фраза тоже "условно верна"...

Кстати, foreach работает ещё и с массивами - при том БЕЗ посредства итераторов - используя прямой "индексный" доступ к элементам.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
S-type
В программировании итератор — это секция кода (метод), возвращающая упорядоченную последовательность значений одинакового типа.
Итератор "в программировании" это просто шаблон проектирования. Итератор/"перечислитель"/Enumerator в C# - реализация такого шаблона. Тип значений может быть и не одинаковым (не-Generic версия оперирует object-ом - т.е. по сути произвольным типом) . Про "упорядоченность" тоже можно говорить лишь условно - это НЕ упорядоченный набор, это ПРОСТО набор перебираемый "по одному элементу".
Вот чего всегда не любил, когда одно понятие объясняют подменяя другим Что такое "секция кода" - думаю, понятно всем (в данном случае секция - это синоним слова "кусок"). А что такое "шаблон проектирования" (pattern) - до сих пор не понимаю, т.к. нет ни точного определения, ни вменяемого объяснения... всё какие то рассуждения в духе Фаулера... В любом случае, каждый шаблон реализуется в коде (правда, у некоторых этот "кусок" сильно пахнет ).

Что такое "перечислитель"? Это перевод слова Enumerator. Это просто синоним слова "итератор", или - это какое то отдельное отдельное понятие (может, более общее)?

По поводу упорядоченности - согласен, это слово из определения итератора надо выкинуть.

Igor Korolyov
S-type
Так же, неявно, итератор можно реализовать с помощью IEnumerable, IEnumerable<T>.
Не корректная фраза. Эти интерфейсы не реализуют ничего (и с их помощью ничего такого нельзя реализовать). Они лишь говорят о том что реализующий их тип является "коллекцией" того или иного рода, и дают возможность получить итератор.

Согласен - не корректная фраза. Предлагаю так:

Так же, неявно, итератор можно реализовать с помощью yield в функции,
возвращающей IEnumerable / IEnumerable<T> или IEnumerator / IEnumerator<T>.



Исправлено 1 раз(а). Последнее : S-type, 02.03.17 16:42
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
S-type
До появления yield необходимо было реализовывать IEnumerable, а так же описывать отдельный класс для реализации IEnumerator.
Только условно - т.е. формально "реализовывать интерфейс" не обязательно (та самая утиная типизация), равно как и "отдельный" класс не требуется (хотя с точки зрения "чистоты кода" да - нужно и прописывать наследование интерфейса IEnumerable типом-коллекцией, и создавать отдельный тип - скорее всего "вложенный" в сам тип коллекции - реализующий IEnumerator).

До появления yield при реализации IEnumerable, необходимо было описывать отдельный класс для реализации IEnumerator.

Теперь точно?
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
S-type
Интерфейс IEnumerable (или IEnumerable<T> ) позволяет использовать в цикле foreach итераторы, реализованные с помощью IEnumerator.
Ну эта фраза тоже "условно верна"...

Тут то что не так? IEnumerable позволяет использовать итераторы, реализованные с помощью IEnumerator, не только в цикле foreach? Где же ещё и для чего ещё используется IEnumerable?
Ratings: 0 negative/0 positive
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Шаблон проектирования - это абстракция, скажем так - просто ИДЕЯ. В отличие от реализации - т.е. конкретного кода на конкретном языке программирования.
Точно так же как "ДОМ" - это абстракция любого строения - и твоего и моего - при том что они наверняка друг на друга не похожи ни внешне ни внутренне
"перечислитель" - ну да, просто перевод мало ли в каких источниках оно ещё встретится...
Про "отдельный класс" ты таки не понял - не обязательно иметь отдельный класс - просто это логично и удобно - не смешивать всё в кучу.
И по интерфейсам тоже терминологическая беда... Они не "позволяют" чего-либо и не делают что-либо. Это просто формализованный перечень некоторых методов (и свойств) - напротив реализация интерфейса в типе ТРЕБУЕТ нечто от этого типа - чтобы он описал, т.е. "имел" соответствующие члены.
Вот класс где это "есть" - он как раз "позволяет" использовать себя для соответствующих целей.
Итератор вполне можно использовать и напрямую, без "синтаксического сахара foreach" (сходным кодом или же совсем другим) - хотя особого смысла в этом как правило не будет.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: static IEnumerator
alex;

Сообщений: 2857
Откуда: Москва
Дата регистрации: 23.11.2004
Игорь,
для понимания интересно

"Шаблон проектирования" связан с "Обобщённое программирование"?
Ratings: 0 negative/0 positive
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Насколько я знаю - нет.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: static IEnumerator
alex;

Сообщений: 2857
Откуда: Москва
Дата регистрации: 23.11.2004
Пасиб.

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

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



Исправлено 1 раз(а). Последнее : alex;, 02.03.17 23:42
Ratings: 0 negative/0 positive
Re: static IEnumerator
alex;

Сообщений: 2857
Откуда: Москва
Дата регистрации: 23.11.2004
И в продолжение, пытаюсь сформулировать мысль,
поправьте меня если не прав.

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

Как бы связь есть, но как бы и нет.



Исправлено 3 раз(а). Последнее : alex;, 03.03.17 06:17
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Шаблон проектирования - это абстракция, скажем так - просто ИДЕЯ. В отличие от реализации - т.е. конкретного кода на конкретном языке программирования.
Коммунизм - это то же ИДЕЯ, абстракция. А вот СССР - это была конкретная реализация

Igor Korolyov
Про "отдельный класс" ты таки не понял - не обязательно иметь отдельный класс - просто это логично и удобно - не смешивать всё в кучу.

SOLID - это просто идея, как Коммунизм. IMHO, программа, реализованная в строгом соответствии с принципами SOLID - это СССР.

Да, и для меня слово CCCР - ругательное.

Предлагаю про SOLID пока не рассуждать - отложить "вкусняшку" на будущее

Igor Korolyov
И по интерфейсам тоже терминологическая беда... Они не "позволяют" чего-либо и не делают что-либо. Это просто формализованный перечень некоторых методов (и свойств) - напротив реализация интерфейса в типе ТРЕБУЕТ нечто от этого типа - чтобы он описал, т.е. "имел" соответствующие члены.

Можно сказать "функция возвращает тип IEnumerator". В принципе, это ведь не правильно - правильно будет "функция, возвращает объект - экземпляр типа, в котором реализован интерфейс IEnumerator". Но, все говорят - и всем понятно, о чём речь...

При использовании yield в функции, возвращающей объект типа, в котором реализован IEnumerable / IEnumerable<T>
или IEnumerator / IEnumerator<T>, неявно происходит создание итератора.

Такая формулировка корректна?

Igor Korolyov
Вот класс где это "есть" - он как раз "позволяет" использовать себя для соответствующих целей.
Итератор вполне можно использовать и напрямую, без "синтаксического сахара foreach" (сходным кодом или же совсем другим) - хотя особого смысла в этом как правило не будет.

Мысль была в том, что сам по себе интерфейс IEnumerable (или IEnumerable<T> ) ни кому не нужен. Он нужен только для использования в цикле foreach. Точнее, для использования итератора, реализованного с помощью IEnumerator. Разве не так?



Исправлено 1 раз(а). Последнее : S-type, 03.03.17 09:38
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
И по интерфейсам тоже терминологическая беда... Они не "позволяют" чего-либо и не делают что-либо.

Да, сам интерфейс (как синтаксическая конструкция) ни чего не позволяет. Но, интерфейс нужен только для того, что бы его реализовали. А вот уже его реализация уже что то позволяет (например, реализация IComparable позволяет сделать свою сортировку).

В принципе, согласен с тобой - не стоит говорить "интерфейс позволяет", конечно, если не хочешь запутать собеседника .
Ratings: 0 negative/1 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
IEnumerator - интерфейс для создания итераторов. Объекты, реализующие интерфейс IEnumerator,
предоставляют доступ к отдельным элементам коллекции (списка, массива).
IEnumerable - интерфейс для создания объектов, с которыми может работать foreach. При этом
у итераторов будет тип IEnumerator.

Вот теперь есть к чему придраться?



Исправлено 1 раз(а). Последнее : S-type, 03.03.17 10:02
Ratings: 0 negative/0 positive
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
alex;
Как я понял,
"Обобщённое программирование" использует шаблоны для решения типовых задач для разных классов.
"Шаблон проектирования" набор типовых интерфейсов,
и разные "шаблоны" могут использоваться для решения одной и той же задачи.

Как я понимаю, паттерн/шаблон проектирования это достаточно абстрактный подход к решению определённой абстрактной задачи. Вот зачем нужен синглтон? Сам по себе - не нужен он никому! Он совершенно абстрактен. А вот "конкретно" объект приложения, или какой-то объект управления некоторым общим ресурсом - они могут применять сей паттерн с пользой. К "интерфейсам" паттерны не имеют отношения.

"Обобщённое программирование" же (использование Generic-ов) это вполне себе конкретная реализация некоторого алгоритма - например той же "быстрой сортировки" - но позволяющая подсовывать объекты разных типов - и числа, и строки, и "клиентов", и "малые космические тела" - поскольку для реализации этого алгоритма суть объекта не важна - важно лишь наличие у него средства сравнения экземпляров.
Без обобщённого программирования потребовалось бы писать многократно практически идентичный код (различающийся лишь типом некоторых объектов). Сортировка чисел, сортировка дат, сортировка строк - всё отдельные классы или же методы.
Либо придётся отказываться от строгой типизации - т.е. оперировать "абстрактным object-ом" - что по сути убивает все преимущества языка со строгой типизацией (во время компиляции не будет видно что где-то вместо "клиента" мы по ошибке подсовываем объект типа "товарный вагон").

2 S-type
Интерфейс это просто контракт - некоторое обязательство взятое на себя классом. "Да, я умею сравнивать свои экземпляры", или "Да, я умею перебирать элементы во мне содержащиеся". Иногда это заявление о том что нужно что-то делать особое с объектом - например IDisposable - "Я взаимодействую с чем-то таким, что требует от вас явного указания когда мне стоит прекратить работу".

Я бы не стал говорить что какой-то интерфейс "не нужен никому, кроме конструкции такой-то". Да, он этой конструкцией используется (в случае foreach не формально, в других - вполне себе формально, т.е. приведением к типу и работой через такой "указатель на интерфейс"), но смысл его не в том - смысл в том, чтобы заявить внешнему миру "я умею то-то".
Смысл IEnumerable - заявить "я коллекция позволяющая перечислять свои объекты". Безотносительно к тому как/кем/где это будет использоваться


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Кстати, foreach работает ещё и с массивами - при том БЕЗ посредства итераторов - используя прямой "индексный" доступ к элементам.

На msdn.microsoft.com сказано:

msdn
Типы массива являются ссылочными типами, производными от абстрактного базового типа Array. Поскольку этот тип реализует IEnumerable и IEnumerable<T>, в C# во всех массивах можно использовать итерацию foreach.

Т.е. наличие IEnumerable обязательно, но итератор, возвращаемый GetEnumerator(), игнорируется? Или, на msdn преукрасили действительность?

Что же тогда есть "прямой 'индексный' доступ"?



Исправлено 2 раз(а). Последнее : S-type, 05.03.17 20:06
Ratings: 0 negative/0 positive
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Наличие IEnumerable не обязательно т.к foreach его не использует для "известных" типов массивов. Скажем для int[] или object[] или даже MyMegaClass[] - и для многомерных и для jagged (т.е. массива массивов).
Однако для "абстрактного" типа массива используется именно перечислитель (для него я отдельно привёл и IL код, т.к. декомпилятор "свернул" всё обратно в foreach чтобы было видно что именно вызывается).

P.S. Вопрос о "необходимости IEnumerable для массивов" не стоит по той причине, что базовый класс для всех массивов System.Array РЕАЛИЗУЕТ данный интерфейс. Т.е. как-бы нету нетовских массивов которые бы не имели реализации данного интерфейса


------------------
WBR, Igor




[i]Исправлено 1 раз(а). Последнее : Igor Korolyov, 05.03.17 20:08
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004

А-А-А!



мне теперь пол ночи код разбирать



Исправлено 2 раз(а). Последнее : S-type, 05.03.17 20:48
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
В общем вывод такой - там где есть квадратные скобки [], компилятор втихаря меняет foreach на for...
Ratings: 0 negative/0 positive
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да, при том "скобки" должны быть в том что попадает в foreach - не в "изначальной сущности". Впрочем код примера это показывает достаточно чётко Один и тот же массив обрабатывается разными методами по разному.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: static IEnumerator
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Такой нескромный вопрос. Как получить IL-код много где написано. Но, как получить

Igor Korolyov
Это то во что он компилируется

Т.е. как получить реальный код, без сахара?
Ratings: 0 negative/0 positive
Re: static IEnumerator
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Дизассемблеры, вестимо. Некоторые настраиваются, некоторые просто сами по себе не "сворачивают" сложные конструкции...
dotPeek, Reflector, dnSpy, ILSpy из тех про которые я знаю...


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 10 (Гостей: 10)

© 2000-2024 Fox Club 
Яндекс.Метрика