Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Эксперт по математике/физике
4144 / 2048 / 422
Регистрация: 19.07.2009
Сообщений: 3,102
Записей в блоге: 23
1

LINQ и LSP

29.08.2013, 12:18. Просмотров 877. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2013, 12:18
Ответы с готовыми решениями:

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

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

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

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

1
Эксперт по математике/физике
4144 / 2048 / 422
Регистрация: 19.07.2009
Сообщений: 3,102
Записей в блоге: 23
06.09.2013, 09:24  [ТС] 2
На хабре появилось несколько комментариев, на этом обсуждение утихло. А здесь и не начиналось ;(
Самый интересный по моему вопросу:
Так что ни о каком нарушении LSP интерфейсом речи быть не может. Проблема не в IEnumerable, а в реализации ToArray, расчитывающей на конечность коллекции. ИМХО, автор тут перекладывает с больной головы на здоровую — IEnumerable нигде конечность коллекции не декларирует.
Именно. IEnumerable предполагает только то, что по коллекции можно пройтись, ничего более.
И кстати это одна из причин не использовать IEnumerable на практике: интерфейс не налагает почти никаких предусловий, что приводит к тому, что реализации интерфейса гарантируемо нарушают принцип LSP, т.к. невозможно реализовать его, не усилив предусловия:
Последный хорошо отражает мысль, которая проскачила на хабре раньше (http://habrahabr.ru/post/139039/), о том, что принцип Лисков может рассматриваться только в паре с явным контрактом для эффективного его использования; если контракта нет, то по мнению автора никто не в праве требовать от структуры данных не кидать исключений или удовлетворять какому-то условию, пусть даже для программиста естественному; в этом случае выполнение LSP сводится к проверке корректности типов и не более.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2013, 09:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.