Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24

LINQ и LSP

29.08.2013, 12:18. Показов 1464. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Основа вопроса:
хабр http://habrahabr.ru/post/191770/
из работ автора оригинальной статьи http://blog.ploeh.dk/2012/03/2... tCoupling/
Кликните здесь для просмотра всего текста
Вспомним смысл LSP: вы должны иметь возможность передать любую реализацию интерфейса клиенту без изменения корректности системы. В то время как «корректность» является специфичной для приложения, наименьшим общим кратным должно являться то, что если метод работает корректно для одной реализации интерфейса, то он не должен выбрасывать исключения для другой. Впрочем, рассмотрим две реализации IEnumerable<string>:
C#
1
new[] { "foo", "bar", "baz" };
и вот такую:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class InfiniteStrings : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        while (true)
            yield return "foo";
    }
 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}
Как я уже говорил, вызов ToArray() (или ToList()) на этих двух реализациях меняет корректность системы, ибо вторая реализация (бесконечный итератор) станет причиной выброса исключения.

Из википедии:
Цитата Сообщение от wikipedia
Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.

Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом.

Этот принцип является важнейшим критерием для оценки качества принимаемых решений при построении иерархий наследования. Сформулировать его можно в виде простого правила: тип S будет подтипом Т тогда и только тогда, когда каждому объекту oS типа S соответствует некий объект oT типа T таким образом, что для всех программ P, реализованных в терминах T, поведение P не будет меняться, если oT заменить на oS.
IEnumerable<T> при фиксированном T — это обычный итерируемый тип
C#
1
2
3
4
5
6
7
8
interface IEnumerable<T> {
    public IEnumerator<T> GetEnumerator();
}
interface IEnumerator<T> {
    T Current { get; }
    bool MoveNext();
    void Reset();
}
Замечу, что интерфейс IEnumerator<T> накладывает ограничения (контракт) на его использование, которое не декларируется в его типе. Например, в Заметках http://msdn.microsoft.com/ru-r... 146b7.aspx указываются 3 условия, при которых Current не должен возвращать значение; выполнение этих условий лежит только на совести программистов.

Массив T[] является частным случаем IEnumerable<T>. Утверждается, что LSP нарушается, но я не могу придумать такое вычислимое свойство q, которое для хотя бы одного массива было бы неверным, а для всякого итератора — верным.

Насколько я понял, делаются попытки возразить корректности метода toArray. Я не понял, что им не понравилось в этом методе. Можно написать IEnumerable, который породит конечную последовательность; можно написать такой, который породит бесконечную. Первый при вызове toArray() оформит последовательность в виде массива, второй породит исключительную ситуацию. Я знаю, как можно описать свойство q, основываясь на поведении toArray.

В общем, ни C#, ни ООП не шарю, но очень хочу разобраться в этом вопросе.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2013, 12:18
Ответы с готовыми решениями:

Linq или не Linq. Linq медленней стандартных методов?
Есть у нас два массива, нужно найти совпадения в первом из второго. Два варианта реализации, первый костылем, второй с linq, но скорость...

Задача на языке LSP
Дан массив из 15 вещественных чисел.Если минимальный элемент массива находится на 2 месте, а максимальный - на 1 месте массива, то все...

Не запускается .lsp скрипт
Здравствуйте! У меня возникла проблема с Autocad 2013, а точнее, с запуском lsp скрипта. Не знаю почему, но он у меня почему-то не...

1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
06.09.2013, 09:24  [ТС]
На хабре появилось несколько комментариев, на этом обсуждение утихло. А здесь и не начиналось ;(
Самый интересный по моему вопросу:
Так что ни о каком нарушении LSP интерфейсом речи быть не может. Проблема не в IEnumerable, а в реализации ToArray, расчитывающей на конечность коллекции. ИМХО, автор тут перекладывает с больной головы на здоровую — IEnumerable нигде конечность коллекции не декларирует.
Именно. IEnumerable предполагает только то, что по коллекции можно пройтись, ничего более.
И кстати это одна из причин не использовать IEnumerable на практике: интерфейс не налагает почти никаких предусловий, что приводит к тому, что реализации интерфейса гарантируемо нарушают принцип LSP, т.к. невозможно реализовать его, не усилив предусловия:
Последный хорошо отражает мысль, которая проскачила на хабре раньше (http://habrahabr.ru/post/139039/), о том, что принцип Лисков может рассматриваться только в паре с явным контрактом для эффективного его использования; если контракта нет, то по мнению автора никто не в праве требовать от структуры данных не кидать исключений или удовлетворять какому-то условию, пусть даже для программиста естественному; в этом случае выполнение LSP сводится к проверке корректности типов и не более.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.09.2013, 09:24
Помогаю со студенческими работами здесь

Подключение Common.lsp
Доброго времени суток, хотелось бы узнать как решить проблему следующего характера: Для работы с MuLisp-ом установил Oracle VM, при...

Установка Secret Net LSP
Помогите с установкой Secret net lsp. Выходит ошибка

Почему просит загрузить приложение в AutoCAD во время выполнения .lsp?
Почему Автокад просит загрузить другое приложение в то время, как выполняется это? Такое появилось после того как я union добавил (строка...

Почему LINQ to Entity содержит не все методы LINQ to Objects?
Почему не все методы linq to entity содержат все методы?Чем например Linq to object

Литература по EntityFramework, WCF, Linq to Objects, и Linq to SQL
Посоветуйте пожалуйста книги или статьи для освоения следующих вещей: EntityFramework, WCF, Linq to Objects, и Linq to SQL Google...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru