Подтвердить что ты не робот

Что делает язык объектно-ориентированным?

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

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

4b9b3361

Ответ 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 []