2008-08-26 3 views
30

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

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

ответ

27

Definitions for Object-Orientation являются, конечно, huge can of worms, но вот мои 2 цента:

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

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

  1. Objects sending messages to other objects
  2. Все есть объекты
  3. Late Binding
  4. Subtype Polymorphism
  5. Наследование или что-то так же выразительно, как Delegation
  6. Encapsulation
  7. Information Hiding
  8. Абстракция

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

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

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

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

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

+1

сообщения, позднее связывание и полиморфизм одно и то же: рано переплете сообщение только вызов процедуры, и если вы не можете отправлять одни и те же сообщения на объекты разных типов, а затем зачем поздно связывать? Делегирование, инкапсуляция, и все это объект, также вытекающий из передачи сообщений, в некотором роде. – 2009-04-02 23:27:26

0

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

7

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

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

Незначительное:

  • Typing
  • Параллелизм
  • Постоянство
3

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

Современные языки OO может быть свободно классифицированы по какой язык они занимают большинство понятий из:

  • Smalltalk-как: Рубин, Objective-C
  • Симула типа: C++, Object Pascal, Java, C#
+0

Не забудьте Objective C и Javascript исходящим от филиала Smalltalk – Mamut 2009-08-13 19:26:58

-2

Архетип

способность выражать реальные сценарии в коде.

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); 
    } 
} 

Почему?

Чтобы помочь нам понять это более легко. Это имеет смысл в наших головах, и, если оно выполнено правильно, код становится более эффективным, повторно используемым и уменьшает повторение.

Для достижения этой цели вам необходимо:

  • указателей/Ссылки чтобы убедиться, что это == это и это = это!.
  • Классы, чтобы указать (например.(Throw (IThrowable))
  • Полиморфизм (наследование и/или интерфейсы) для обработки конкретных объектов в общем виде, чтобы вы могли читать книги, а также граффити на стене (как реализовать IReadable)
  • Инкапсуляция, потому что яблоко не разоблачить атомов [] свойство
1

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

См. this discussion для обзора того, что люди думают (думают?). Объектно-ориентированное средство.

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

4

Это не языки, которые являются ОО, это код.

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

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

(Расширение на это, можно сказать, что Python не объектно-ориентированный язык, либо, с обязательным «я» ссылкой на каждом шагу и конструкторы называют INIT, этажерки,., Но это религиозная дискуссия)

+0

просто взять приманку на секунду, почему на Земле не было бы подразумеваемого ключевого слова self, означающего, что python не является OO? – interstar 2008-10-19 16:13:57

+2

Прости, что? – aib 2008-10-20 17:22:07

0

Игнорирование теоретических последствий, это, кажется,

«Любой язык, который имеет ключевое слово называется" классом»:-P

+3

смешно ... но неправильно – interstar 2008-10-19 16:14:29

0

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

Не имеет значения, что они вводят пространства имен, если все стандартные библиотеки по-прежнему требуют префикса всех вызовов функций с такими вещами, как mysql_ и pgsql_, когда на языке, поддерживающем пространства имен в фактическом API, вы можете получить избавиться от функций с mysql_ и просто пропустить «include system.db.mysql. *» в верхней части файла, чтобы он знал, откуда взялись эти вещи.

7

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

В процедурном языке, я называю такую ​​функцию:

f(x) 

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

В объектно-ориентированном языке, который я передать сообщение на объект, возможно, как это:

o.m(x) 

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

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

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

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

0

когда вы можете сделать классы, это объектно-ориентированный
, например: Java является объектно-ориентированным, JavaScript не является, и C++ выглядит как какой-то «объектно-любопытным» язык

+0

JavaScript обычно считается OO: он * имеет * объекты, а не классы. (В частности, это OO на основе прототипов, а не OO на основе классов.) Фактически вы можете внедрить систему классов поверх прототипа в JavaScript, если хотите, и как ES6, так и CoffeeScript делают именно это с помощью синтаксического сахара. Обратное также верно: BTW: некоторые классы OO, ориентированные на классы (например, Ruby, но, возможно, не Java), могут сделать прототип OO без особых проблем. – 2017-09-19 00:50:40

0

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

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

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

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

0

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

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

0

Объект: Объект является хранилищем данных. Например, если 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

Смежные вопросы