
Sergey
15.02.2018
14:30:20
interface Foo {}
class FooImpl implements Foo {}
interface Bar {
public function bar(Foo $data);
}
class BarImpl implements Bar {
public function bar(FooImpl $data) {
}
}
а тут?

Andrey
15.02.2018
14:31:02
Потому что ты усилил постусловия.
Теперь если какой то другой класс будет завязан на interface то может быть непредсказуемое поведение

Sergey
15.02.2018
14:31:04
p.s. то что в php оба эти примера пока не заведутся - это дело третье

Google

Sergey
15.02.2018
14:31:26

Alexandr
15.02.2018
14:31:34
require no more, promise no less

Sergey
15.02.2018
14:31:44
если твой клиент был завязан на что-то общее а ты вернул что-то более конкретное - клиент это сломать не должно
там где будь либерален к тому что ты принимаешь на вход и будь консервативен в том что выплевываешь на выход

Bohdan
15.02.2018
14:32:48
так?

Sergey
15.02.2018
14:33:01
если они обазятельны

Bohdan
15.02.2018
14:33:02
так, конечно, язык не позволит, но тем не менее
ну да

Sergey
15.02.2018
14:33:15
а дальше весь вопрос умеет ли твой язык в ковариантность/контрвариантность типов. Java и C# умеют. PHP пока нет но обещают сделать

Bohdan
15.02.2018
14:34:06
пресловутое сужение возвращаемого типа?

Google

Sergey
15.02.2018
14:34:13
да
и расширение входящего типа

Bohdan
15.02.2018
14:34:23
вроде ведь rfc завернули

Sergey
15.02.2018
14:34:33

Bohdan
15.02.2018
14:34:39
или просто подняли бучу по его поводу

Andrey
15.02.2018
14:34:44

Sergey
15.02.2018
14:35:23
или просто подняли бучу по его поводу
там была RFC по поводу "опускания" типа в наследнике и его как раз приняли. Морисон говорил что он в этом году хочет запилить. А нормальной RFC пока небыло

Bohdan
15.02.2018
14:35:55
а, вспомнил, да

Andrey
15.02.2018
14:36:01
Ну а с этими прямоугольниками.
Square {
construct(x) {
parent::construct(x,x)
}
}

Sergey
15.02.2018
14:36:02
Да тут я понял ок
тот факт что php не позволяет тебе делать наследников нарушающих LSP на примитивном уровне уже говорит о первом пункте из твоего вопроса
нарушения пойдут когда у тебя появятся setSize(width, height)
потому что квадрат и прямоугльник в твоем случае представляют разные типы объектов у которых различается поведение в контексте размеров.

Andrey
15.02.2018
14:37:38
function setWidth(x) {
$this-x = $x;
$this->setHeight(x)
}

Tex
15.02.2018
14:37:39
и расширение входящего типа
стоп, так расширение входящего и сужение исходящего типа нарушает LSP? я думал наоборот. или я вас не так понял?

Sergey
15.02.2018
14:37:44
у дяди боба ж был пример - что мол "адвакаты по бракоразводному процессу представляют мужа и жену, но не обязаны являться ими"

Andrey
15.02.2018
14:37:58
вот нарушение по дяде бобу

Sergey
15.02.2018
14:37:59

Tex
15.02.2018
14:38:11
а, всё хорошо, значит не так понял. а то я аж напрягся.

Alexandr
15.02.2018
14:38:25
а что насчёт контрактов на значение аргумента? ... это никаким статическим анализатором не отловишь
interface Foo {
public function bar(int $a);
}
class FooImpl implements Foo {
/**
* @throws NegativeArgumentException
* @param int $a
*/
public function bar(int $a)
{
// ...
}
}

Google

Sergey
15.02.2018
14:38:34

Andrey
15.02.2018
14:38:47
Ну вот я к этому и веду
Что ответ не подходит

Sergey
15.02.2018
14:39:10
ну тогда про TDD
все остальное точно чушь

Andrey
15.02.2018
14:40:04
Но сдать надо

Alexandr
15.02.2018
14:40:11

Sergey
15.02.2018
14:40:17
Ну вот я к этому и веду
LSP про поведение. Увы невозможно в наших языках выразить явно контракты. Ну и не забывай что есть еще инварианты которые ты никак статически не проверишь адекватно

Evgenij
15.02.2018
14:40:51

Andrey
15.02.2018
14:41:15

Sergey
15.02.2018
14:41:23
ну вот смотри
там тогда остается только TDD позволяет контролировать type errors в языках с динамической системой типов
ну и тут тоже можно придраться что TDD не про это, но дядя боб об этом писал потому можно
http://blog.cleancoder.com/uncle-bob/2016/05/01/TypeWars.html

Andrey
15.02.2018
14:42:23
Да я читал
про type wars
я пробовал этот вариант

Google

Sergey
15.02.2018
14:43:01
> Using TDD, the Smalltalk programmers were assured that the missile would reach it’s target. In fact, they had much more assurance than the type-checking of the C++ or Java compiler could provide.

Andrey
15.02.2018
14:43:09
да
я был рад 3 попытки назад
Когда наткнулся на эту статью
Но нет

Sergey
15.02.2018
14:43:39
ну значит нет ни одного верного варианта а автор теста не шарит
уволняйся
или смирись и будь выше этого

Andrey
15.02.2018
14:43:58
Кароче либо статический анализ или tdd
ок

Admin
ERROR: S client not available

Sergey
15.02.2018
14:44:04
чет скучный у вас тут срач

Andrey
15.02.2018
14:44:09
Давайте дальше
:)

Sergey
15.02.2018
14:44:15

Sergey
15.02.2018
14:44:27
https://t.me/oop_ru

Sergey
15.02.2018
14:44:33
написал вопрос - написал ответ который думаешь (буквами а не заставляй рассматривать скриншетик)
написал почему так думаешь
это ж у тебя бомбит)

Alex
15.02.2018
14:45:36

Google

Denis
15.02.2018
14:45:48

Sergey
15.02.2018
14:46:13
инварианты чаще можно только в рантайме проверить
и тут статический анализ проигрывает тестам
а вообще - это ж все чисто основы логики

Andrey
15.02.2018
14:47:53
Не зависим от того что нам не нужно

Sergey
15.02.2018
14:49:03
https://i.imgflip.com/24mlqr.jpg
интересно нашли ли тут люди тонкую отсылку на LSP

Tex
15.02.2018
14:50:35

Andrey
15.02.2018
14:50:40

Tex
15.02.2018
14:51:56
я тут коллеге недавно накидывал пример нарушения и не нарушения LSP, а то он долго вкурить не мог, а теперь прям интересно стало, я сам не накосячил-ли. а то человек поверил.
https://gist.github.com/telless/657df088cdf3eff026a5247c85cc8481

Sergey
15.02.2018
14:53:06

Tex
15.02.2018
14:53:29

Andrey
15.02.2018
14:53:33
Да это как раз инетрпретатор ругнется

Tex
15.02.2018
14:53:41
но я намеренно показывал "все плохие варианты"

Sergey
15.02.2018
14:53:42
но все верно
ну то есть bad нарушает, good не нарушает
но нарушение только на уровне аргумента второго обязательного

Tex
15.02.2018
14:55:12