Хоча деякі створені мною об'єкти моделюють об'єкти реального світу, чи не попередній OOP-код не зробив би те саме?
Найбільша відмінність OOP від коду до OOP полягає в тому, що колишні моделі реальної ситуації в світі, як група різних сутностей, що взаємодіють один з одним, кожен з обмеженою "владою" щодо того, що він може робити, а також здатний "реагувати" зовнішні події з власними діями. Останній моделює все як великий фрагмент даних, який нічого не робить самостійно, тоді як обчислення представляють "речі, що трапляються" і можуть впливати на будь-яку чи всі з них.
Будь то краще моделювати реальний світ чи ні, це насправді залежить від того, які грані світу ви моделюєте. Наприклад, фізичне моделювання, де ви хочете описати ефекти, які, скажімо, запалювала б вогонь у предметах, що сутуються, було б краще представлено "традиційним" підходом, оскільки і світло, і тепло добре визначені процеси, які впливають як на зовнішній, так і на внутрішній стан інших об'єктів і не змінюються залежно від поведінки кожного конкретного об'єкта, лише впливаючи на їх властивості.
З іншого боку, якщо ви моделюєте різні компоненти, які взаємодіють для отримання бажаної поведінки, поводження з ними як агентами замість пасивних речей може полегшити це правильно, не пропускаючи нічого. Якщо я хочу увімкнути телевізор, я просто натискаю кнопку, якщо шнур живлення відключено від мережі TV.turnOn
, перевірятиме це на мене. Таким чином, немає ризику повернути гвинтик і забути повернути ту, яка дотикується до нього, оскільки сама гвинтик (якщо запрограмована правильно) піклується про вторинні взаємодії, що виникають як наслідок первинної.
Але OO насправді полягає в тому, як моделювати речі, і цей метод моделювання мені не здається натхненним реальним світом.
Я вважаю, що це має більше стосунку до того, як ми сприймаємо світ, ніж того, яким він є насправді. Можна стверджувати, що все - це лише купа атомів (або енергії, або хвиль, як би там не було), але це не допомагає нам впоратися із завданням вирішення проблем, з якими ми стикаємось, з розумінням оточення навколо нас та прогнозуванням майбутніх подій ( або опису минулих). Таким чином, ми робимо "ментальні моделі" світу, і часто ці ментальні моделі знаходять кращу відповідність з ОО, ніж дані + процеси, які, мабуть, моделюють "краще", як реально працює світ.
Цікаво також зазначити, що більшість людей вважають OOP синонімом «класичного OOP», де ми таксономічно створюємо набори та підмножини речей, і однозначно ставимо предмети у дуже конкретний набір. Це дуже корисно для створення нових типів для багаторазового використання , але не настільки чудово, коли сутність, яку ви моделюєте, є значною мірою самодостатньою, і хоча вона ініціює взаємодію з іншими об'єктами, вона рідко, якщо і коли-небудь, є ціллю взаємодії. Або ще гірше, коли є декілька (можливо, лише один) екземпляр цієї групи, або випадки різко відрізняються за складом, поведінкою або обома.
Однак є також "прототипний OOP", де об'єкт описується шляхом вибору подібного та перерахування аспектів, де вони відрізняються. Я б запропонував цей нарис для хорошого і не надто технічного пояснення процесу мислення (весь пост занадто великий, навіть для стандартів Стіва Йегге, тому я вказую на відповідний розділ: P). Знову ж таки, це гарна відповідність для наших ментальних моделей, коли ми уявляємо невідомі екземпляри порівняно з відомими, але не обов'язково для того, як "працює" реальний світ ... (дві корови насправді повністю розбивають сутності, навіть якщо ми їх сприймаємо як багато в чому подібних)