Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Shmj Ниоткуда  
Дата: 31.08.25 21:02
Оценка: :))) :))) :)
Вот оно как: https://habr.com/ru/articles/942582/

И автор говорит что настоящий ООП — был только в Smalltalk.

Кратко суть Smalltalk:

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

2. Идут до конца — примитивы и пр. — это тоже объекты классов. Даже есть концепция мета-классов — как то даже сам класс является объектом мета-класса. Более того — даже просто кусок кода — это объект класса BlockClosure — его можно передавать, изменять, наследовать и т.д.

3. Динамическая типизация: всё проверяется во время выполнения.

Просьба осудить.
=сначала спроси у GPT=
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 31.08.25 21:05
Оценка: +2 :)
Здравствуйте, Shmj, Вы писали:

S>Просьба осудить.


Осуждаем.

Недоучки недоучились, факт
Маньяк Робокряк колесит по городу
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Shmj Ниоткуда  
Дата: 31.08.25 21:13
Оценка:
Здравствуйте, Marty, Вы писали:

M>Недоучки недоучились, факт


А по поводу настоящего ООП в Smalltalk и его превосходства над убогоньким недо-ООП из C++?
=сначала спроси у GPT=
Re[3]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 31.08.25 21:14
Оценка:
Здравствуйте, Shmj, Вы писали:

M>>Недоучки недоучились, факт


S>А по поводу настоящего ООП в Smalltalk и его превосходства над убогоньким недо-ООП из C++?


Так мы ждём
Маньяк Робокряк колесит по городу
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.08.25 22:30
Оценка: +3
Здравствуйте, Shmj, Вы писали:

S>1. Вместо вызова методов — отправляем сообщение. Сообщение класс обрабатывает в момент исполнения и решает что с ним делать в зависимости от логики, можно передать любое сообщение, даже которое не предусмотрено (и обработать).


Я не очень понимаю. Если назвать вызов метода отправкой сообщения объекту, которому принадлежит метод, на что это вообще по сути влияет?

Параллель между вызовом функции (или метода) и синхронным обменом сообщениями может и была открытием в 70-е, но сейчас смотрится довольно простой и понятной вещью. Достаточно немного позаниматься взаимодействием между процессами, по сети или локально, и в общем-то аналогия между синхронным обменом сообщениями и RPC (remote procedure call) становится вполне наглядной.

Поэтому я искренне не понимаю, ну смолтолковцам удобнее двигаться не как всем, считать обмен сообщениямы вызовом метода, а наоборот, считать вызов метода обменом сообщениями.

Ну ОК. Но это всё слова. Суть-то в чём?

S>2. Идут до конца — примитивы и пр. — это тоже объекты классов. Даже есть концепция мета-классов — как то даже сам класс является объектом мета-класса. Более того — даже просто кусок кода — это объект класса BlockClosure — его можно передавать, изменять, наследовать и т.д.


Удобно, когда язык не разделяет встроенные типы и пользовательские типы. Как миниму

S>3. Динамическая типизация: всё проверяется во время выполнения.


Это хорошо?

S>Просьба осудить.


Осуждаем. Уж динамическую-то типизацию так точно осуждаем.
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Michael7 Россия  
Дата: 31.08.25 22:57
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Поэтому я искренне не понимаю, ну смолтолковцам удобнее двигаться не как всем, считать обмен сообщениямы вызовом метода, а наоборот, считать вызов метода обменом сообщениями.


Интересно, что WinAPI явно проектировали под сильным влиянием идеи классов, обменивающихся сообщениями.
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: opfor  
Дата: 01.09.25 00:05
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Поэтому я искренне не понимаю, ну смолтолковцам удобнее двигаться не как всем, считать обмен сообщениямы вызовом метода, а наоборот, считать вызов метода обменом сообщениями.


Pzz>Ну ОК. Но это всё слова. Суть-то в чём?


Динамичность, вроде сигналов/слотов Qt.
Сообщение отправить можно вникуда (в nil), сразу многим объектам, классу (вроде вызова статических методов), или вообще не тому объекту (и они могут переадресовывать эти сообщения куда надо).
"Методы" можно добавлять в классы прямо во время исполнения, расширять существующие классы без необходимости наследования и т.д.
Отредактировано 01.09.2025 0:06 opfor . Предыдущая версия .
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Артём Австралия жж
Дата: 01.09.25 01:27
Оценка:
Здравствуйте, Shmj, Вы писали:

C++ никогда не претендовал на звание тру-ООП языка.Там идея- костыли прикрутить к близкому к железу C некие фичи от Smalltalk- настолько, насколько позволяет близость к железу.
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: koenig  
Дата: 01.09.25 01:34
Оценка: +5
S>настоящий ООП

похрен. вот просто похрен. как и настоящий ФП.
прекрати рассматривать языки программирования под религиозным уголом и начни под практическим — и сэкономишь на прозаке
Re[3]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Muxa  
Дата: 01.09.25 02:45
Оценка: +1
M>>Недоучки недоучились, факт

S>А по поводу настоящего ООП в Smalltalk и его превосходства над убогоньким недо-ООП из C++?


А в чем превосходство? Обозвать вызов метода отправкой сообщения вряд ли можно назвать превосходством.
Какие задачи проще решаются смоллтоком нежели с++?
Re[4]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: Артём Австралия жж
Дата: 01.09.25 02:54
Оценка:
Здравствуйте, Muxa, Вы писали:

M>А в чем превосходство? Обозвать вызов метода отправкой сообщения вряд ли можно назвать превосходством.


Duck typing. В go и в obj C не нужно объявлять интерфейс с методами- только сигнатуру метода.
Отредактировано 01.09.2025 2:55 Артём . Предыдущая версия .
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Hоmunculus  
Дата: 01.09.25 03:21
Оценка: +1
Здравствуйте, Shmj, Вы писали:

С++ изначально и даже в названии — это С и еще плюс что-то. То есть он изначально должен был компилировать С -код. Никто в нем в ООП и не упарывался. Не было такой задачи
Re[5]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: Muxa  
Дата: 01.09.25 03:54
Оценка: +1
M>>А в чем превосходство? Обозвать вызов метода отправкой сообщения вряд ли можно назвать превосходством.
Аё>Duck typing. В go и в obj C не нужно объявлять интерфейс с методами- только сигнатуру метода.

Ииии?
Задачи-то какие таким подходом проще решать?
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: so5team https://stiffstream.com
Дата: 01.09.25 05:58
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот оно как: https://habr.com/ru/articles/942582/


S>И автор говорит что настоящий ООП — был только в Smalltalk.


Судя по содержанию статьи автор "врет как очевидец", т.к. по моим воспоминаниям, IBM со своим OS/2 проиграла MS и Windows задолго до того, как автор статьи первый раз столкнулся с OS/2.

Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):
struct A {
  virtual void f() { std::cout << "A::f" << std::endl; }
};

struct B {
  virtual void f() { std::cout << "B::f" << std::endl; }
};

void consume_A(A & o) { o.f(); /* Здесь вызывается f из A */ }

void consume_B(B & o) { o.f(); /* Здесь вызывается f из B */ }

struc D : public A, public B
{
  void f() override A::f {
    std::cout << "D's f from A" << std::endl;
    A::f();
  }
  void f() override B::f {
    std::cout << "D's f from B" << std::endl;
    B::f();
  }
};

int main() {
  D d;
  consume_A(d);
  consume_B(d);
}


В результате работы должно быть выведено:
D's f from A
A::f
D's f from B
B::f


ИМХО, ОО-язык, который не позволяет получить такой эффект, настоящим не является, т.к. не позволяет использовать возможности полноценного наследования (включая множественного) в полной мере. Соответственно, таковыми не являются ни SmallTalk, ни C++, ни Java...
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: ononim  
Дата: 01.09.25 06:59
Оценка: +2
S>1. Вместо вызова методов — отправляем сообщение. Сообщение класс обрабатывает в момент исполнения и решает что с ним делать в зависимости от логики, можно передать любое сообщение, даже которое не предусмотрено (и обработать).
ObjectiveC это перенял

S>2. Идут до конца — примитивы и пр. — это тоже объекты классов. Даже есть концепция мета-классов — как то даже сам класс является объектом мета-класса. Более того — даже просто кусок кода — это объект класса BlockClosure — его можно передавать, изменять, наследовать и т.д.

Даже в Java поняли что не всякая сова налезет на глобус.

S>3. Динамическая типизация: всё проверяется во время выполнения.

Ну это до сих бывает
Как много веселых ребят, и все делают велосипед...
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Skorodum Россия  
Дата: 01.09.25 08:07
Оценка:
Здравствуйте, so5team, Вы писали:

S>struc D : public A, public B

C-же

S>ИМХО, ОО-язык, который не позволяет получить такой эффект, настоящим не является, т.к. не позволяет использовать возможности полноценного наследования (включая множественного) в полной мере. Соответственно, таковыми не являются ни SmallTalk, ни C++, ни Java...

А какая-то заметная практическая польза от этого могла бы быть? Если я правильно понимаю, в С++ желаемый эффект достигается композицей (визиторами , двойной диспетчиризацией).
Re[6]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: Артём Австралия жж
Дата: 01.09.25 08:16
Оценка:
Здравствуйте, Muxa, Вы писали:


M>Задачи-то какие таким подходом проще решать?


Да, удобно. Я недолго чуть кодил на го- там можно объявить протокол (сигнатуру) и потом подставлять любой объект, главное, чтобы тот реализовал метод (или мессенж, хз), а компилятор статически проверит. Дальше 1 проектика оно у нас не взлетело, т.к. весь бек на жаве и ничего с этим не поделать, а фронт — веб. Задача была- устанавливаемая маленькая апликуха для интеграции, которая не тянет за собой 100500мб jdk. C++ в том случае бы тоже подошёл, но сложность имплементации и поддержки этого отличалась на порядки.
Re[3]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: so5team https://stiffstream.com
Дата: 01.09.25 08:31
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>>ИМХО, ОО-язык, который не позволяет получить такой эффект, настоящим не является, т.к. не позволяет использовать возможности полноценного наследования (включая множественного) в полной мере. Соответственно, таковыми не являются ни SmallTalk, ни C++, ни Java...

S>А какая-то заметная практическая польза от этого могла бы быть? Если я правильно понимаю, в С++ желаемый эффект достигается композицей (визиторами , двойной диспетчиризацией).

Практическая польза в том, что если следовать именно объектному подходу, то мы можем прийти к необходимости иметь класс D, отнаследованный от A и B. При этом в A и C есть виртуальный метод с одним и тем же именем, и одинаковой сигнатурой. Но выполняющий при этом разные задачи.

Например, это может быть метод dump, который в классе TraceCollector сбрасывает куда-то накопленную трассировочную информацию, а в классе TemporaryBuffer -- флуширует содержимое временных буферов.

Если мы делаем какой-то класс WriteAheadLog, который наследуется и от TraceCollector, и от TemporaryBuffer, то возникает вопрос: как быть, если метод dump в WriteAheadLog должен быть перекрыт. Причем так, чтобы версия dump-а от TraceCollector-а перекрывалась отдельно и независимо версии dump-а от TemporaryBuffer.

В C++ мы не может это сделать. ЕМНИП, мы можем только создать WriteAheadLog::dump, который будет работать и как TraceCollector::dump, и как TemporaryBuffer::dump (цынк: https://wandbox.org/permlink/jOQygqExzfoOdrAs). А это совсем не то, что нужно.
Не можем сделать и в SmallTalk, т.к. там вообще множественного наследования нет.

Достичь нужного эффекта, наверное, можно через какие-то обертки. Но это именно что костыли.

Тогда как в языке с полноценной поддержкой ООП все это должно решаться без костылей средствами самого языка.
Если не решается, значит поддержка ООП не полная. Собственно, на этом все.

PS. Я так понимаю, что здесь разговор не столько о практической пользе, сколько об определениях и соответствии этим определениям.
Отредактировано 01.09.2025 8:35 so5team . Предыдущая версия .
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Qulac Россия  
Дата: 01.09.25 08:53
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Shmj, Вы писали:


S>>1. Вместо вызова методов — отправляем сообщение. Сообщение класс обрабатывает в момент исполнения и решает что с ним делать в зависимости от логики, можно передать любое сообщение, даже которое не предусмотрено (и обработать).

Pzz>Я не очень понимаю. Если назвать вызов метода отправкой сообщения объекту, которому принадлежит метод, на что это вообще по сути влияет?


Объектом может быть не обязательно програмная сущность. Я вот как объект сейчас посылаю сообщение другому(им) объектам, я не вызываю ни каких методов, но в случае програмных объектов отправка сообщения заключается в вызове метода объекта-получателя. Вообще есть три разные вещи: предметная область, модель предметной области, реализация модели предметной области(возможно программная). Как для модели предметной области, так и для ее реализации мы можем использовать разные вещи. ООП — это в первую очередь для модели. Вы можете построить модель используя классы UML, а реализовать это с помощью таблиц и хранимок, если вам зачем-то это нужно.


P.S. Про метаклассы, это ООП — космос который на практике почти не нужен, но наличие их дает некоторую логическую завершенность.
Программа – это мысли спрессованные в код
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.09.25 09:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>1. Вместо вызова методов — отправляем сообщение. Сообщение класс обрабатывает в момент исполнения и решает что с ним делать в зависимости от логики, можно передать любое сообщение, даже которое не предусмотрено (и обработать).

S>2. Идут до конца — примитивы и пр. — это тоже объекты классов. Даже есть концепция мета-классов — как то даже сам класс является объектом мета-класса. Более того — даже просто кусок кода — это объект класса BlockClosure — его можно передавать, изменять, наследовать и т.д.
S>3. Динамическая типизация: всё проверяется во время выполнения.

Всё как в жаваскрипте, разве что BlockClosure не завезли.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.