Что подразумевается под термином «истинная» ориентация объекта - PullRequest
8 голосов
/ 30 октября 2008

Я много слышал о том, что Ruby и, возможно, даже Javascript являются «настоящими» объектно-ориентированными языками, в отличие от C ++ и C #, которые являются языками, ориентированными на классы (или шаблоны). Что подразумевается под истинным ОО и каковы преимущества этого по сравнению с подходом класса / шаблона?

Ответы [ 8 ]

14 голосов
/ 30 октября 2008

Это субъективный термин, используемый для продвижения языков. Я видел, как раньше говорили, что C # и Java являются настоящими объектно-ориентированными языками по сравнению с C ++, потому что все должно быть в классе (без глобальных функций или переменных) и все объекты наследуются от одного класса Object.

Для Ruby это может относиться к тому, как Ruby рассматривает все как объект, поэтому вы можете написать 1.to_s вместо чего-то вроде str(1) или String.valueOf(1). Это потому, что Ruby не делает различий между значением и ссылочными переменными. В Javascript нет классов, и вы просто создаете расширяемые объекты, которые можно клонировать для повторного использования. Этот стиль программирования известен как Программирование на основе прототипов .

C ++, с другой стороны, рекламируется как мультипарадигмальный язык, который позволяет использовать несколько подходов, таких как объектно-ориентированное, универсальное и процедурное программирование. Это не придерживается одной парадигмы.

Но да, это просто субъективный термин, который может означать что угодно. Обычно это относится к тому, уделяет ли язык больше внимания объектам, а не к другим элементам языка, таким как функции, шаблоны и т. Д. В статье Википедии по SmallTalk он называется «чистым» объектно-ориентированным языком, и описание относится к Рубин также:

Smalltalk - это «чистый» ОО-язык, это означает, что, в отличие от Java и C ++, нет разницы между значениями которые являются объектами и ценностями, которые примитивные типы. В Smalltalk, примитивные значения, такие как целые числа, логические и символы также объекты, в том смысле, что они экземпляры соответствующих классов, и операции над ними вызываются отправка сообщений. Программист может изменить классы, которые реализуют примитивные значения, так что новое поведение можно определить для их экземпляры - например, для реализации новые структуры управления - или даже так что их существующее поведение будет изменилось. Этот факт обобщен в часто звучащая фраза «В Smalltalk все это объект " (что было бы более точно выражается как «все значения являются объектами», как переменные нет).

2 голосов
/ 10 ноября 2008

Проблема C ++ заключается в следующем. Классы C ++ существуют только в исходном синтаксисе. Нет объекта класса времени выполнения с атрибутами и методами.

Конечно, по этому правилу не означает такой вещи, как объектно-ориентированное программирование на обычной архитектуре машины, поскольку нет объекта класса времени выполнения с атрибутами и методами на уровне машинного кода. (Или, по крайней мере, нет, за исключением специализированных архитектур, таких как старая System / 38 или AS / 400 .)

Что означает " объектно-ориентированный ", давно было определено как три вещи: абстрактные типы данных , с наследованием и полиморфизмом . (Связанная статья в Википедии смешивает свойства ОО с преимуществами в некоторой степени. Но важное различие между ОО и системами на основе объектов *1022*.)

Как правило, «X не действительно объектно-ориентированный, в отличие от Y» на самом деле означает «я пытаюсь продать вам Y».

2 голосов
/ 30 октября 2008

Я думаю, это может означать Программирование на основе прототипов , Парадигма программирования , в которой:

Классы отсутствуют, а повторное использование поведения (известное как наследование в языках классов) выполняется посредством процесса клонирования существующих объектов, которые служат прототипами. Эта модель также может быть известна как программирование без классов, на основе прототипов или на основе экземпляров.

См. Также Одноэлементные методы Ruby .

2 голосов
/ 30 октября 2008

Проблема C ++ заключается в следующем. Классы C ++ существуют только в исходном синтаксисе. Нет объекта класса времени выполнения с атрибутами и методами.

В Python все является объектом. Класс объекта - это другой объект со своими собственными методами и атрибутами. Это относится и к среде Smalltalk, которая является своего рода эталоном объектной ориентации.

Я думаю, что «истинная» объектная ориентация относится к тем средам, где все является объектом.

[Java не справляется с этим, потому что у него есть примитивные типы.]

1 голос
/ 10 ноября 2008

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

typedef struct foo_ {
    T1 (*getA)(foo * self);
    void (*setA)(foo * self, T1 a_);

/* private: */
    T1 a_;
} foo;

T1 foo_getA(foo * self) {
    return self->a_;
}

void foo_setA(foo * self, T1 a_) {
    self->a_ = a_;
}

foo * foo_create() {
    foo * f = malloc(sizeof(foo));
    f->getA = foo_getA;
    f->setA = foo_setA;
    return f;
}

void foo_destroy(foo * f) {
    free (f);
}

void doSomething(T1 a) {
    foo * f = foo_create();
    f->setA(f, a);
    foo_destroy(f);
}

Методы реализации наследования и полиморфизма используются давно. Одним из примеров является фреймворк GObject, используемый в качестве основы для gtk +.

Теперь, когда вы можете программировать объектно-ориентированным способом, C не поддерживает ориентацию объекта, а просто позволяет вам моделировать его до некоторой степени. Таким образом, у вас нет истинной ориентации объекта. Глядя на C ++ / Java / C #, у вас есть поддержка всех таких вещей, как наследование / инкапсуляция данных и прочее из первых рук.

1 голос
/ 30 октября 2008

«Истинный» или «Чистый» объектно-ориентированный язык обычно относится к языкам, в которых все является первоклассным объектом, включая примитивные типы. Например, в C ++ и Java примитивные типы int, char и т. Д. Не являются объектами. В Ruby, например, все является объектом. Иногда в определении подразумеваются дополнительные критерии в зависимости от того, с кем вы разговариваете.

0 голосов
/ 06 февраля 2009

Термин «истинная объектная ориентация» имеет то же значение как неукрашенный термин «объектная ориентация».

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

Такое использование обычно должно сопровождаться описанием свойств субъекта или описанием свойств, отсутствующих в «имитационном субъекте», или обоими; тем самым побуждая читателя понять или хотя бы обдумать различие (я).

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

  • Инкапсуляция (данные + поведение) в (объекты), общающиеся только через (сообщения).
  • Автоматическое восстановление памяти, используемой для представления (объектов),
    когда на (объекты) больше нет ссылок.
  • Задержка привязки (значения) к (представлению) объектов.
  • Отражение во время выполнения от (объекта) к (свойствам объекта).

Практика и опыт научили,
при необходимости также включение

  • Затворы (иногда называемый «истинным замыканием»,
    значение (замыкания) в формальном смысле,
    и следуя примеру замыканий в (lisp).
    )
0 голосов
/ 30 октября 2008

Не уверен в том, что вы отличаетесь от приведенных примеров. Но я знаю, что это не так! Когда ОО привязан к языку как к запоздалой мысли, например, Perl OO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...