Я думаю, что есть несколько факторов, которые еще не были упомянуты.
Прежде всего, по крайней мере, в «чистом ООП» (например, Smalltalk), где все является объектом, вы должны изогнуть свой ум в довольно неестественную конфигурацию, чтобы думать о числе (только для одного примера) как об интеллектуальном объекте вместо просто значение - поскольку в действительности 21
(например) действительно является просто значением. Это становится особенно проблематичным, когда, с одной стороны, вам говорят, что большим преимуществом ООП является более точное моделирование реальности, но вы начинаете с того, что очень похоже на ЛСД-вдохновленный взгляд даже на самые простые и очевидные части реальность.
Во-вторых, наследование в ООП также не очень близко следует ментальным моделям большинства людей. Для большинства людей, классификация вещей наиболее конкретно не имеет где-либо близко к абсолютным правилам, необходимым для создания иерархии классов, которая работает. В частности, создание того, class D
что наследует от другого, class B
означает, что объекты class D
разделяют абсолютно все положительные характеристики class B
. class D
Можно добавлять новые и разные характеристики самостоятельно, но все характеристики class B
должны оставаться неизменными.
Напротив, когда люди классифицируют вещи мысленно, они обычно следуют гораздо более слабой модели. Для одного примера, если человек устанавливает некоторые правила относительно того, что составляет класс объектов, довольно типично, что почти любое одно правило может быть нарушено при условии соблюдения достаточного количества других правил. Даже те немногие правила, которые не могут быть нарушены, почти всегда могут быть немного растянуты.
Просто для примера рассмотрим "автомобиль" как класс. Довольно легко увидеть, что подавляющее большинство того, что большинство людей считает «автомобилями», имеют четыре колеса. Большинство людей, однако, видели (по крайней мере, изображение) автомобиль только с тремя колесами. Некоторые из нас нужного возраста также помнят гоночный автомобиль или два из ранних 80-х (или около того), которые имели шесть колес - и так далее. Это оставляет нам в основном три варианта:
- Ничего не утверждайте о том, сколько колес у автомобиля - но это приводит к неявному предположению, что оно всегда будет 4, и коду, который может сломаться для другого числа.
- Утверждают, что все машины имеют четыре колеса, и просто классифицируют эти другие как «не автомобили», хотя мы знаем, что они действительно есть.
- Разработайте класс таким образом, чтобы на всякий случай допускалось изменение количества колес, даже если есть большая вероятность, что эта возможность никогда не понадобится, не будет использована или должным образом проверена.
Преподавание ООП часто фокусируется на построении огромных таксономий - например, кусочков того, что будет гигантской иерархией всей известной жизни на земле, или чего-то подобного. Это поднимает две проблемы: во-первых, это приводит к тому, что многие люди сосредотачиваются на огромных объемах информации, которая совершенно не имеет отношения к рассматриваемому вопросу. В какой-то момент я увидел довольно продолжительное обсуждение того, как моделировать породы собак, и должен ли (например) «миниатюрный пудель» наследоваться от «полноразмерного пуделя», или наоборот, или должна быть абстрактная основа «пудель». "class, с" полноразмерным пуделем "и" миниатюрным пуделем ", оба наследуют от него. То, что они все, казалось, игнорировали, было то, что приложение должно было иметь дело с отслеживанием лицензий для собак,
Во-вторых, и это почти важно, это приводит к фокусированию на характеристиках предметов, а не на характеристиках, которые важны для стоящей перед нами задачи. Это ведет к моделированию вещей такими, какие они есть, где (в большинстве случаев) действительно необходимо построить простейшую модель, которая будет удовлетворять наши потребности, и использовать абстракцию для подбора необходимых подклассов, чтобы соответствовать построенной нами абстракции.
Наконец, я еще раз скажу: мы медленно идем тем же путем, по которому базы данных шли годами. Ранние базы данных следовали иерархической модели. Помимо сосредоточения исключительно на данных, это единственное наследование. В течение короткого времени несколько баз данных следовали сетевой модели - по существу, идентичной множественному наследованию (и с этой точки зрения, несколько интерфейсов недостаточно отличаются от множества базовых классов, чтобы замечать или заботиться о них).
Однако давно базы данных в значительной степени сходились по реляционной модели (и хотя они не являются SQL, на этом уровне абстракции текущие базы данных «NoSQL» также являются реляционными). Преимущества реляционной модели достаточно хорошо известны, поэтому я не буду повторять их здесь. Я просто отмечу, что наиболее близким аналогом реляционной модели, которую мы имеем в программировании, является универсальное программирование (и извините, но, несмотря на название, дженерики Java, например, на самом деле не подходят, хотя они представляют собой крошечный шаг в правильное направление).