@oop_ru

Страница 199 из 785
Aleh
06.05.2017
13:17:52
не было известно про страусов и про пингвинов

Sergey
06.05.2017
13:18:04
Кто может нормально объяснить почему квадрат нельзя от прямоугольника наследовать? Стандартные объяснения знаю, но они меня не убеждают ни капли. Ну или объясните почему этот пример как пример дают )
то есть у прямоугольников более слабые инварианты нежели у квадратов. По LSP подтипы могут инварианты ослоблять но не могут усиливать.

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

Andrey
06.05.2017
13:19:05
я не знаю как то объяснить, ты вероятно рано или поздно придешь к этому, тут смысл в том что лучше мыслить интерфейсами а не классами, как мне кажется
Я пока (уже давно) пришёл к тому, что можно, если знаешь что делаешь, т.к. во всех объяснениях один и тот же косяк: навешивают то, чем сам объект явно не обладает. В Питоне мне нравится: "явное лучше неявного". Если везде этого придерживаться, проблем будет намного меньше

Google
Andrey
06.05.2017
13:21:04
не было известно про страусов и про пингвинов
А про куриц? Тех же гусей. С большой натяжкой можно сказать, что они летают. Страус тоже "летит" во время бега, когда ноги земли не касаются ))) есть же "водоплавающие", почему не может быть "летающих"?

Andrey
06.05.2017
13:22:12
не было этой информации, ну
Так вот и косяк: обобщили частный случай. А если бы люди только среди страусов жили? )

Sergey
06.05.2017
13:22:55
Так вот и косяк: обобщили частный случай. А если бы люди только среди страусов жили? )
и тут мы сталкиваемся с тем что что бы захэндлить все случаи их нужно обсудить и подумать. А это дорого.

Aliaksandr
06.05.2017
13:23:10
Все ваши беды от смешивания. Объект это про состояние. У птицы есть крылья. А интерфейс это про активность. Некоторые махая могут лететь.

Andrey
06.05.2017
13:23:44
это уже к вопросу composition over inheritance
Я конкретный пример понять не могу. Знать о нем знаю, почему так знаю, а вот почему именно так - не верю, пока не видел нормального объяснения )

Sergey
06.05.2017
13:23:45
да и потом

Я конкретный пример понять не могу. Знать о нем знаю, почему так знаю, а вот почему именно так - не верю, пока не видел нормального объяснения )
ну суть принципа LSP состоит в том что у тебя код, который завязан на интерфейс не должен учитывать нюансы реализации.

Google
Aleh
06.05.2017
13:24:19
на определенном этапе было удобно считать всех птиц летающими

проблем перейти к пингвинам нет никаких

но юные погромисты могут взять и отнаследовать

про это и говорит принцип

Sergey
06.05.2017
13:26:17
Я конкретный пример понять не могу. Знать о нем знаю, почему так знаю, а вот почему именно так - не верю, пока не видел нормального объяснения )
пример очень простой. Например нам нужно менять размеры фигуры. Если мы не будем обобщать типы, то выйдет так: интерфейс прямоугольничка: public resize(int $width, int $height); интерфейс квадрата: public function resize(int $size);

Andrey
06.05.2017
13:26:18
и тут мы сталкиваемся с тем что что бы захэндлить все случаи их нужно обсудить и подумать. А это дорого.
А что мешает после птицы отрефакторить к летающие птицы? Вынеся лишнее из птицы в подкласс? Фактически это будет выделением надкласса над птицей, в птице оставляем только летание, потом переименовали классы, так как это будет точнее. В итоге и получили, что летающих выделили в подкласс

Артур Евгеньевич
06.05.2017
13:26:25
делал ты програмку для архитекторов, чтобы проектировать как окна будут на стене сомтретсья. Был сначал класс окно, ты решил что оно прямоугольное и добавил к нему методы increaseWidth потом добавил дочерний клас квадратное окно, и решил что его можно подставить. Ну все юзер выбирает в интерфейсе твое новое окно нажимает увеличить ширину, и хуякс ловит исключение

Sergey
06.05.2017
13:26:31
надо рефакторить

только я бы не с исключением пример приводил а просто ты дергаешь "increaseWidth" а оно бац и высоту увеличивает и окно уже не влазит в проем

Артур Евгеньевич
06.05.2017
13:27:39
??

это если мы переопределили бы метод increaseWidth и вызывали бы в нем метод увеличения всех стороно тогда бы оно вылезло из габаритов

а поидее у квадрата не должно е быть его

Andrey
06.05.2017
13:30:33
только я бы не с исключением пример приводил а просто ты дергаешь "increaseWidth" а оно бац и высоту увеличивает и окно уже не влазит в проем
Так опять же - это проблема проектирования. Появилась такая ситуация - отрефакторил и у тебя будет все то же самое, но рабочее. Я и через di могу не то передать, будет исключение, но это же не значит, что нельзя di использовать потому что у меня не руки, а ноги

Артур Евгеньевич
06.05.2017
13:32:30
ну так solid и есть же про проектирвоание)

Andrey
06.05.2017
13:35:22
ну так solid и есть же про проектирвоание)
Ну это понятно, непонятно почему квадрат нельзя наследовать ))) или прямоугольник, у которого стороны меняются в некоторой пропорции (квадрат тогда частный случай будет)

Артур Евгеньевич
06.05.2017
13:36:52
если вводить класс "прямоугольник, у которого стороны меняются в некоторой пропорции" то тут уже можно унаследоваться))

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

Google
Andrey
06.05.2017
13:39:00
Так этот класс будет наследником прямоугольника, т.к. я не вижу причин его не наследовать ))) и будет тогда класс, у которого стороны можно менять независимо. Тогда пример будет мимо, т.к. будут сравниваться разные дети, а не родитель с ребенком

Артур Евгеньевич
06.05.2017
13:40:30
типо прямоугольник -> прямоугольник с пропорциональнымИзменениеСторон - Квадрат ?

тогда здес лсп нарушается типо прямоугольник -> прямоугольникСПропорциональнымИзменениеСторон

это то что Сергей говорил про инвариативность

Andrey
06.05.2017
13:42:20
Нет, рядом будет класс, у которого стороны меняются независимо. Это дети, а не родитель с ребёнком, проблемы тогда нет, т.к. ветки наследования разные

Самому прямоугольнику плевать как стороны меняются, они у него просто есть, на этом все. Остальное ему приписал зачем-то разработчик. Пора рефакторить значит

Andrey
06.05.2017
13:50:28
Все ваши беды от смешивания. Объект это про состояние. У птицы есть крылья. А интерфейс это про активность. Некоторые махая могут лететь.
Вот такой подход я понимаю, по нему - наследовать можно. Я когда только искал работу после универа, меня просили код написать, где будет два класса: квадрат и прямоугольник. Сейчас понимаю зачем спрашивали ) но сейчас я бы все равно сказал, что наследовать можно )) и говорил бы тоже самое, что и сейчас. Пока не пойму почему нельзя - буду говорить, что ООП не понимаю ))

все еще есть. так как какое поведение будет у родителя?
Какое хочешь, какое поведение у абстрактного метода? Так и здесь: если требуется свободно менять - наследуйся от свободно меняющегося, требуются пропорции - наследуй от них

Sergey
06.05.2017
13:52:33
ну то есть у квадрата и прямоугольника просто не должно быть общего типа. Или же общий этот тип не должен регламентировать поведение изменения размера

все остальное - нарушение LSP

Andrey
06.05.2017
13:54:15
ну и как бы нарушение LSP тебе подсказка что это должен быть другой тип совсем
Ну т.е. на прямоугольник навесили неявно обязанность, которой у него нет и потом говорят: наследовать нельзя? Ну т.к. вылели эту обязанность в свой класс и спокойно наследуй от прямоугольника. Разве не так?

Andrey
06.05.2017
13:55:18
какую обязанность?)
Что он может независимо менять свои стороны. Я же выше писал - плевать ему на стороны

Google
Like
06.05.2017
13:56:13
Прямоугольник и квадрат две разные сущности Тут даже нарушения DRY особо не будет, зачем наследоваться?

Andrey
06.05.2017
13:56:20
это не обязанность, это свойство фигуры
Свойство - у него есть стороны, они под прямым углом. Все остальное навесили неявно

Прямоугольник и квадрат две разные сущности Тут даже нарушения DRY особо не будет, зачем наследоваться?
Как в математике учат? Квадрат - это прямоугольник, у которого все стороны равны, почему разные?

Like
06.05.2017
13:57:49
Как в математике учат? Квадрат - это прямоугольник, у которого все стороны равны, почему разные?
Потому что " это прямоугольник" - для лучшего понимания, разве нет? На деле они разные

Alex Фэils?︙
06.05.2017
13:58:07
трейт у квадрата есть, которого нет у прямоугольника

вот надо делать фигуру с такими трейтами (св-вами

Like
06.05.2017
13:58:23
Хорошо, в любом случае - зачем наследоваться?

Admin
ERROR: S client not available

Like
06.05.2017
13:59:01
какой такой трэйт?
Видимо он предлагает каждой фигуре создать трейт )

Andrey
06.05.2017
13:59:03
Потому что " это прямоугольник" - для лучшего понимания, разве нет? На деле они разные
Прямоугольник, который может менять стороны независимо и квадрат - разные, не спорю, поэтому они в разных ветках должны быть, а родитель у них общий - прямоугольник

Sergey
06.05.2017
13:59:23
Видимо он предлагает каждой фигуре создать трейт )
технически это копипаста кода и вообще никакого отношения не имеет ни к типам ни к проблеме

они полностью независимые сущности.

если тебе нужен тип Shape то тогда все эти инварианты надо задавать в каком-то другом типе, и передавать характеристики шэйпов в качестве параметров

пример - студенты, учителя. Они не наследуются от человека. Это человек с массивом ролей.

Alex Фэils?︙
06.05.2017
14:01:10
Sergey
06.05.2017
14:01:25
каждому свойству фигур
трэйты рак с метастазами

Google
Sergey
06.05.2017
14:01:46
и забудем о них)

Sergey
06.05.2017
14:02:44
Like
06.05.2017
14:04:20
Alex Фэils?︙
06.05.2017
14:04:24
c++

Like
06.05.2017
14:04:35
c++
Синтаксис отличный

Andrey
06.05.2017
14:04:42
если тебе нужен тип Shape то тогда все эти инварианты надо задавать в каком-то другом типе, и передавать характеристики шэйпов в качестве параметров
Так я про тоже, только я бы эти инварианты явно в подтипах указал, а не делал вид, что они неявно в родителях есть

Alex Фэils?︙
06.05.2017
14:04:44
кресты плохой пример ОО языка)
ну, да, там дохрена всякой прочей фигни

Sergey
06.05.2017
14:09:25
то есть ничего "неявного" не происходит

у квадрата как ни странно больше общего с кругом в этом плане нежели с прямоугольником)

Sergei
06.05.2017
14:12:20
:)

Andrey
06.05.2017
14:15:11
то есть ничего "неявного" не происходит
Неявно подразумевалось, что ресайз у прямоугольника меняет только одну сторону (или что птица летает), мы это неявное убрали из общего типа, переместили в подкласс, который это неявное содержит явно. Т.е. если летающие птицы, значит все птицы и правда летают, пингвину там делать нечего. Квадрат - это прямоугольник, а то, что стороны меняются независимо - на прямоугольник зря навесили, это в подкласса должно быть

Вот при таком подходе же можно наследовать? )))

Aleh
06.05.2017
14:17:24
Paul
06.05.2017
14:17:45
Быстрофикс )

Sergey
06.05.2017
14:18:11
Вот при таком подходе же можно наследовать? )))
так в том то и дело что в подтипах поведение отличается, а стало быть это нарушение LSP

либо это не часть базового типа (вообще левак) но тогда вообще не понятно зачем мы наследуемся

Andrey
06.05.2017
14:30:04
либо это не часть базового типа (вообще левак) но тогда вообще не понятно зачем мы наследуемся
Так наследуемся-то не из-за смены размеров ) те же птицы: есть метод "летать" и куча остального. Унаследовали от него пингвина, получили нарушение, т.к. он не летает. Убираем летание в подкласс, заменяем родителя на него где надо, нарушение убрали, все круто, правильно?

Страница 199 из 785