Comments 8
UFO just landed and posted this here
Давайте рассмотрим пример. Прямоугольник — плоская фигура с четырьмя прямыми углами. У него есть ширина (width) и высота (height)
Как-то раз я задумался над этим примером, после того, как прочитал его бурное обсуждение в комментах к этой статье.
Начнем с того, что двумя числами можно в общем случае задать только попарные длины отрезков, но неверно, что 4 отрезка всегда образуют прямоугольник. Если мы договорились, что у нас всегда из них получается прямоугольник, мы уже задали некоторые начальные предусловия. В такой реализации у квадрата более сильные предусловия — добавляется условие, что длины всех отрезков должны быть равны. В реализации, когда задаются длины сторон и можно изменять стороны после создания, наследование использовать нельзя.
Кстати, обычно как-то обходится стороной то, что если задать прямоугольнику одинаковую ширину и высоту, то фактически он будет квадратом, но в программе он останется прямоугольником. Если бы у нас была возможность изменить тип объекта после изменения параметров, то наследовать было бы можно. Присвоили значения width = 10, height = 10 — тип rect изменился с Rectangle на Square. Насколько это хорошо для разработки — это отдельный вопрос.
А почему мы решили, что у прямоугольника можно просто так изменять стороны? Если мы его поменяем, то это уже будет другая фигура — может прямоугольник, может квадрат. Если размеры сторон задаются только при создании, то нет особых проблем, чтобы унаследовать квадрат от прямоугольника, если это зачем-нибудь требуется. Хотя, возможно, тут я не прав.
А почему мы решили, что прямоугольник можно задавать 2 сторонами? Прямоугольник на плоскости не задается 2 сторонами, он задается 4 точками. Как и квадрат. Кроме того, это математический объект, и мы можем его только задать. Если мы его поменяем, то значит мы задали другую фигуру — может квадрат, может ромб, может просто какой-то четырехугольник. С этой точки зрения, прямоугольник и квадрат должны иметь конструкторы с одинаковым числом параметров — координаты 4 точек. При создании должно появляться исключение, если точки не образуют соответствующую фигуру. В этом случае с наследованием проблем нет.
+4
Автор конечно молодец, но принципы понял не совсем правильно. В прицепе Лесков описал просто полиморфизм. Принцип открытости/закрытости вообще не о том.
Остальное написано таким образом, что если бы не знал эти принципы, никогда бы их не понял.
Остальное написано таким образом, что если бы не знал эти принципы, никогда бы их не понял.
0
Sign up to leave a comment.
Articles
Change theme settings
От STUPID кода к SOLID коду