Re[5]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Doom100500 Израиль  
Дата: 01.09.25 10:34
Оценка:
Здравствуйте, Michael7, Вы писали:

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


D>>CreateFile — какое сообщение и кому отправляет? Где ловят ответ на это сообщение? WIN API — это не только GUI. А GUI — это обмен сообщениями везде — не только в WINAPI.


M>Я в основном про GUI виндов. Если бы CreateFile отправлял сообщения это уже какой-то совсем SmallTalk был бы.


WIN API — это не только GUI. А GUI — это обмен сообщениями везде — не только в WINAPI.


А причём тут WINAPI?
Спасибо за внимание
Re[6]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: sergii.p  
Дата: 01.09.25 10:35
Оценка:
Здравствуйте, so5team, Вы писали:

S>Дал бы Шмыга определение Ъ-шности, было бы проще. Но Шмыга как обычно Шмыга.

S>Поэтому можно озвучить вот такой критерий.

вот например определение от ИИ:

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


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

S>Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):


С адаптером можно:
#include <iostream>

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(); }
void consume_B(B & o) { o.f(); }

struct A_side : A
{
    void f() override
    {
        std::cout << "D's f from A\n";
        A::f();
    }
};

struct B_side : B
{
    void f() override
    {
        std::cout << "D's f from B\n";
        B::f();
    }
};

struct C : A_side, B_side
{};

int main()
{
    C c;
    consume_A(c);
    consume_B(c);
}


D's f from A
A::f
D's f from B
B::f


Я не ради спора с вашим определением "ООП-чистого языка", а к тому, что желаемый практический эффект достигается имеющимися средствами.
Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: so5team https://stiffstream.com
Дата: 01.09.25 10:40
Оценка: :))
Здравствуйте, sergii.p, Вы писали:

SP>вот например определение от ИИ:


SP>

SP>Объектно-ориентированное программирование — это парадигма программирования, в которой основными строительными блоками являются объекты, представляющие собой экземпляры классов, объединяющие в себе состояние (данные) и поведение (методы). ООП направлено на моделирование реального мира через абстракции, обеспечивая гибкость, масштабируемость и повторное использование кода.


SP>Так как это скорее всего компиляция из многих источников, то можно сказать что наиболее широко распространённое определение.

SP>Никакого множественного наследования, никаких сигналов из smalltalk.

Определение ООП без "наследования, инкапсуляции и полиморфизма" (хотя бы)?

Не, не пойдет.
Re[3]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: so5team https://stiffstream.com
Дата: 01.09.25 10:42
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Я не ради спора с вашим определением "ООП-чистого языка", а к тому, что желаемый практический эффект достигается имеющимися средствами.


Прекрасно и что?
Re[4]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: rg45 СССР  
Дата: 01.09.25 11:01
Оценка:
Здравствуйте, so5team, Вы писали:

R>>И я бы не сказал, что это какая-то широкораспространённая проблема, которая создаёт массовые неудобства.


S>Речь не про проблему, а про определения и следование этим определениям.


А из какого определения (ООП или полиморфизма) следует, что вызовы consume_a и consume_b обязаны дать разные результаты? Что мешает реализовать D::f, например, вот так:

http://coliru.stacked-crooked.com/a/fe324739d29727b0

struct D : A, B
{
  void f() override {
    A::f();
    B::f();
    std::cout << "D::f" << std::endl;
  }
};


Из общих соображений: имя функции в совокупности с набором формальных параметром задают определенную семантику. Если одна и та же семантическая операция даёт один и тот же результат для одного и того же объекта, даже если она выполнена через разные интерфейсы, то как это может противоречить принципам ООП? Как по-мне, то это просто частный случай, а не нарушение каких-то общих требований.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.09.2025 11:20 rg45 . Предыдущая версия . Еще …
Отредактировано 01.09.2025 11:19 rg45 . Предыдущая версия .
Отредактировано 01.09.2025 11:18 rg45 . Предыдущая версия .
Отредактировано 01.09.2025 11:10 rg45 . Предыдущая версия .
Отредактировано 01.09.2025 11:07 rg45 . Предыдущая версия .
Отредактировано 01.09.2025 11:04 rg45 . Предыдущая версия .
Re[5]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: so5team https://stiffstream.com
Дата: 01.09.25 11:21
Оценка:
Здравствуйте, rg45, Вы писали:

S>>Речь не про проблему, а про определения и следование этим определениям.


R>А из какого определения (ООП или полиморфизма) следует, что полиморфное поведение должно быть реализовано только так, как показано у тебя в примере, а не, например, как в примере ниже?


R>Как по-мне, то это просто частный случай, а не нарушение каких-то общих требований.


А как по мне, так здесь есть откровенная тупизна и нежелание подумать хоть чуть-чуть за пределами привычного.

Вот в стартовом сообщении было сказано "настоящий ООП — был только в Smalltalk".
Попробуем посмотреть на это утверждение с позиции решения конкретной проблемы (мой исходный пример).
Эта проблема в SmallTalk не решается, хотя, казалось бы, мы же исключительно в рамках ООП находимся.
Т.е. типа "настоящий ООП" из SmallTalk-а не может помочь в чисто ООП-ной парадигме.

С другой стороны, есть язык Eiffel, в котором, емнип, этой проблемы нет как класса, т.к. там есть языковая фича по переименованию унаследованных методов. Что-то вроде:
class
  D
inherit
  A
    rename
      f as f_A
    end
  B
    rename
      f as f_B
    end
feature
  f_A
    do
      ...
    end
  f_B
    do
      ...
    end
end


При этом Eiffel, поскольку он не SmallTalk, а "настоящий ООП только в SmallTalk" -- значит настоящим ОО-языком типа быть не должен.
Зато эту самую проблему он решает искаропочными средствами без привлечения каких-либо промежуточных костылей.

Следовательно, к "настоящему ООП" из SmallTalk-а есть вопросики.

Но, блин, C++ники, сломя голову бросились защищать C++, типа "ну как же на нем такого не сделать, ну вот же ж у меня же ж..."
Тьфу, срамота.
Отредактировано 01.09.2025 11:30 so5team . Предыдущая версия .
Re[6]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: rg45 СССР  
Дата: 01.09.25 11:28
Оценка:
Здравствуйте, so5team, Вы писали:

S>Вот в стартовом сообщении было сказано "настоящий ООП — был только в Smalltalk".

S>Попробуем посмотреть на это утверждение с позиции решения конкретной проблемы (мой исходный пример).
S>Эта проблема в SmallTalk не решается, хотя, казалось бы, мы же исключительно в рамках ООП находимся.
S>Т.е. типа "настоящий ООП" из SmallTalk-а не может помочь в чисто ООП-ной парадигме.

S>При этом Eiffel, поскольку он не SmallTalk, а "настоящий ООП только в SmallTalk" -- значит настоящим ОО-языком типа быть не должен.

S>Это эту самую проблему он решает искаропочными средствами без привлечения каких-либо промежуточных костылей.

S>Следовательно, к "настоящему ООП" из SmallTalk-а есть вопросики.


S>Но, блин, C++ники, сломя голову бросились защищать C++, типа "ну как же на нем такого не сделать, ну вот же ж у меня же ж..."

S>Тьфу, срамота.

Ну чего ты кипятишься? Ты заложил в свое сообщение неявную цепочку рассуждений, слишком сложную для среднего ума
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.09.2025 11:29 rg45 . Предыдущая версия .
Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: so5team https://stiffstream.com
Дата: 01.09.25 11:32
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ну чего ты кипятишься?


Вот только диагнозы через Интернет не надо ставить.

R>Ты заложил в свое сообщение неявную цепочку рассуждений, слишком сложную для среднего ума


C++ники решили, что они могут позволит себе нарушать условия задачи. Кто-то non-virtual-public-interface решил использовать, кто-то дополнительные сущности. А низзя!
Re[6]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: B0FEE664  
Дата: 01.09.25 12:13
Оценка:
Здравствуйте, so5team, Вы писали:

S>>>Предлагаю посмотреть на свой код, на исходный и сравнить сигнатуры виртуальных методов f и vf. В исходном примере сигнатуры одинаковые, в вашем -- нет.

BFE>>Сигнатуры f одинаковые.
S>f в вашем примере не виртуальная функция. Т.е. это не эквивалент ни разу.
Так в этом и состоит "ошибка" исходного примера: если потомок не должен наследовать поведение, то функция не должна быть виртуальной.

S>Ваш пример показывает то, что если в языке напрямую нельзя сделать требуемое, то можно найти обходной маневр, усложнить логику и обложиться обертками. Но все это лишь демонстрирует недостаточный уровень поддержки ООП из-за чего обходной маневр с обертками и нужен.

Не согласен. Приведённый пример может демонстрировать три различных проблемы:
1) ошибка в дизайне иерархии: метод который не должен наследоваться объявлен виртуальным;
2) ошибка в дизайне класса D: вместо композиции/агрегации использовано наследование;
3) пересечение по именам в названии наследуемого метода (это когда методы делают совершенно разное, но совпали по именам)

1) Первый случай очень редкий. Очень редко но бывает, что метод совпадает по имени и сигнатуре, но не наследуется. Такое может быть, если наследование не public.
2) Второй случай самый распространённый. Бывает сложно отличить владение объектом в единственном экземпляре от наследования от этого объекта. Для различения следует использовать эвристический приём: если класс B может хотя бы теоретически (даже если в коде такого нет и никогда не будет) иметь два объекта класса A, то должна быть композиция/агрегация, а не наследование. (Автомобиль можно отнаследовать от мотора, но — нет, так делать не надо. Поток можно отнаследовать от буфера — у обоих есть схожие методы put, flush, но так как у потока теоретически может быть несколько буферов или не быть его вовсе, то это не отношение наследования).
3) Пересечение по именам не связано с ООП и может происходить (и происходит) в других языках, без ООП.
И каждый день — без права на ошибку...
Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: so5team https://stiffstream.com
Дата: 01.09.25 12:28
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>>Сигнатуры f одинаковые.

S>>f в вашем примере не виртуальная функция. Т.е. это не эквивалент ни разу.
BFE>Так в этом и состоит "ошибка" исходного примера: если потомок не должен наследовать поведение, то функция не должна быть виртуальной.

Вы пример не поняли, а искать ошибки в нем начали. Ну OK.

BFE>Не согласен. Приведённый пример может демонстрировать три различных проблемы:


Три не может. Он демонстрирует возможность или невозможность решить средствами языка программирования одну единственную проблему:

BFE>3) пересечение по именам в названии наследуемого метода (это когда методы делают совершенно разное, но совпали по именам)


Из-за чего она возникла -- ошибки в дизайне или отшибки в ДНК спорящих на RSDN -- вообще не важно.
Re[5]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.09.25 12:48
Оценка:
Здравствуйте, Артём, Вы писали:

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


Аё>Duck typing. В go и в obj C не нужно объявлять интерфейс с методами- только сигнатуру метода.


В плюсах даже сигнатуру метода объявлять не обязательно
Маньяк Робокряк колесит по городу
Re[8]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: B0FEE664  
Дата: 01.09.25 13:04
Оценка:
Здравствуйте, so5team, Вы писали:

BFE>>Не согласен. Приведённый пример может демонстрировать три различных проблемы:

S>Три не может.
Может и больше, так как всё зависит от того, что в голове у автора. Другой автор, не вы, может с помощью этого примера демонстрировать совершенно другую проблему. Страуструп, наверное, сказал бы, что здесь не хватает обобщённых методов. Ещё можно сказать, что задачу (возможно, не проверял) можно разрешить с помощью deducing this...

S>Он демонстрирует возможность или невозможность решить средствами языка программирования одну единственную проблему:

BFE>>3) пересечение по именам в названии наследуемого метода (это когда методы делают совершенно разное, но совпали по именам)
А почему вы отвергаете другие интерпретации? Они ничем не хуже.

S>Из-за чего она возникла -- ошибки в дизайне или отшибки в ДНК спорящих на RSDN -- вообще не важно.

Да, причина не важна. Хотелось бы другого — понять в чём, собственно, проблема. Если в том, чтобы знать приведённый тип объекта, от которого был вызван метод, то нужны либо deducing this, либо чтобы deducing this был виртуальным (чего нет).
И каждый день — без права на ошибку...
Re[6]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Michael7 Россия  
Дата: 01.09.25 13:08
Оценка:
Здравствуйте, Doom100500, Вы писали:


M>>Я в основном про GUI виндов. Если бы CreateFile отправлял сообщения это уже какой-то совсем SmallTalk был бы.


D>

D> WIN API — это не только GUI. А GUI — это обмен сообщениями везде — не только в WINAPI.


D>А причём тут WINAPI?


Что-то это как придирки уже выглядит. API виндов — это WinAPI по определению. И довольно очевидно, что их разработчики (Ok, GUI подмножества) явно имели ввиду концепцию обмена сообщениями. Вот и все о чем речь. Знали ли они про SmallTalk тоже интересный вопрос, в принципе весьма вероятно, что знали.
Re[9]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: so5team https://stiffstream.com
Дата: 01.09.25 13:14
Оценка:
Здравствуйте, B0FEE664, Вы писали:

S>>Из-за чего она возникла -- ошибки в дизайне или отшибки в ДНК спорящих на RSDN -- вообще не важно.

BFE>Да, причина не важна. Хотелось бы другого — понять в чём, собственно, проблема.

А что вам не понято в исходном примере?
Тип D должен быть отнаследован непосредственно от A и B, в A и B не должно быть никаких оберток над f, в типе D нужно явно указывать какую из реализаций f мы переопределяем (а в новой реализации нужно еще и явно дернуть унаследованную версию f из нужного класса).

Если вам непонятно нахера это надо, то подумайте вот о чем: есть ли практический смысл в задачках вида "напишите самую длинную последовательность из ключевых слов C++, которая была бы валидным компилирующимся выражением, по типу inline constexpr const char * const f()" кроме как гимнастика ума и банальная эрудиция?

Вот мой пример из этой же области.

Но если вы продолжите демонстрировать ширину и глубину мысли, приплетая сюда собственные фантазии о том, а чтобы сказал Страуструп, то давайте закончим и не будем морочить друг другу голову.
Re[6]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: B0FEE664  
Дата: 01.09.25 13:15
Оценка:
Здравствуйте, so5team, Вы писали:

BFE>>Кстати, у вас сигнатуры метода f разные:

BFE>>

BFE>> void f() override A::f {
BFE>> void f() override B::f {


S>Вам альтернативная одаренность не позволила воспринять слова "псевдокод в синтаксисе a la C++" или где? Или вы думаете, что ключевое слово override в C++ является частью сигнатуры?

Или где.
Функции различаются по сигнатуре. Если у двух функций совпадают сигнатуры, значит и сами функции совпадают. У вас две разные функции на псевдокоде в синтаксисе a la C++. Следовательно их сигнатуры не совпадают.

S>Блин, я не против конструктивного общения, но когда человек упорно тупит и не пытается воспринять то, что ему говорят (или уточнить то, что он не понимает), это утомляет.

Для конструктивного общения нет ясного изложения проблематики.
И каждый день — без права на ошибку...
Re[7]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: so5team https://stiffstream.com
Дата: 01.09.25 13:20
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Функции различаются по сигнатуре.


Нет.

BFE>Если у двух функций совпадают сигнатуры, значит и сами функции совпадают.


Да что вы говорите? Может у вас std::sin и std::cos совпадают? Хотя сигнатуры у них одинаковые.

BFE>У вас две разные функции на псевдокоде в синтаксисе a la C++. Следовательно их сигнатуры не совпадают.


Вам бы в церковь, что ли. А то слишком много разного кажется.

BFE>Для конструктивного общения нет ясного изложения проблематики.


Для конструктивного общения вам бы почитать то, что здесь уже написано. И поменьше выдумывать несуществующих деталей.
Re: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.09.25 13:24
Оценка:
Здравствуйте, Shmj, Вы писали:

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


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


А С# не претендует на настоящий ООП язык? И что ему для этого не хватает?
и солнце б утром не вставало, когда бы не было меня
Re[8]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: B0FEE664  
Дата: 01.09.25 13:28
Оценка:
Здравствуйте, so5team, Вы писали:

BFE>>Функции различаются по сигнатуре.

S>Нет.
Признаю ошибку.

BFE>>Если у двух функций совпадают сигнатуры, значит и сами функции совпадают.

S>Да что вы говорите? Может у вас std::sin и std::cos совпадают? Хотя сигнатуры у них одинаковые.
Но вы то ещё хотите, чтобы и имена совпадали.

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

Может стоило сразу написать чего вы хотите, чтобы читатели не мучились в догадках?
И каждый день — без права на ошибку...
Re[9]: Недоучки по настоящему ООП не освоили (из-за Basic и С++)
От: so5team https://stiffstream.com
Дата: 01.09.25 13:33
Оценка:
Здравствуйте, B0FEE664, Вы писали:

S>>Да что вы говорите? Может у вас std::sin и std::cos совпадают? Хотя сигнатуры у них одинаковые.

BFE>Но вы то ещё хотите, чтобы и имена совпадали.

Нет. Я показываю проблему, когда в базовых классах имена совпадают. А в производном нужно как-то сделать выбор чтобы явно указать какой именно метод переопределяется.

Если бы такого совпадения не было, то не было бы и проблемы и задачки такой не возникло бы.

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

BFE>Может стоило сразу написать чего вы хотите, чтобы читатели не мучились в догадках?

Вообще-то все было показано.

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