Pull to refresh

Comments 8

UFO just landed and posted this here
Давайте рассмотрим пример. Прямоугольник — плоская фигура с четырьмя прямыми углами. У него есть ширина (width) и высота (height)

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

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

Кстати, обычно как-то обходится стороной то, что если задать прямоугольнику одинаковую ширину и высоту, то фактически он будет квадратом, но в программе он останется прямоугольником. Если бы у нас была возможность изменить тип объекта после изменения параметров, то наследовать было бы можно. Присвоили значения width = 10, height = 10 — тип rect изменился с Rectangle на Square. Насколько это хорошо для разработки — это отдельный вопрос.

А почему мы решили, что у прямоугольника можно просто так изменять стороны? Если мы его поменяем, то это уже будет другая фигура — может прямоугольник, может квадрат. Если размеры сторон задаются только при создании, то нет особых проблем, чтобы унаследовать квадрат от прямоугольника, если это зачем-нибудь требуется. Хотя, возможно, тут я не прав.

А почему мы решили, что прямоугольник можно задавать 2 сторонами? Прямоугольник на плоскости не задается 2 сторонами, он задается 4 точками. Как и квадрат. Кроме того, это математический объект, и мы можем его только задать. Если мы его поменяем, то значит мы задали другую фигуру — может квадрат, может ромб, может просто какой-то четырехугольник. С этой точки зрения, прямоугольник и квадрат должны иметь конструкторы с одинаковым числом параметров — координаты 4 точек. При создании должно появляться исключение, если точки не образуют соответствующую фигуру. В этом случае с наследованием проблем нет.
Автор конечно молодец, но принципы понял не совсем правильно. В прицепе Лесков описал просто полиморфизм. Принцип открытости/закрытости вообще не о том.
Остальное написано таким образом, что если бы не знал эти принципы, никогда бы их не понял.
«В прицепе Лесков описал просто полиморфизм.» Я имел ввиду что автор «Дима» в своей главе про принцип Лесков, описал неправильно этот самый принцип.
Я имел ввиду, что автор Лесков писал про очарованного странника, а автор Лисков — про полиморфизм :)
Произношение фамилий — это спорная тема.
Ничего спорного в конкретно этой фамилии нет.
Sign up to leave a comment.

Articles

Change theme settings