Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / LSP принцип. / 25 сообщений из 30, страница 1 из 2
20.03.2014, 12:31
    #38591687
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Встретил такое понятие как LSP принцип:
откуда-то с интернетаНаследуемый объект может заменить родительское пред-условие на такое же или более слабое и родительское пост-условие на такое же или более сильное.

Как-то нагугленное по этой теме не дало мне четкого представления о том, что же это за принцип, что есть пост и предусловие.
...
Рейтинг: 0 / 0
20.03.2014, 12:37
    #38591696
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Это вроде, только вывод из самого принципа. У вас вопрос только по этому предложению, или принципу в целом?
...
Рейтинг: 0 / 0
20.03.2014, 13:00
    #38591740
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90,

Может тут что полезное найдешь.
...
Рейтинг: 0 / 0
20.03.2014, 15:37
    #38591999
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Blazkowicz,

скорее по принципу в целом.

Я понял, что его смысл в том, что если заменить класс на его потомка - ничего поменяться не должно.

Честно говоря для меня это выглядит как будто надо запретить overriding к чертям и всё.

Но я так понимаю, что не всё так жётско на самом деле.
...
Рейтинг: 0 / 0
20.03.2014, 15:41
    #38592000
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
точнее так

авторЯ понял, что его смысл в том, что если заменить класс на его потомка - ничего поменяться не должно.
Я понял, что его смысл в том, что если заменить класс на его потомка - поведение поменяться не должно.

Вопрос в том что есть смена поведения, а что не есть.
...
Рейтинг: 0 / 0
20.03.2014, 15:44
    #38592003
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90,

Наследование не должно менять поведение предка. Оно должно его "расширять".
Принцип называется "принципом подстановки" потому что проверяется подтсановкой наследника на место предка. И использование наследника везде где используется предок, не должно менять существующую для предка логику.
Погуглите примеры нарушения и следование LSP. Например такой
http://www.codeproject.com/Articles/595160/Understand-Liskov-Substitution-Principle-LSP
Хотя задача квадрат\прямоугольник не самая простая.
...
Рейтинг: 0 / 0
20.03.2014, 15:51
    #38592016
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90,

Пример нарушения LSP
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Animal{
  void move(){
    run();
  }
}

class Bird extends Animal{
  @Override
  void move(){
    fly();
  }
}
...
Рейтинг: 0 / 0
20.03.2014, 15:56
    #38592023
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Blazkowiczredwhite90,

Пример нарушения LSP
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Animal{
  void move(){
    run();
  }
}

class Bird extends Animal{
  @Override
  void move(){
    fly();
  }
}



на таком то уровне я понимаю конечно.

Тогда вернемся к вопросу о пред и постусловиях.

где они в вашем примере?
...
Рейтинг: 0 / 0
20.03.2014, 15:59
    #38592028
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90Тогда вернемся к вопросу о пред и постусловиях.
где они в вашем примере?
Это относиться к тому как классы используются в остальном коде.
Вот это прочитано и понятно?
http://en.wikipedia.org/wiki/Precondition
http://en.wikipedia.org/wiki/Postcondition
...
Рейтинг: 0 / 0
20.03.2014, 17:20
    #38592147
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90Вопрос в том что есть смена поведения, а что не есть.

если по отсюда
авторЕсли для каждого объекта o1 типа S существует объект o2 типа T, такой что любая программа P, определенная в терминах T, не изменяет своего поведения при подстановке объекта o1 вместо объекта o2, то тип S является подтипом T.

то говорится, что если не меняется - подтип,
а если меняется, то х.з.
...
Рейтинг: 0 / 0
20.03.2014, 19:03
    #38592283
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Blazkowiczredwhite90Тогда вернемся к вопросу о пред и постусловиях.
где они в вашем примере?
Это относиться к тому как классы используются в остальном коде.
Вот это прочитано и понятно?
http://en.wikipedia.org/wiki/Precondition
http://en.wikipedia.org/wiki/Postcondition

Я так понял:

метод вычисление факториала.

предусловие - аргумент метода должен быть не отрицателен.

постусловие - должен вернуть факториал от аргумента.


А как их усиливать и ослаблять - не понимаю
...
Рейтинг: 0 / 0
20.03.2014, 19:06
    #38592285
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90,

авторНаследуемый объект может заменить родительское пред-условие на такое же или более слабое и родительское пост-условие на такое же или более сильное.

предку должно как минимум хватать предусловий родителя.

предок должен сделать как минимум то, что делает родитель, может что-то большее.

так что ли?
...
Рейтинг: 0 / 0
20.03.2014, 19:07
    #38592288
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Blazkowicz
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Animal{
  void move(){
    run();
  }
}

class Bird extends Animal{
  @Override
  void move(){
    fly();
    run();
  }
}



так не нарушается?
...
Рейтинг: 0 / 0
20.03.2014, 23:31
    #38592418
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90так не нарушается?
В двойне.

Положем предусловия.
а) Объект может начать действие находясь на твердой поверхности
б) Предпологаемый маршрут объекта должен проходить по твердой поверхности без крутых уклонов и разрывов.

Постусловия
в) Объект должен переместится в координаты x,y.

Если мы заменяем бег полетом, то на первый взгляд все условия только ослабляются. Но увы добавляется условие
г) для начала движения не должно быть препятствий мешающих взлететь (например низкий потолок).

А это условие в свою очередь и является усилением предусловия а.
...
Рейтинг: 0 / 0
21.03.2014, 09:35
    #38592581
пролетевший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90
Я так понял:

метод вычисление факториала.

предусловие - аргумент метода должен быть не отрицателен.

постусловие - должен вернуть факториал от аргумента.


А как их усиливать и ослаблять - не понимаю

Предусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили.
Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE.
Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят.
...
Рейтинг: 0 / 0
21.03.2014, 11:31
    #38592707
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Чтобы совсем было понятно код должен выглядеть примерно так:
Код: java
1.
2.
3.
4.
5.
 void move() {
  assert предусловие;
  ...
  assert постусловие;
 }
...
Рейтинг: 0 / 0
21.03.2014, 11:33
    #38592708
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
пролетевший,

во) теперь понял))
...
Рейтинг: 0 / 0
21.03.2014, 11:44
    #38592722
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
пролетевшийredwhite90Я так понял:

метод вычисление факториала.

предусловие - аргумент метода должен быть не отрицателен.

постусловие - должен вернуть факториал от аргумента.


А как их усиливать и ослаблять - не понимаю

Предусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили.
Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE.
Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят.


хотя бррр...

давайте математически:

родитель
предусловие
принимает числа [0;100]
постусловие
возвращает числа [0; 10000]
наследник
предусловие
принимает числа [-100;100]
постусловие
возвращает чисчла [0;55000]


сравним предусловия:
родитель [0;100]
наследник [-100;100]
сравним постусловия
родитель [0; 10000]
наследник [0;55000]


Что в предусловии, что в постусловии мы расширили диапазон. Почему в одном случае это усиление(видимо в пост) а в другом это ослабление?
...
Рейтинг: 0 / 0
21.03.2014, 11:57
    #38592745
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90,

см. выше.

Принцип подразумевает:
- что все что проходит мимо первого assert у родителя, должно проходить и у потомка;
- что подрывается на втором у родителя, должно подрываться и у потомка.

Если вы не ставите assert (хотя бы мысленно), то на LSP можно смело забить болт.
...
Рейтинг: 0 / 0
21.03.2014, 12:03
    #38592751
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Сергей Арсеньев,

авторПринцип подразумевает:
- что все что проходит мимо первого assert у родителя, должно проходить и у потомка;
- что подрывается на втором у родителя, должно подрываться и у потомка.

Я это понял. Но почему в одном случае это называется ослабление, а в другом усиление?
...
Рейтинг: 0 / 0
21.03.2014, 12:15
    #38592770
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90Я это понял. Но почему в одном случае это называется ослабление, а в другом усиление?

Ослабление - это когда все кто проходил проходят и дальше и еще кто-то.
Усиление - это когда все кто подрывался продолжают подрываться и еще кто-то.
...
Рейтинг: 0 / 0
21.03.2014, 12:32
    #38592798
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Сергей Арсеньев Усиление - это когда все кто подрывался продолжают подрываться и еще кто-то.

авторсравним постусловия
родитель [0; 10000]

наследник [0;55000]


кто тут стал подрываться?
...
Рейтинг: 0 / 0
21.03.2014, 12:54
    #38592833
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
redwhite90,

Гм. это ослабление. Его не должно быть - ибо тот кто работает с предком может не ожидать получение 10001.
...
Рейтинг: 0 / 0
21.03.2014, 13:13
    #38592852
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Сергей Арсеньев,

пролетевшийПредусловие ослабляем: наследник может принимать отрицательные аргументы. Все операции которые вызывают метод с положительными аргументами ничего не заметили.
Постусловие: наш класс может возвращать результат не больше Integer.MAX_VALUE.
Наследник может сосчитать большие значения. Существуюшие клиенты опять таки ничего не заметят.

то есть это неправда?
...
Рейтинг: 0 / 0
21.03.2014, 18:13
    #38593204
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LSP принцип.
Сергей Арсеньев,

по ходу я не только себя запутал)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / LSP принцип. / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]