ООП в C# c точки зрения Алана Кея?

Часто говорят, что современное ООП - это не ООП в том виде, в котором его задумывали отцы-основатели. Я посмотрел основные принципы ООП с точки зрения Алана Кея и не могу понять, чего он хотел. Приведу конкретные примеры:

1) Всё является объектом
Ну. В C# вроде всё так и есть. Даже если выполнить: int a= 1, то потом можно вызвать метод ToString(), хотя это вроде как просто цифра.

2) Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия
Да. Этого нет.

3) Каждый объект имеет независимую память, которая состоит из других объектов
Вот тут вообще не понимаю, о чём речь

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

5) В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия
Стоп. Разве это не то, что я написал в пункте 4?

6) Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дерев
Это вообще безумие. Если у меня есть класс Dog, описывающий собаку, то от какого мифического единого общего класса она должна наследоваться?

Извиняюсь за простыню текста
  • Вопрос задан
  • 1095 просмотров
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C#
Я посмотрел основные принципы ООП с точки зрения Алана Кея и не могу понять, чего он хотел.

Неудивительно. Изначально ООП было прежде всего идеей и не имело формального описания, такого как реляционная алгебра для РБД. То, что не имеет формального описания может быть по-разному трактовано и понято, или не понято вовсе.
Да. Этого нет.

Ошибаетесь. Есть аналог "сообщений" - это методы объектов. Вызов метода - это аналог посыла сообщения. Просто вы не привыкли рассматривать это с такой точки зрения. Например, в Objective C, в котором ООП смолтоковского стиля, так прямо и говорят. В языках с Simula-подобным ООП методы не называют сообщениями, т.к. в отличие от Smalltalk-стиля выбор кода для вызова (обработки метода/сообщения) выполняется компилятором, а не самим объектом.
Каждый объект имеет независимую память, которая состоит из других объектов

Пожалуй здесь речь идёт об инкапсуляции.
Стоп. Разве это не то, что я написал в пункте 4?

Нет. В пункте 4 вводится само понятие классификации - что среди неупорядоченного набора всевозможных объектов вы выделяете подмножества объектов, "похожих" друг на друга. Здесь ещё не идёт речи о том, будут ли у них общие методы или ещё что-то конкретно. Речь о самой идее выделения объектов во множества по каким-либо признакам. В пункте 5 уже делается заключение, что если уж мы выделили некоторое подмножество объектов, то грех этим не воспользоваться и не задать одно и то же поведение сразу для всего подмножества (грубовато описал, но как то так и есть).
Если у меня есть класс Dog, описывающий собаку, то от какого мифического единого общего класса она должна наследоваться?

System.Object. Да, вы уже от него унаследовались, прямо или через других предков. С точки зрения среды исполнения не всё чем вы оперируете, является объектом, например примитивные значения. Однако с точки зрения языка можно сказать что int "является объектом" т.к. значение int может быть приведено к типу object. От себя лично скажу, что целесообразность концепции "всё - объект" весьма сомнительна по ряду причин.
Ответ написан
qonand
@qonand
Software Engineer
1) Всё является объектом

Да с точки зрения "чистого" ООП все является объектом, в том числе и скалярные величины. Согласен с Станислав Макаров что эта концепция в реальном мире сомнительна...

2) Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия

Изначально объекты действительно общались с помощью обмена специальными объектами-сообщениями. Но со временем такой подход заменили на вызовы методов (что и выражено в современных языках программирования). Если Вы вдумчиво вчитаетесь в описание термина "сообщение" то поймете что точно таким же образом можно и охарактеризовать работу метода.

3) Каждый объект имеет независимую память, которая состоит из других объектов

Речь идет здесь о том что данные содержащиеся в объекте принадлежат только ему (т.е. они не глобальные) и ничто не может их изменить/прочитать без запроса к самому объекту. Соответственно каждый объект имеет какие-то свои собственные данные.

4) Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки)

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

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

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

6) Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дерев

Да тут речь идет о наследовании - но это не означает что прям каждый класс должен быть от чего-то унаследован. Этот пункт вообще говорит о том что стоит использовать наследование и преимущества которые оно дает
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Morpheus_God
@Morpheus_God
Насчет шестого пункта. В C# все классы по умолчанию наследуются от System.Object. И ваш класс Dog по умолчанию от него наследуются.
Ответ написан
Комментировать
@PushMeNow
.NET Developer
Мне кажется, что разводить холивары по поводу является ли нынешний ООП истинным или нет просто бессмысленно, потому что:
1. Нынешний вид ООП рабочий.
2. Тот ООП, который задумывали "отцы-основатели" был не более чем наброском, эскизом. Потом этот эскиз шлифовали ещё многие годы.
3. Принципы ООП не просто так изменились (если они изменились вообще): значит так было нужно, значит нашли более выгодное/адекватное решение.
Что касается c#. Он изначально задумывался как ООП язык, и кодить на нём без этих знаний мягко говоря сложно. В нём заложены все три основных принципа ООП, а эти принципы как раз таки обобщают все пункты, которые были предложены выше. Да и у c# банально основной родительский класс так и называется Object, он (c#) просто от основания построен на классах. Поэтому спорь, не спорь всё равно придём к одному результату: что имеем тем и пользуемся.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы