Хотя некоторые объекты, которые я создаю, моделируют объекты реального мира, разве код предварительной ООП не сделает то же самое?
Наибольшее различие между ООП и кодом до ООП состоит в том, что первый моделирует реальную ситуацию как группу отдельных объектов, взаимодействующих друг с другом, каждый из которых обладает ограниченной «властью» в отношении того, что он может делать, а также способен «реагировать» на внешние события с собственными действиями. Последний моделирует все как большой кусок данных, который ничего не делает сам по себе, в то время как вычисления представляют «вещи, которые происходят» и могут повлиять на все или на них.
Будет ли он лучше моделировать реальный мир или нет, это зависит от того, какие грани мира вы моделируете. Например, физическое моделирование, где вы хотите описать эффекты, которые, скажем, зажигается огонь на окружающих объектах, было бы лучше представлено "традиционным" подходом, так как свет и тепло хорошо определенные процессы, которые влияют как на внешнее, так и на внутреннее состояние других объектов и не изменяются в зависимости от поведения каждого конкретного объекта, а зависят только от их свойств.
С другой стороны, если вы моделируете различные компоненты, которые взаимодействуют для получения желаемого поведения, рассматривая их как агенты вместо пассивных вещей, можно упростить правильное выполнение, не пропуская ничего. Если я хочу включить свой телевизор, я просто нажимаю кнопку, если шнур питания отключен, это TV.turnOn
проверит это для меня. Таким образом, нет никакого риска повернуть зубец и забыть повернуть того, кто его касается, поскольку сам зубец (если он запрограммирован правильно) позаботится о вторичных взаимодействиях, которые являются следствием первичного.
Но ОО на самом деле о том, как моделировать вещи, и этот метод моделирования не кажется мне вдохновленным реальным миром.
Я считаю, что это больше связано с тем, как мы воспринимаем мир, чем с тем, как на самом деле мир. Можно утверждать, что все это просто набор атомов (или энергии, или волн, что угодно), но это не помогает нам справиться с задачей решения проблем, с которыми мы сталкиваемся, с пониманием окружающей нас среды и прогнозированием будущих событий ( или описание прошлых). Таким образом, мы создаем «ментальные модели» мира, и часто эти ментальные модели находят лучшее соответствие с ОО, чем модели «данные +», что, возможно, моделирует «лучше», как на самом деле работает реальный мир.
Также интересно отметить, что большинство людей считают ООП синонимом «классического ООП», где мы таксономически создаем наборы и подмножества вещей и однозначно помещаем объекты в очень специфический набор. Это очень полезно для создания многократно используемых новых типов , но не так здорово, когда моделируемый объект в значительной степени самодостаточен, и хотя он инициирует взаимодействия с другими объектами, он редко, если вообще когда-либо, является целью взаимодействия. Или хуже, когда существует несколько (может быть, только один) экземпляр этого объекта или экземпляры сильно различаются по составу, поведению или тому и другому.
Тем не менее, существует также «прототип ООП», где объект описывается путем выбора подобного объекта и перечисления аспектов, в которых они различаются. Я бы предложил это эссе для хорошего и не слишком технического объяснения мыслительного процесса (весь пост слишком велик, даже для стандартов Стива Йегге, поэтому я указываю на соответствующий раздел: P). Опять же, это хорошее совпадение для наших ментальных моделей, когда мы воображаем неизвестные случаи по сравнению с известными, но не обязательно для того, как «работает» реальный мир ... (две коровы на самом деле являются совершенно разрозненными сущностями, даже если мы их воспринимаем как во многом похожи)