Наследование Классов
В свое время, когда я начинал разработку своего собственного языка программирования, то по идейным соображениям решил отказаться от некоторых вещей, в частности от наследования классов. К тому времени у меня уже был опыт работы на C++, и я видел, что все так просто и красиво, как об этом пишут в книжках авторы языка. Потом уже, когда спорил на форумах, доказывая, что наследование - это вообще тупиковая ветка развития языков, вместо которого следует использовать интерфейсы и делегаты, - нашел цитату Джеймса Гослинга - создателя языка Java, где он фактически говорит тоже самое примерно так .
Прикол состоит же в том, что именно сейчас, когда эта идея начинает доходить до мозга масс и многоуровневое нагромождение классов друг над другом становится дурным тоном в среде программистов, я пришел к осознанию того, что был не совсем прав. Т.е. прав, но лишь частично.
Проблема изначально состояла в том, что первооткрыватели наследования для широкой публики, впервые введшие его в обиход в императивных языках, а если конкретно - Барьян Страуструп - основатель языка С++, вместе с этой идеей ввели и неправильное ее обоснование. О чем ниже. Это привело к некорректному использованию ее программистами, и - что еще важнее - к некорректной ее реализации в самом языке. В результате сложность кода, использующего идеологию разбиения классов на иерархию, стала расти быстрее роста самой этой иерархии, а использование этого кода и его отладка - усложняться. И сейчас уже под сомнение ставится даже сама эта идея.
Итак, в чем суть ошибки.
С точки зрения Страуструпа, наследование, в существующем виде, отражает какую-то естественную логическую взаимосвязь объектов друг с другом, найдя и реализовав которую, вы гарантированно получите красивый и стройный код. Естественно, если вы это сделать не смогли, и ваша программа постепенно начала заваливаться на бок, то вы сами же и виноваты; или в недостаточной степени изучили и поняли великие "принципы ООП", или неправильно заложили "фундамент" иерархии при проектировании будущей системы.
В качестве примера идеальной реализации обычно приводят притянутые за уши примитивы, типа базового класса "фигура", от которого наследуют классы "прямоугольник" и "эллипс". А, например, от "прямоугольника" наследуется "квадрат".
На это я скажу, что все это - полный бред.
Хорошая программа - это программа, которая пишется на не один день, а на более долгий срок. Она изменчива изначально, она растет и развивается по мере появления новых идей. Есть даже общеизвестное выражение на эту тему: хороший код пишется не для машины, а для человека. Ведь именно человек будет ее сопровождать и совершенствовать.
Поэтому и требование "просчитывать" дерево классов с самого начала, чтобы позже не сесть в лужу - противоречит самой идее гибкости кода. Заранее невозможно предугадать все будущие идеи и потребности. И потому какой бы совершенный скелет вы не заложили в основу проекта, он все равно долго не протянет под давлением новых требований.
(продолжение следует)
|