Я думаю, що є кілька факторів, про які ще не було сказано.
Перш за все, принаймні в "чистому OOP" (наприклад, Smalltalk), де все є об'єктом, ви повинні скрутити свій розум у досить неприродній конфігурації, щоб мислити число (лише для одного прикладу) як інтелектуальний об'єкт, а не просто цінність - оскільки насправді 21
(наприклад) насправді є лише цінністю. Це стає особливо проблематичним, коли, з одного боку, вам кажуть, що велика перевага OOP - це більш ретельно моделювати реальність, але ви починаєте з того, що виглядає дуже жахливо, як натхненний LSD погляд навіть на найосновніші та очевидні частини реальність.
По-друге, успадкування в ООП теж не дуже відповідає ментальним моделям більшості людей. Для більшості людей класифікація речей конкретно не має ніде близьких до абсолютних правил, необхідних для створення ієрархії класів, яка працює. Зокрема, створення того, class D
що успадковується від іншого, class B
означає, що об'єкти class D
діляться абсолютно, позитивно всіма характеристиками class B
. class D
може додавати нові та різні свої власні характеристики, але всі характеристики class B
повинні залишатися неушкодженими.
На противагу цьому, коли люди класифікують речі подумки, вони зазвичай слідують набагато слабкішій моделі. Наприклад, якщо людина формулює деякі правила щодо того, що являє собою клас об'єктів, досить характерно, що майже будь-яке правило може бути порушено до тих пір, поки буде дотримуватися інших правил. Навіть нечисленні правила, які насправді неможливо порушити, майже завжди можна «розтягнути».
Просто, наприклад, розгляньте "автомобіль" як клас. Досить легко помітити, що переважна більшість того, що більшість людей вважають "машинами", має чотири колеса. Однак більшість людей бачили (принаймні фотографію) автомобіль із лише трьома колесами. Мало хто з нас правильного віку також пам’ятає гоночний автомобіль чи два з початку 80-х (або близько того), які мали шість коліс - і так далі. В основному це три варіанти:
- Не запевняйте нічого про те, скільки коліс має автомобіль - але це, як правило, призводить до неявного припущення, що воно завжди буде 4, і код, який, ймовірно, може зламатися на інше число.
- Зауважте, що всі автомобілі мають чотири колеса, і просто класифікуйте ці інші як "не машини", хоча ми знаємо, що вони є насправді.
- Запроектуйте клас так, щоб він міг змінювати кількість коліс, на всякий випадок, навіть якщо є хороший шанс, що ця можливість ніколи не буде потрібна, використана або перевірена належним чином.
Навчання про ООП часто фокусується на побудові величезних таксономій - наприклад, шматочків і фрагментів того, що було б гігантською ієрархією всього відомого життя на землі, або щось на цьому порядку. Це викликає дві проблеми: в першу чергу, це, як правило, призводить багатьох людей до концентрації уваги на величезному обсязі інформації, що абсолютно не має значення для даного питання. Одного разу я побачив досить тривалу дискусію про те, як моделювати породи собак і чи (наприклад) «мініатюрний пудель» повинен успадковуватись від «пуделя повної величини», чи навпаки, чи має бути абстрактна база «Пудель "клас, з" повнорозмірним пуделем "та" мініатюрним пуделем ", що успадковуються від нього. Вони, здавалося, ігнорували, - це те, що програма повинна мати справу з відстеженням ліцензій для собак,
По-друге, і майже важливо, це призводить до зосередження уваги на характеристиках предметів, замість того, щоб зосереджуватись на характеристиках, важливих для виконання завдання. Це веде в стороні моделювання речей як вони є, де (велика частина часу) , що дійсно необхідно будують просту модель , яка наповнить наші потреби, і з допомогою абстракції , щоб відповідати необхідним подклассам , щоб відповідати абстракцій ми побудували.
Нарешті, ще раз скажу: ми потихеньку слідуємо тим самим шляхом, який пройшли за базами даних протягом багатьох років. Ранні бази даних слідували ієрархічній моделі. Окрім фокусування виключно на даних, це єдине спадкування. Протягом короткого часу за мережевою моделлю слідувало декілька баз даних, які по суті ідентичні множинному успадковуванню (і якщо дивитися з цього кута, багато інтерфейсів недостатньо відрізняються від декількох базових класів, щоб помітити або піклуватися про них).
Однак давно, бази даних в значній мірі сходилися за реляційною моделлю (і хоча вони не є SQL, на цьому рівні абстракції діючі бази даних "NoSQL" є і реляційними). Переваги реляційної моделі досить добре відомі, що я не буду намагатися їх повторювати тут. Я лише зазначу, що найближчим аналогом реляційної моделі, яку ми маємо в програмуванні, є загальне програмування (і вибачте, але, незважаючи на назву, дженерики Java, наприклад, насправді не кваліфікуються, хоча вони є крихітним кроком у правильний напрямок).