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





Поддерживает классы, методы, атрибуты, инкапсуляцию, скрытие данных, наследование, полиморфизм, абстракцию ...?
По словам Буча, это следующие элементы: Основной:
Незначительный:
Smalltalk обычно считается архетипическим объектно-ориентированным языком, хотя Simula часто упоминается как первый объектно-ориентированный язык.
Текущие ОО-языки можно условно разделить на категории, из которых они заимствуют больше всего концепций:
Архетип
Возможность выражать реальные сценарии в коде.
foreach(House house in location.Houses)
{
foreach(Deliverable mail in new Mailbag(new Deliverable[]
{
GetLetters(),
GetPackages(),
GetAdvertisingJunk()
})
{
if (mail.AddressedTo(house))
{
house.Deliver(mail);
}
}
}
-
foreach(Deliverable myMail in GetMail())
{
IReadable readable = myMail as IReadable;
if ( readable != null )
{
Console.WriteLine(readable.Text);
}
}
Почему?
Чтобы помочь нам понять это легче. Это имеет больше смысла в наших головах и, если его правильно реализовать, сделает код более эффективным, пригодным для повторного использования и уменьшит повторение.
Для этого вам необходимо:
Определения для объектной ориентации, конечно, огромная банка червей, но вот мои 2 цента:
Для меня объектная ориентация - это все, что связано с объектами, которые взаимодействуют друг с другом, отправляя сообщения. Для меня это самая важная черта объектно-ориентированного языка.
Если бы мне пришлось составить упорядоченный список всех функций, которые должен иметь объектно-ориентированный язык, он бы выглядел так:
Очевидно, что этот список очень спорен, поскольку он исключает большое количество языков, которые широко считаются объектно-ориентированными, таких как Ява, C# и C++, все из которых нарушают пункты 1, 2 и 3. Однако нет никаких сомнений. что эти языки допускают объектно-ориентированное программирование (но также и C) и даже облегчают его (чего не делает C). Итак, я стал называть языки, удовлетворяющие этим требованиям, «чисто объектно-ориентированными».
В качестве архетипических объектно-ориентированных языков я бы назвал Себя и Новояз.
Оба удовлетворяют указанным выше требованиям. Оба они вдохновлены Болтовня и являются его преемниками, и оба фактически в некотором смысле могут быть "более объектно ориентированными". Что мне нравится в «Я» и в новоязе, так это то, что оба они доводят парадигму отправки сообщений до крайности (новояз даже больше, чем «Я»).
На новоязе все - это послание. Нет переменных экземпляра, полей, атрибутов, констант, имен классов. Все они эмулируются с помощью геттеров и сеттеров.
В Self есть нет классов, только объекты. Это подчеркивает, что OO представляет собой В самом деле: объекты, а не классы.
Сообщения, позднее связывание и полиморфизм - это одно и то же: сообщение с ранним связыванием - это просто вызов процедуры, и если вы не можете отправлять одни и те же сообщения объектам разных типов, то зачем тогда связываться позже? Делегирование, инкапсуляция и все, что является объектом, также в некотором роде происходит от передачи сообщений.
Насколько я могу судить, основное представление о том, что делает язык «объектно-ориентированным», поддерживает идею группировки данных и методов, которые работают с этими данными, что обычно достигается с помощью классов, модулей, наследования, полиморфизма и т. д.
См. это обсуждение для обзора того, что люди думают (думают?), Что означает объектная ориентация.
Что касается «архетипического» объектно-ориентированного языка - это действительно Smalltalk, как указал Кристофер.
На самом деле объектно-ориентированными являются не языки, а код.
Можно написать объектно-ориентированный код на C (со структурами и даже членами-указателями функций, если хотите), и я видел несколько довольно хороших примеров этого. (На ум приходит Quake 2/3 SDK.) Также определенно возможно написать процедурный (т.е. не объектно-ориентированный) код на C++.
Учитывая это, я бы сказал, что поддержка языка для написания хорошего объектно-ориентированного кода делает его «объектно-ориентированным языком». Я бы никогда не стал использовать элементы-указатели функций в структурах в C, например, для обычных функций-членов; поэтому я скажу, что C - не объектно-ориентированный язык.
(Расширяя это, можно сказать, что Python также не является объектно-ориентированным, с обязательной ссылкой "self" на каждом шаге и конструкторами, называемыми в этом, и еще много чего; но это религиозное обсуждение.)
просто чтобы на секунду заглотить наживку, почему, черт возьми, отсутствие неявного ключевого слова self означает, что python не является OO?
Очень интересный способ взглянуть на ООП. «Дело не в языке, а в коде ...»
Не обращая внимания на теоретические выводы, кажется,
"Любой язык, в котором есть ключевое слово" класс "" :-P
Чтобы продолжить то, что сказал aib, я бы сказал, что язык на самом деле не является объектно-ориентированным, если стандартные библиотеки, которые доступны, не являются объектно-ориентированными. Самый большой пример этого - PHP. Хотя он поддерживает все стандартные объектно-ориентированные концепции, тот факт, что такой большой процент стандартных библиотек не является объектно-ориентированным, означает, что практически невозможно написать свой код объектно-ориентированным способом.
Не имеет значения, что они вводят пространства имен, если все стандартные библиотеки по-прежнему требуют от вас префикса всех вызовов функций такими вещами, как mysql_ и pgsql_, когда на языке, который поддерживает пространства имен в реальном API, вы можете избавиться от функций с помощью mysql_ и поместите в начало файла просто "include system.db.mysql. *", чтобы он знал, откуда эти вещи.
По сути, объектно-ориентированный подход сводится к «передаче сообщений».
На процедурном языке я вызываю такую функцию:
f(x)
И имя f, вероятно, связано с конкретным блоком кода во время компиляции. (Если это не процедурный язык с функциями более высокого порядка или указателями на функции, но давайте проигнорируем эту возможность на секунду.) Таким образом, эта строка кода может означать только одно недвусмысленное значение.
В объектно-ориентированном языке я передаю объекту сообщение, возможно, примерно так:
o.m(x)
В этом случае. m - это не имя блока кода, а «селектор метода», и то, какой блок кода вызывается, на самом деле каким-то образом зависит от объекта o. Эта строка кода является более неоднозначной или общей, потому что она может означать разные вещи в разных ситуациях, в зависимости от o.
В большинстве объектно-ориентированных языков объект o имеет «класс», и этот класс определяет, какой блок кода вызывается. В паре объектно-ориентированных языков (наиболее известный, Javascript) o не имеет класса, но имеет методы, непосредственно прикрепленные к нему во время выполнения, или унаследовал их от прототипа.
Мое разграничение состоит в том, что ни классы, ни наследование не нужны для того, чтобы язык был объектно-ориентированным. Но эта полиморфная обработка сообщений очень важна.
Хотя вы можете подделать это с помощью указателей функций, скажем, в C, этого недостаточно для того, чтобы C назывался объектно-ориентированным языком, потому что вам придется реализовать свою собственную инфраструктуру. Вы можете это сделать, и стиль OO возможен, но язык не дал вам этого.
когда вы можете делать классы, это объектно-ориентированный например: java объектно-ориентированный, javascript - нет, а C++ выглядит как какой-то "объектно-любопытный" язык.
JavaScript обычно считается объектно ориентированным: в делает есть объекты, а не классы. (В частности, это объектно-ориентированный объект на основе прототипов, а не объектно-ориентированный объект на основе классов.) Вы можете фактически реализовать систему классов поверх системы прототипов в JavaScript, если хотите, и как ES6, так и CoffeeScript делают именно это с помощью синтаксического сахара. Обратное тоже верно, BTW: некоторые ориентированные на классы ОО-языки (например, Ruby, но, вероятно, не Java) могут без особых проблем создавать ОО-прототипы.
По моему опыту, языки не объектно-ориентированы, это код.
Несколько лет назад я писал набор программ на AppleScript, в котором на самом деле не используются какие-либо объектно-ориентированные функции, когда я начал заниматься объектно-ориентированным программированием. Неуклюже писать объекты в AppleScript, хотя можно создавать классы, конструкторы и т. д., Если вы потратите время на то, чтобы понять, как это сделать.
Этот язык был правильным языком для предметной области: заставлял различные программы на Macintosh работать вместе для выполнения некоторых автоматических задач на основе входных файлов. Самостоятельное применение объектно-ориентированного стиля было правильным выбором в программировании, потому что в результате получился код, который было легче устранять, тестировать и понимать.
Особенностью, которую я заметил больше всего при изменении этого кода с процедурного на объектно-ориентированный, была инкапсуляция: как свойств, так и вызовов методов.
Простые: (сравните страховой характер)
1-полиморфизм 2-Наследование 3-инкапсуляция 4-повторное использование. :)
Объект: объект - это хранилище данных. Например, если MyList является объектом ShoppingList, MyList может записывать ваш список покупок.
Класс: класс - это тип объекта. Может существовать много объектов одного и того же класса; например, MyList и YourList могут быть объектами ShoppingList.
Метод: процедура или функция, которая работает с объектом или классом. Метод связан с определенным классом. Например, addItem может быть методом, добавляющим элемент к любому объекту ShoppingList. Иногда метод связан с семейством классов. Например, addItem может работать с любым списком, из которых ShoppingList является только одним типом.
Наследование: класс может наследовать свойства от более общего класса. Например, класс ShoppingList наследует от класса List свойство хранить последовательность элементов.
Полиморфизм: возможность иметь один вызов метода для работы с несколькими разными классами объектов, даже если этим классам требуются разные реализации вызова метода. Например, одна строка кода может вызвать метод addItem для любого типа List, даже если добавление элемента в ShoppingList полностью отличается от добавления элемента в ShoppingCart.
Объектно-ориентированный: каждый объект знает свой класс и методы, управляющие объектами в этом классе. Каждый список покупок и каждая корзина покупок знают, какая реализация addItem к ним применяется.
В этом списке единственное, что действительно отличает объектно-ориентированные языки от процедурных языков (C, Fortran, Basic, Pascal), - это полиморфизм.
Источник: https://thewikihow.com/video_mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd
Фортран поддерживает полиморфизм.
Я счастлив поделиться этим с вами, ребята, это было очень интересно и полезно для меня. Это отрывок из интервью Rolling Stone 1994 года, в котором Стив (не программист) объясняет ООП простым языком.
Джефф Гуделл: Не могли бы вы объяснить простым языком, что такое объектно-ориентированное программное обеспечение?
Стив Джобс: Объекты подобны людям. Они живые, дышащие существа, в которых есть знание о том, как что-то делать, и память внутри них, чтобы они могли запоминать вещи. И вместо того, чтобы взаимодействовать с ними на очень низком уровне, вы взаимодействуете с ними на очень высоком уровне абстракции, как мы это делаем прямо здесь.
Вот пример: если я являюсь вашим объектом для стирки, вы можете отдать мне свою грязную одежду и отправить мне сообщение, в котором говорится: «Можете ли вы постирать мою одежду, пожалуйста». Я знаю, где лучшая прачечная в Сан-Франциско. Я говорю по-английски, и у меня в карманах есть доллары. Я выхожу, останавливаю такси и говорю водителю, чтобы он отвез меня в это место в Сан-Франциско. Я иду постирать твою одежду, прыгаю обратно в такси, возвращаюсь сюда. Я даю вам чистую одежду и говорю: «Вот ваша чистая одежда».
Вы не представляете, как я это сделал. Вы ничего не знаете о прачечной. Может быть, вы говорите по-французски и даже не можете поймать такси. Вы не можете заплатить за один, у вас нет долларов в кармане. Тем не менее, я знал, как все это делать. И вам не нужно было ничего знать об этом. Вся эта сложность была скрыта внутри меня, и мы могли взаимодействовать на очень высоком уровне абстракции. Вот что такое объекты. Они инкапсулируют сложность, и интерфейсы этой сложности находятся на высоком уровне.
Если язык разработан со средствами, специально предназначенными для поддержки объектно-ориентированного программирования (4 функции), то это язык объектно-ориентированного программирования.
Вы можете программировать в объектно-ориентированном стиле более или менее на любом языке. Это объектно-ориентированный код, а не язык.
Примеры реальных объектно-ориентированных языков: Java, C#, Python, Ruby, C++. Кроме того, можно иметь расширения для предоставления объектно-ориентированных функций, таких как PHP, Perl и т. д.
Вы можете написать объектно-ориентированный код на C, но это не объектно-ориентированная программа. lang. Он не предназначен для этого (в этом весь смысл C++)
Не забывайте, что Objective C и Javascript взяты из ветки Smalltalk.