Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

В качестве архетипичных объектно-ориентированных языков я бы назвал Самость и Новояз.

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

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

В "Я" есть никаких занятий, только объекты.Это подчеркивает, что такое OO в самом деле о нас:объекты, а не классы.

Другие советы

Согласно Бучу, следующие элементы:Майор:

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

Незначительный:

  • Ввод текста
  • Параллелизм
  • Настойчивость

По сути, объектно-ориентированный подход действительно сводится к "передаче сообщений".

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

  f(x)

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

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

 o.m(x) 

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

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

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

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

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

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

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

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

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

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

  • Похожий на Smalltalk:Ruby, Objective-C
  • Похожий на симуляцию:C ++, Объектный Паскаль, Java, C#

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

Видишь это обсуждение для обзора того, что люди думают (мыслили?) Что означает объектная ориентация.

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

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

Не обращая внимания на теоретические выводы, это, по-видимому,

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

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

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

когда вы можете создавать классы, это объектно-ориентированный подход
например :java объектно-ориентирована, javascript - нет, а c ++ выглядит как какой-то "объектно-ориентированный" язык

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

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

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

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

Простые: (сравните характер страхования)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Архетип

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

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

Почему?

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

Для достижения этого вам нужно:

  • Указатели/ Ссылки чтобы убедиться, что это == это и это!= то.
  • Классы указывать на (например,Arm), которые хранят данные (int hairyness) и операции (Throw(IThrowable)).
  • Полиморфизм (Наследование и/или Интерфейсы) обрабатывать конкретные объекты общим способом, чтобы вы могли читать книги, а также граффити на стене (оба варианта реализуют IReadable)
  • Инкапсуляция потому что apple не предоставляет свойство Atoms[]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top