|
|
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Встретил такое понятие как LSP принцип: откуда-то с интернетаНаследуемый объект может заменить родительское пред-условие на такое же или более слабое и родительское пост-условие на такое же или более сильное. Как-то нагугленное по этой теме не дало мне четкого представления о том, что же это за принцип, что есть пост и предусловие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 12:31 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Это вроде, только вывод из самого принципа. У вас вопрос только по этому предложению, или принципу в целом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 12:37 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, скорее по принципу в целом. Я понял, что его смысл в том, что если заменить класс на его потомка - ничего поменяться не должно. Честно говоря для меня это выглядит как будто надо запретить overriding к чертям и всё. Но я так понимаю, что не всё так жётско на самом деле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 15:37 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
точнее так авторЯ понял, что его смысл в том, что если заменить класс на его потомка - ничего поменяться не должно. Я понял, что его смысл в том, что если заменить класс на его потомка - поведение поменяться не должно. Вопрос в том что есть смена поведения, а что не есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 15:41 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90, Наследование не должно менять поведение предка. Оно должно его "расширять". Принцип называется "принципом подстановки" потому что проверяется подтсановкой наследника на место предка. И использование наследника везде где используется предок, не должно менять существующую для предка логику. Погуглите примеры нарушения и следование LSP. Например такой http://www.codeproject.com/Articles/595160/Understand-Liskov-Substitution-Principle-LSP Хотя задача квадрат\прямоугольник не самая простая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 15:44 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90, Пример нарушения LSP Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 15:51 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczredwhite90, Пример нарушения LSP Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. на таком то уровне я понимаю конечно. Тогда вернемся к вопросу о пред и постусловиях. где они в вашем примере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 15:56 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90Тогда вернемся к вопросу о пред и постусловиях. где они в вашем примере? Это относиться к тому как классы используются в остальном коде. Вот это прочитано и понятно? http://en.wikipedia.org/wiki/Precondition http://en.wikipedia.org/wiki/Postcondition ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 15:59 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90Вопрос в том что есть смена поведения, а что не есть. если по отсюда авторЕсли для каждого объекта o1 типа S существует объект o2 типа T, такой что любая программа P, определенная в терминах T, не изменяет своего поведения при подстановке объекта o1 вместо объекта o2, то тип S является подтипом T. то говорится, что если не меняется - подтип, а если меняется, то х.з. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 17:20 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczredwhite90Тогда вернемся к вопросу о пред и постусловиях. где они в вашем примере? Это относиться к тому как классы используются в остальном коде. Вот это прочитано и понятно? http://en.wikipedia.org/wiki/Precondition http://en.wikipedia.org/wiki/Postcondition Я так понял: метод вычисление факториала. предусловие - аргумент метода должен быть не отрицателен. постусловие - должен вернуть факториал от аргумента. А как их усиливать и ослаблять - не понимаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 19:03 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90, авторНаследуемый объект может заменить родительское пред-условие на такое же или более слабое и родительское пост-условие на такое же или более сильное. предку должно как минимум хватать предусловий родителя. предок должен сделать как минимум то, что делает родитель, может что-то большее. так что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 19:06 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. так не нарушается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 19:07 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90так не нарушается? В двойне. Положем предусловия. а) Объект может начать действие находясь на твердой поверхности б) Предпологаемый маршрут объекта должен проходить по твердой поверхности без крутых уклонов и разрывов. Постусловия в) Объект должен переместится в координаты x,y. Если мы заменяем бег полетом, то на первый взгляд все условия только ослабляются. Но увы добавляется условие г) для начала движения не должно быть препятствий мешающих взлететь (например низкий потолок). А это условие в свою очередь и является усилением предусловия а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 23:31 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90 Я так понял: метод вычисление факториала. предусловие - аргумент метода должен быть не отрицателен. постусловие - должен вернуть факториал от аргумента. А как их усиливать и ослаблять - не понимаю Предусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили. Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE. Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 09:35 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Чтобы совсем было понятно код должен выглядеть примерно так: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:31 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
пролетевший, во) теперь понял)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:33 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
пролетевшийredwhite90Я так понял: метод вычисление факториала. предусловие - аргумент метода должен быть не отрицателен. постусловие - должен вернуть факториал от аргумента. А как их усиливать и ослаблять - не понимаю Предусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили. Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE. Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят. хотя бррр... давайте математически: родитель предусловие принимает числа [0;100] постусловие возвращает числа [0; 10000] наследник предусловие принимает числа [-100;100] постусловие возвращает чисчла [0;55000] сравним предусловия: родитель [0;100] наследник [-100;100] сравним постусловия родитель [0; 10000] наследник [0;55000] Что в предусловии, что в постусловии мы расширили диапазон. Почему в одном случае это усиление(видимо в пост) а в другом это ослабление? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:44 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90, см. выше. Принцип подразумевает: - что все что проходит мимо первого assert у родителя, должно проходить и у потомка; - что подрывается на втором у родителя, должно подрываться и у потомка. Если вы не ставите assert (хотя бы мысленно), то на LSP можно смело забить болт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:57 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, авторПринцип подразумевает: - что все что проходит мимо первого assert у родителя, должно проходить и у потомка; - что подрывается на втором у родителя, должно подрываться и у потомка. Я это понял. Но почему в одном случае это называется ослабление, а в другом усиление? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:03 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90Я это понял. Но почему в одном случае это называется ослабление, а в другом усиление? Ослабление - это когда все кто проходил проходят и дальше и еще кто-то. Усиление - это когда все кто подрывался продолжают подрываться и еще кто-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:15 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Усиление - это когда все кто подрывался продолжают подрываться и еще кто-то. авторсравним постусловия родитель [0; 10000] наследник [0;55000] кто тут стал подрываться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:32 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90, Гм. это ослабление. Его не должно быть - ибо тот кто работает с предком может не ожидать получение 10001. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:54 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, пролетевшийПредусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили. Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE. Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят. то есть это неправда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 13:13 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, по ходу я не только себя запутал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 18:13 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90, Просто не понятно, для чего тебе точная математическая формулировка? На пальцах это не просто показать. А делать большой полноценный пример, ну его нафиг. Если есть конкретный код, по нему не так сложно прикинуть нарушение LSP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 18:17 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90Встретил такое понятие как LSP принцип: откуда-то с интернетаНаследуемый объект может заменить родительское пред-условие на такое же или более слабое и родительское пост-условие на такое же или более сильное. Как-то нагугленное по этой теме не дало мне четкого представления о том, что же это за принцип, что есть пост и предусловие. Смотри eiffel, там всё это реализовано на уровне языка. Больше такого нигде не встречал, и это очень печально. Если погуглить по "Бертран Мейер. Объектно-ориентированное конструирование программных систем" можно почитать книгу. С примерами на java и С++ кажется можно тут почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 18:30 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНа пальцах это не просто показать. Да не сложно. Просто перевод неправильный. :) Уловия не бывают ослабленными и ужесточенными - эти слова относятся к ограничениям. Если использовать термины ограничения на входе и ограничения на входе, то сразу все становится понятно. Как я уже сказал - нет assertion нет проблемы. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 20:48 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90пролетевшийпропущено... Предусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили. Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE. Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят. хотя бррр... давайте математически: родитель предусловие принимает числа [0;100] постусловие возвращает числа [0; 10000] наследник предусловие принимает числа [-100;100] постусловие возвращает числа [0;55000] сравним предусловия: родитель [0;100] наследник [-100;100] сравним постусловия родитель [0; 10000] наследник [0;55000] Что в предусловии, что в постусловии мы расширили диапазон. Почему в одном случае это усиление(видимо в пост) а в другом это ослабление? давайте ещё разок к этой части дискуссии. насчёт постусловия. Если мы уменьшим диапазон возвращаемых значений, то соответственно для каких то случаев, когда родитель возвращал какое-то значение предок отработает как-то не так. -нарушение принципа. Если мы уменьшим диапазон возвращаемых значений - авторГм. это ослабление. Его не должно быть - ибо тот кто работает с предком может не ожидать получение 10001. тоже как бы нарушение принципа. Вот это то мне и непонятно. Вроде бы всё логично объяснил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 18:40 |
|
||
|
LSP принцип.
|
|||
|---|---|---|---|
|
#18+
redwhite90насчёт постусловия. Если мы уменьшим диапазон возвращаемых значений, то соответственно для каких то случаев, когда родитель возвращал какое-то значение предок отработает как-то не так. -нарушение принципа. Рассматривать надо не сточки зрения предка, а с точки зрения того, кто его вызывает. Если Вы вызываете метод класса, про который Вы знаете, что он возвращает значение от 0 до 100, то если он станет возвращать от 0 до 50 Вашу логику не нарушит (Вы знаете , что делать с этими числами - они и раньше попадались). Но возврат 101 может нарушить. Поэтому услиление разрешается, а ослабление нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:41 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127450]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 504ms |

| 0 / 0 |
