Что делает язык объектно-ориентированным?
Поскольку обсуждение без значимых терминов бессмысленно, я подумал, что я укажу на слона в комнате и спрошу: что именно делает язык "объектно-ориентированным"? Я не ищу ответа на учебник, но на основе вашего опыта работы с языками OO, которые хорошо работают в вашем домене, какими бы они ни были.
Связанный с этим вопрос, который может помочь сначала ответить: Каков архетип объектно-ориентированных языков и почему?
Ответы
Ответ 1
Определения для объектно-ориентированной версии - это огромная баня червей, но вот мои 2 цента:
Для меня Object-Orientation - это все объекты, которые взаимодействуют, отправляя сообщения. То есть, для меня, единственная важная черта объектно-ориентированного языка.
Если мне пришлось выставить упорядоченный список всех функций, которые должен иметь объектно-ориентированный язык, он будет выглядеть так:
Очевидно, что этот список очень спорный, поскольку он исключает большое разнообразие языков, которые широко рассматриваются как объектно-ориентированные, такие как Java, С# и С++, все из которых нарушают точки 1, 2 и 3. Однако нет никаких сомнений в том, что эти языки допускают объектно-ориентированное программирование (но так же C) и даже облегчает его (что C не делает). Итак, я пришел назвать языки, которые удовлетворяют этим требованиям "чисто объектно-ориентированным".
В качестве архетипических объектно-ориентированных языков я бы назвал Self и Newspeak.
Оба удовлетворяют вышеупомянутым требованиям. Оба они вдохновлены и преемниками Smalltalk, и оба действительно могут быть "более OO" в какой-то смысл. То, что мне нравится в "Я" и "Новостях", заключается в том, что оба воспринимают сообщение, отправляющее парадигму до крайности (Newspeak даже больше, чем "Я" ).
В Newspeak все отправляется. Нет переменных экземпляра, нет полей, нет атрибутов, нет констант, нет имен классов. Все они эмулируются с помощью геттеров и сеттеров.
В "Я" нет классов, только объектов. Это подчеркивает, что ОО действительно о: объекты, а не классы.
Ответ 2
Согласно Booch, следующие элементы:
Основные:
- Абстракция
- Герметизация
- Модульность
- Иерархия (Наследование)
Minor:
- Typing
- Concurrency
- Постоянство
Ответ 3
В основном Object Oriented действительно сводится к "передаче сообщений"
В процедурном языке я вызываю такую функцию:
f(x)
И имя f, вероятно, связано с определенным блоком кода во время компиляции. (Если это не процедурный язык с функциями более высокого порядка или указатели на функции, но позволяет игнорировать эту возможность на секунду.) Таким образом, эта строка кода может означать только одно однозначное.
В объектно-ориентированном языке я передаю сообщение объекту, возможно, так:
o.m(x)
В этом случае. m не является именем блока кода, но "селектор методов" и какой блок кода вызывается, фактически зависит от объекта o каким-то образом. Эта строка кода более двусмысленная или общая, потому что она может означать разные вещи в разных ситуациях, в зависимости от o.
В большинстве языков OO объект o имеет "класс", а класс определяет, какой блок кода вызывается. В нескольких языках OO (наиболее известный Javascript) o не имеет класса, но имеет методы, непосредственно привязанные к нему во время выполнения, или унаследовал их от прототипа.
Моя демаркация заключается в том, что для языка не должно быть ни классов, ни наследования. Но эта полиморфная обработка сообщений имеет важное значение.
Хотя вы можете подделать это с помощью указателей функций в C, этого недостаточно для того, чтобы C был вызван языком OO, потому что вам придется реализовать свою собственную инфраструктуру. Вы можете это сделать, и стиль OO возможен, но язык не дал вам.
Ответ 4
Это не настоящие языки OO, это код.
Можно написать объектно-ориентированный C-код (с помощью структур и даже элементов указателя функции, если хотите), и я видел несколько хороших примеров этого. (Quake 2/3 SDK приходит на ум.) Также возможно написать процедурный (то есть не OO) код в С++.
Учитывая это, я бы сказал, что это языковая поддержка для написания хорошего OO-кода, который делает его "объектно-ориентированным языком". Я бы никогда не потрудился с использованием элементов указателей функций в структурах на C, например, для обычных функций-членов; поэтому я скажу, что C не является языком OO.
(Расширяясь на этом, можно сказать, что Python не является объектно-ориентированным, с обязательной ссылкой "self" на каждом шаге и конструкторах, называемых init, что-то еще, но это религиозная дискуссия. )
Ответ 5
Smalltalk обычно считается архетипическим языком OO, хотя Simula часто упоминается как первый язык OO.
Существующие языки OO могут свободно классифицироваться на каком языке они берут большинство концепций из:
- Smalltalk-like: Ruby, Objective-C
- Simula-like: С++, Object Pascal, Java, С#
Ответ 6
Насколько я могу судить, основной взгляд на то, что делает язык "Object Oriented", поддерживает идею группировки данных и методов, которые работают над этими данными, что обычно достигается с помощью классов, модулей, наследования, полиморфизма, и т.д.
См. это обсуждение для обзора того, что люди думают (думают?) Объектно-ориентированная.
Что касается "архетипического" языка OO - это действительно Smalltalk, как указал Кристофер.
Ответ 7
Поддерживает классы, методы, атрибуты, инкапсуляцию, скрытие данных, наследование, полиморфизм, абстракцию...?
Ответ 8
Невзирая на теоретические последствия, кажется,
"Любой язык, имеющий ключевое слово, называемое" class ": -P
Ответ 9
В дополнение к тому, что сказал aib, я бы сказал, что язык не является объектно ориентированным, если только стандартные доступные библиотеки не являются объектно-ориентированными. Самый большой пример этого - PHP. Хотя он поддерживает все стандартные объектно-ориентированные концепции, тот факт, что такой большой процент стандартных библиотек не является объектно-ориентированным, означает, что почти невозможно записать свой код объектно-ориентированным способом.
Не имеет значения, что они вводят пространства имен, если все стандартные библиотеки по-прежнему требуют, чтобы вы префиксные все ваши вызовы функций с такими вещами, как mysql_ и pgsql_, когда на языке, который поддерживал пространства имен в фактическом API, вы могли бы избавиться функций с mysql_ и просто введите "include system.db.mysql. *" в верхней части файла, чтобы он знал, откуда эти вещи.
Ответ 10
когда вы можете создавать классы, он объектно-ориентированный
например: java - объектно-ориентированный, javascript - нет, а С++ - какой-то "объектно-любопытный" язык
Ответ 11
По моему опыту, языки не объектно-ориентированные, а код.
Несколько лет назад я писал набор программ в AppleScript, который на самом деле не применяет никаких объектно-ориентированных функций, когда я начал разбирать OO. Это неудобно писать объекты в AppleScript, хотя можно создавать классы, конструкторы и т.д., Если вы нашли время, чтобы выяснить, как это сделать.
Язык был правильным языком для домена: чтобы разные программы на Macintosh работали вместе для выполнения некоторых автоматических задач на основе входных файлов. Устранение проблем с самообучением объектно-ориентированного стиля было правильным выбором для программирования, потому что это привело к созданию кода, который был легче устранить, проверить и понять.
Особенностью, которую я заметил больше всего в изменении этого кода с процедурного на OO, была инкапсуляция: оба свойства и вызовы методов.
Ответ 12
Симпсоны: (сравнить страховой персонаж)
1-Полиморфизм
2-Наследование
3-Инкапсуляция
4-Повторное использование.
:)
Ответ 13
Объект: объект является хранилищем данных. Например, если MyList является объектом ShoppingList, MyList может записать ваш список покупок.
Класс: класс - это тип объекта. Многие объекты одного и того же класса могут существовать; например, MyList и YourList могут быть объектами ShoppingList.
Метод: процедура или функция, работающая над объектом или классом. Метод связан с определенным классом. Например, addItem может быть методом, который добавляет элемент к любому объекту ShoppingList. Иногда метод связан с семейством классов. Например, addItem может работать с любым списком, из которых только в одном списке есть список покупок.
Наследование: класс может наследовать свойства из более общего класса. Например, класс ShoppingList наследует от класса List свойство сохранения последовательности элементов.
Полиморфизм. Возможность вызова одного метода работать с несколькими различными классами объектов, даже если эти классы нуждаются в разных реализациях вызова метода. Например, одна строка кода может вызывать метод "addItem" для всех типов списков, даже если добавление элемента в список покупок полностью отличается от добавления элемента в ShoppingCart.
Объектно-ориентированный: каждый объект знает свой собственный класс и какие методы манипулируют объектами этого класса. Каждый ShoppingList и каждый ShoppingCart знают, какая реализация addItem относится к нему.
В этом списке единственное, что действительно отличает объектно-ориентированные языки от процедурных языков (C, Fortran, Basic, Pascal), - это полиморфизм.
Источник: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd
Ответ 14
архетип
Возможность выражать реальные сценарии в коде.
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);
}
}
Почему?
Чтобы помочь нам понять это легче. Это имеет смысл в наших головах и, если оно выполнено правильно, делает код более эффективным, повторно используемым и уменьшает повторение.
Для этого вам нужно:
- Указатели/Ссылки, чтобы убедиться, что это == this и this!= that.
- Классы, чтобы указать (например, Arm), которые хранят данные (int hairyness) и операции (Throw (IThrowable))
- Полиморфизм (наследование и/или интерфейсы) для обработки конкретных объектов в общем виде, чтобы вы могли читать книги, а также граффити на стене (оба реализуют IReadable).
- Инкапсуляция, потому что яблоко не раскрывает свойство Atoms []