@symfony_php

Страница 647 из 1418
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
Alexandr
15.02.2018
14:31:34
require no more, promise no less

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

require no more, promise no less
есть еще robustness principle

там где будь либерален к тому что ты принимаешь на вход и будь консервативен в том что выплевываешь на выход

Bohdan
15.02.2018
14:32:48
если твой клиент был завязан на что-то общее а ты вернул что-то более конкретное - клиент это сломать не должно
и нарушением LSP было бы изменить, допустим, колво аргументов конкретного метода в наследнике

так?

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
или просто подняли бучу по его поводу

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
в java есть возможность @throws на уровне интерфейса объявить
нет, понятно что можно объявить) ... но мы же "хотим" нарушить LSP ... был интерфейс, мы сделали реализацию, в которой нарушили контракт ... с точки зрения языка всё ок ... статический анализатор не помог

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

Evgenij
15.02.2018
14:40:51
Но сдать надо
Вам поди еще за это зарплату обещают повысить ?

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
Sergey
15.02.2018
14:46:13
инварианты чаще можно только в рантайме проверить

и тут статический анализ проигрывает тестам

а вообще - это ж все чисто основы логики

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

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
но нарушение только на уровне аргумента второго обязательного
а использование FooChild вместо Foo разве не нарушение во входящих параметрах?

Страница 647 из 1418