Одна из самых искаженных концепций информатики. Этот пост не нацелен на то, чтобы вас огорчить, а на то, чтобы показать, что то, что вы узнали в университете об объектной ориентации ─ скорее всего ─, неверно.

INB4: Относительно академического определения, а не того, которое позже было неправильно понято предприятиями.

Извините за капибар, но мне нравится вставлять их в каждую статью или презентацию, которую я делаю.

Большинство университетов обычно используют такие языки, как C ++ или Java для обучения концепциям объектной ориентации ─ или, по крайней мере, пытаются ─, но преподают не совсем объектно-ориентированный подход, а модель программирования, основанная на системе классов, объединенной с императивной парадигмой. Моя цель в этой статье - не создавать противоречия, а попытаться демистифицировать некоторые концепции и попытаться объяснить, что на самом деле представляет собой объектная ориентация, и как большинство современных языков программирования не подчиняются ее основным принципам, включая тот, который использует поддержку объектно-ориентированного программирования. как преимущество для маркетинга.

История OO

Парадигма старая. Современное существенное понятие объектной ориентации пришло из 50-х годов, но его концепции в значительной степени определены и представлены Аланом Каем и реализованы в виде ссылки на языке Smalltalk, который до сих пор рассматривается как величайший справочник в парадигма. В целом, термин «объектно-ориентированный объект» все еще используется неоднозначно, и вокруг него ведется много ожесточенных войн.

ОО не о занятиях

Извините, что огорчил вас, но для объектно-ориентированного языка не обязательно иметь классы. В языке Self представлена ​​модель, основанная на прототипах, избегая классов и по умолчанию. Концепция, которую можно было использовать ранее в Smalltalk с 80-х годов! Вы хотите, чтобы я доказал? JavaScript поддерживает объектно-ориентированное программирование лучше, чем Java, и делает это исключительно на основе программирования на основе прототипов! Еще один поворот сюжета: в ES6 также нет реальных классов. То, что вы видите, на самом деле является синтаксическим сахаром для модели прототипов, которая используется внутри виртуальной машины.

Но что такое ОО?

Согласно определениям того, кто создал термин, необходимо соблюдать некоторые основные концепции:

  • Все является объектом: серьезно. Все должно быть объектом. Классы должны быть объектом, числами, примитивными значениями, такими как строки и логические значения, а также ваша собака должна быть объектом.
  • Объекты общаются посредством передачи сообщений: это означает, что объекты должны получать и отправлять сообщения от ─ и ─ другим объектам. Например, простая операция 1 + 1. Тривиально, не так ли? ОО-язык должен иметь дело с 1 как объектом, + как сообщением и другим значением как другим объектом. Таким образом, операция суммирования будет сообщением, отправленным на номер, и которое вернет другой объект; в данном случае другой номер. По этой причине в Smalltalk отсутствует приоритет оператора, поскольку умножение и сложение - это сообщения, отправляемые объекту, а не примитивные операции. В этом случае управляющие структуры, которые вы знаете на других языках ─ такие какif, for и while ─, не существуют так, как вы видите в Java или C ++, но вы моделируете их поведение с использованием сообщений.
  • Каждый объект является экземпляром некоторого класса: не совсем «классом», как в Java, а как фигура ─, и это тоже должен быть объект. Это не ограничивает программирование на основе прототипов.
  • Совместное использование поведения: то есть форма ─ класс ─ определяет общее поведение объектов. Например, арифметические операции будут экземплярами поведения / сообщений Number!
  • При запуске управление переходит к первому объекту: все остальное работает с сообщениями. Первый объект имеет контроль.

Концепции Алана Кея для объектно-ориентированного программирования также в значительной степени использовались в качестве основы для концепций Карла Хьюитта для модели акторов и параллельного программирования. Тим Бадд также предложил некоторые дополнения к спецификации Кея:

  • Объекты могут иметь свою собственную память, состоящую из других объектов;
  • Добавляет управление вертикальным наследованием к совместному использованию поведения.

Почему Java не удовлетворяет объектно-ориентированный подход?

Это, пожалуй, самый спорный момент в этой статье. Первый нарушенный принцип определениями заключается в том, что все должно быть объектом.

  • Классы не являются объектами: однако каждый класс содержит экземпляр Class class для его описания. Сами по себе классы - это всего лишь абстракции. Классы также должны создаваться посредством передачи сообщений.
  • Примитивные типы: все примитивные значения должны быть объектами. Java предоставляет оболочки для этих типов, например Integer для int, но int, по сути, не является объектом и поэтому не принимает сообщения. Арифметика родная.
  • Обязательные управляющие структуры: например, if. true иfalse должны быть объектами ─ Boolean экземплярами ─ и должны иметь возможность принимать вызовы ifTrue иifFalse для продолжения вычислений. Текущая концепция методов в Java основана на именованных методах, но как это реализовано в Smalltalk? Класс Boolean имеет «методы» ifTrue:ifFalse:, ifTrue: иifFalse:. Отправка основана не на имени, а на сообщении, которое передается! Некоторые языки, такие как Swift и Objective-C, обеспечивают хорошую поддержку этого поведения, а некоторые поддерживают синтаксический сахар, например Ruby. Обратите внимание, что спецификация Smalltalk 98 позволяет некоторым псевдо-сообщениям ─ подобным условным выражениям ─ быть реализованными «изначально»; и запрещает их перегрузку во время выполнения.

Однако важной деталью является то, что, хотя Java как таковой не делает все объекты объектами, JVM внутренне использует все примитивные типы как объекты!

Прохладный! Хочу увидеть это на практике!

Некоторое время назад я и Матеус Альбукерке создали репозиторий с целью реализации одного и того же алгоритма на разных языках программирования и парадигмах, от LISP до Brainfuck, от Rust до КОБОЛ! Там вы можете сравнить реализации Java и C #, например, с реализацией Smalltalk, и увидеть мигающие звездочки! У Ренана Ранелли, нашего знаменитого бразильца Милхауса, также есть очень интересное видео на португальском языке с человеческим объяснением OO определения хипстера.

Пожалуйста, не убивай меня ...

Когда вы изучаете объектно-ориентированный объект в университете, как правило, вы изучаете модель программирования, основанную на классах для языка ─ или набора языков ─ в частности, которая наследует и реализует ─, но не полностью или не самое большее ─ основные концепции объектно-ориентированного подхода. Могут быть добавлены такие понятия, как полиморфизм, наследование и видимость, но они не обязательно и внутренне связаны с широко принятым определением объектно-ориентированного программирования. Я не говорю, что создавать войны или говорить, что разработчики языка лгут вам, но я показываю исторические концептуальные неудачи и немного проясняю исходную концепцию. Жалобы просьба перенаправлять Милтону. Спасибо!

Литература и полезные ссылки

Эта статья является переводом с португальского, изначально написанного Марсело Хаскеллом Камарго.