Что делает язык объектно-ориентированным? - PullRequest
33 голосов
/ 27 августа 2008

Поскольку дискуссия без содержательных терминов бессмысленна , я решил указать на слона в комнате и спросить: что именно делает язык "объектно-ориентированным"? Здесь я не ищу ответ из учебника, а на основе вашего опыта работы с ОО-языками, которые хорошо работают в вашей области, какой бы она ни была.

Смежный вопрос, который может помочь ответить первым: что такое архетип объектно-ориентированных языков и почему?

Ответы [ 15 ]

29 голосов
/ 27 августа 2008

Определения для объектной ориентации , конечно, огромная банка червей , но вот мои 2 цента:

Для меня Object-Orientation - это объекты, которые взаимодействуют друг с другом, отправляя сообщения. Для меня это самая важная черта объектно-ориентированного языка.

Если бы мне пришлось составить упорядоченный список всех функций, которые должен иметь объектно-ориентированный язык, это выглядело бы так:

  1. Объекты, отправляющие сообщения другим объектам
  2. Все является объектом
  3. Позднее связывание
  4. Подтип Полиморфизм
  5. Наследование или что-то такое же выразительное, как Делегирование
  6. Инкапсуляция
  7. Скрытие информации
  8. Абстракция

Очевидно, что этот список очень противоречив, поскольку он исключает большое разнообразие языков, которые широко рассматриваются как объектно-ориентированные, такие как Java , C # и C ++ , все из которых нарушают пункты 1, 2 и 3. Тем не менее, нет никаких сомнений в том, что эти языки допускают объектно-ориентированное программирование (как и C ) и даже облегчают его (что не делает C). «т). Итак, я стал называть языки, которые удовлетворяют этим требованиям, «чисто объектно-ориентированными».

В качестве архетипичных объектно-ориентированных языков я бы назвал Self и Newspeak .

Оба удовлетворяют вышеупомянутым требованиям. И те, и другие вдохновлены Smalltalk и являются его преемниками, и в действительности они оба в некотором смысле становятся «более внушительными». Что мне нравится в Self и Newspeak, так это то, что обе они доводят парадигму отправки сообщений до крайности (Newspeak даже больше, чем Self).

В Newspeak, все - это отправка сообщения. Здесь нет переменных экземпляра, полей, атрибутов, констант, имен классов. Все они эмулируются с использованием геттеров и сеттеров.

В Self есть нет классов , только объекты. Это подчеркивает, что ОО действительно о: объектах, а не классах.

8 голосов
/ 19 октября 2008

В основном объектно-ориентированная система действительно сводится к «передаче сообщений»

На процедурном языке я вызываю функцию, подобную этой:

  f(x)

И имя f, вероятно, связано с конкретным блоком кода во время компиляции. (Если это не процедурный язык с функциями более высокого порядка или указателями на функции, но давайте на секунду проигнорируем эту возможность.) Так что эта строка кода может означать только одну недвусмысленную вещь.

На объектно-ориентированном языке я передаю сообщение объекту, возможно, так:

 o.m(x) 

В этом случае. m - это не имя блока кода, а «селектор метода», и то, какой блок кода вызывается, в некоторой степени зависит от объекта o. Эта строка кода является более двусмысленной или общей, потому что она может означать разные вещи в разных ситуациях, в зависимости от o.

В большинстве языков ОО объект o имеет «класс», и класс определяет, какой блок кода вызывается. В паре ОО-языков (наиболее известный как Javascript) o не имеет класса, но имеет методы, непосредственно связанные с ним во время выполнения, или унаследовал их от прототипа.

Я отмечаю, что ни классы, ни наследование не нужны для того, чтобы язык был ОО. Но эта полиморфная обработка сообщений очень важна.

Хотя вы можете подделать это с помощью указателей функций, скажем, на C, этого недостаточно для того, чтобы C был назван языком OO, потому что вам придется реализовать собственную инфраструктуру. Вы можете сделать это, и стиль ОО возможен, но язык вам его не дал.

8 голосов
/ 27 августа 2008

По словам Буча, следующие элементы: Major:

  • Абстракция
  • Инкапсуляция
  • Модульность
  • Иерархия (Наследование)

Minor:

  • Typing
  • параллелизм
  • Настойчивость
5 голосов
/ 27 августа 2008

На самом деле это не языки ОО, это код.

Можно написать объектно-ориентированный C-код (со структурами и даже указателями на функции, если хотите), и я видел несколько довольно хороших примеров этого. (Вспоминается Quake 2/3 SDK.) Также возможно написать процедурный (т.е. не OO) код на C ++.

Учитывая это, я бы сказал, что поддержка языка для написания хорошего ОО-кода делает его «объектно-ориентированным языком». Я бы никогда не стал использовать члены-указатели на функции в структурах в C, например, для обычных функций-членов; поэтому я скажу, что C не является языком OO.

(Более того, можно сказать, что Python также не является объектно-ориентированным, с обязательной ссылкой "self" на каждом шаге и конструкторами с именем init , что угодно; но это религиозное обсуждение.)

3 голосов
/ 27 августа 2008

Smalltalk обычно считается архетипическим ОО-языком, хотя Симула часто упоминается как первый ОО-язык.

Текущие ОО языки можно свободно классифицировать по тому, из какого языка они заимствуют большинство понятий:

  • Smalltalk-like: Ruby, Objective-C
  • Simula-подобный: C ++, Object Pascal, Java, C #
1 голос
/ 27 августа 2008

Насколько я могу судить, основной взгляд на то, что делает язык "объектно-ориентированным", поддерживает идею группировки данных и методов, которые работают с этими данными, что обычно достигается с помощью классов, модулей, наследования, полиморфизма и т. д.

См. в этом обсуждении , чтобы узнать, что люди думают (думают?) Об объектно-ориентированной ориентации.

Что касается "архетипического" ОО-языка - это действительно Smalltalk, как указала Кристофер.

0 голосов
/ 08 ноября 2018

Я рад поделиться с вами, ребята, это было довольно интересно и полезно для меня. Это отрывок из интервью Rolling Stone 1994 года, в котором Стив (не программист) объясняет ООП простыми словами.

Джефф Гуделл: Не могли бы вы объяснить, простыми словами, что такое объектно-ориентированное программное обеспечение?

Стив Джобс: объекты похожи на людей. Они живут, дышат вещами, в которых есть знания о том, как делать вещи, и в них есть память, чтобы они могли помнить вещи. И вместо того, чтобы взаимодействовать с ними на очень низком уровне, вы взаимодействуете с ними на очень высоком уровне абстракции, как мы делаем прямо здесь.

Вот пример: если я ваш объект для стирки, вы можете дать мне свою грязную одежду и отправить мне сообщение, которое гласит: «Можете ли вы выстирать мою одежду, пожалуйста». Я случайно знаю, где лучшее место для стирки в сан франциско есть. И я говорю по-английски, и у меня в карманах есть доллары. Поэтому я выхожу, приветствую такси и говорю водителю отвезти меня в это место в Сан-Франциско. Я иду, стираю твою одежду, прыгаю обратно в такси, я возвращаюсь сюда. Я даю вам вашу чистую одежду и говорю: «Вот ваша чистая одежда».

Вы не представляете, как я это сделал. Вы не знаете места прачечной. Может быть, вы говорите по-французски, и вы даже не можете поймать такси. Вы не можете заплатить за один, у вас нет долларов в кармане. Тем не менее, я знал, как все это сделать. И вам не нужно было ничего знать об этом. Вся эта сложность была скрыта во мне, и мы смогли взаимодействовать на очень высоком уровне абстракции. Вот что такое объекты. Они инкапсулируют сложность, и интерфейсы к этой сложности являются высокоуровневыми.

0 голосов
/ 12 марта 2017

Объект: объект является хранилищем данных. Например, если MyList является объектом ShoppingList, MyList может записать ваш список покупок.

Класс: класс - это тип объекта. Многие объекты одного класса могут существовать; например, MyList и YourList могут быть объектами ShoppingList.

Метод: процедура или функция, которая работает с объектом или классом. Метод связан с определенным классом. Например, addItem может быть методом, который добавляет элемент в любой объект ShoppingList. Иногда метод связан с семейством классов. Например, addItem может работать с любым списком, из которых список покупок относится только к одному типу.

Наследование: класс может наследовать свойства от более общего класса. Например, класс ShoppingList наследует от класса List свойство хранения последовательности элементов.

Полиморфизм: возможность иметь один вызов метода работает с несколькими различными классами объектов, даже если эти классы нуждаются в различных реализациях вызова метода. Например, одна строка кода может вызывать метод «addItem» для каждого вида List, даже если добавление элемента в ShoppingList полностью отличается от добавления элемента в ShoppingCart.

Объектно-ориентированный: каждый объект знает свой собственный класс и какие методы манипулируют объектами в этом классе. Каждый ShoppingList и каждая ShoppingCart знают, какая реализация addItem применима к нему.

В этом списке единственное, что действительно отличает объектно-ориентированные языки от процедурных (C, Fortran, Basic, Pascal), это полиморфизм.

Источник: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

0 голосов
/ 12 февраля 2013

Simples: (сравните страховой символ)

1-полиморфизм 2-Наследование 3-Инкапсуляция 4-Повторное использование. :)

0 голосов
/ 25 сентября 2010

По моему опыту, языки не объектно-ориентированы, код есть.

Несколько лет назад я писал набор программ на AppleScript, который на самом деле не применял никаких объектно-ориентированных функций, когда я начал выходить из строя. Неловко писать объекты в AppleScript, хотя можно создавать классы, конструкторы и т. Д., Если вы найдете время, чтобы выяснить, как это сделать.

Язык был правильным языком для домена: заставить различные программы на Macintosh работать вместе для выполнения некоторых автоматических задач на основе входных файлов. Попытка самообеспечения объектно-ориентированным стилем была правильным выбором для программирования, потому что это привело к коду, который легче было находить, тестировать и понимать.

Особенностью, которую я заметил больше всего при переходе этого кода с процедурного на OO, была инкапсуляция: и свойства, и вызовы методов.

...