Re[3]: Отказ от ООП - пример C# vs С++ vs Rust
От: sergii.p  
Дата: 18.09.23 11:06
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Но вообще лучше убрать Option — иначе будем обсуждать иной вопрос, а не сабжевый.


ну уберите и получите сразу уменьшение количества строк. И код будет уже сравним как минимум с С++.

S>Но вот взять базовый класс и вирт. функции с реализацией по умолчанию — в Rust для каждой из них нужно будет писать минимум 1 строчку кода для каждой функции в наследнике. Если, конечно, нет придумать спец. атрибут.


почему? И в Rust можно для характеристики прописать какой-то метод по default.
Re[8]: Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 18.09.23 11:54
Оценка:
Здравствуйте, so5team, Вы писали:

S>В цитате-то OK, но очень удивительно, как читая правильные вещи, вы не понимаете что это и где это в вашем коде.


Да я не думая даже написал — если поправят — то лучше запомню.

А в чем фейспалм тут: https://rsdn.org/forum/flame.comp/8601327.1
Автор: so5team
Дата: 18.09.23
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: Разраб  
Дата: 18.09.23 12:09
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Выводы какие? Даже на простейшем примере видно удобство ООП.


C# Затачивался под winforms.
rust и ++ из другой лиги.
ps ооп в расте лично мне понравилось. trait это как интерфейс и расширение в одном флаконе.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Отказ от ООП - пример C# vs С++ vs Rust
От: dsorokin Россия  
Дата: 18.09.23 17:22
Оценка: 3 (1)
Здравствуйте, Разраб, Вы писали:

Р>ps ооп в расте лично мне понравилось. trait это как интерфейс и расширение в одном флаконе.


P.P.S. traits в rust во многом сделаны по подобию классов типов из хаскеля. Названия терминов только более человеческие. Вот, например, trait object, вы не поверите, это что-то из разряда "existential quantification" в хаскеле, если я сам уже не забыл и не стал путаться в хаскелевской терминологии, а это возможно

p.p.p.s. Название написал со второй попытки — таки перепутал
Отредактировано 18.09.2023 17:42 dsorokin . Предыдущая версия .
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: graniar  
Дата: 19.09.23 07:12
Оценка: +1 :)))
Здравствуйте, Shmj, Вы писали:

S>Видно что ООП языки — примерно одинаковой компактности, в то время как язык без ООП даже на простейшем примере потребовал писать почти в 2 раза больше строк кода.


Хм, а у меня на C чуть покороче получилось:

#include <stdio.h>
int main()
{
    printf("Text=text\nIsChecked=1\n");
    return 0;
}
Re[2]: Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 19.09.23 21:46
Оценка:
Здравствуйте, graniar, Вы писали:

G>Хм, а у меня на C чуть покороче получилось:


На C будет примерно так:

#include <stdio.h>
#include <stdbool.h>

// Определение базовой структуры Widget
typedef struct Widget {
    char* ControlName;
    char* ControlId;
    void (*Render)(struct Widget*);
} Widget;

void Widget_Render(Widget* widget) {
    printf("%s=%s\n", widget->ControlName, widget->ControlId);
}

// Определение структуры TextEditWidget
typedef struct {
    Widget base;
    char* Text;
} TextEditWidget;

void TextEditWidget_Render(Widget* widget) {
    TextEditWidget* self = (TextEditWidget*)widget;
    Widget_Render(widget);
    printf("Text=%s\n", self->Text);
}

// Определение структуры CheckWidget
typedef struct {
    Widget base;
    bool IsChecked;
} CheckWidget;

void CheckWidget_Render(Widget* widget) {
    CheckWidget* self = (CheckWidget*)widget;
    Widget_Render(widget);
    printf("IsChecked=%s\n", self->IsChecked ? "true" : "false");
}

int main() {
    TextEditWidget textWidget = { { "Text1", "1", TextEditWidget_Render }, "text" };
    CheckWidget checkWidget = { { "Check1", "2", CheckWidget_Render }, true };

    Widget* widgets[2];
    widgets[0] = (Widget*)&textWidget;
    widgets[1] = (Widget*)&checkWidget;

    for(int i = 0; i < 2; i++) {
        widgets[i]->Render(widgets[i]);
    }

    return 0;
}
Re[3]: Отказ от ООП - пример C# vs С++ vs Rust
От: graniar  
Дата: 19.09.23 22:53
Оценка:
Здравствуйте, Shmj, Вы писали:

S>На C будет примерно так:



И не лень тебе было портировать эту простыню, лучше б подумал немножко, что тебе хотели сказать.

Мой код делает ровно тоже, что и твой. И проще и удобнее сопровождать.
Вот когда сложность задачи становится такой, что нахрапом ее не закодить, когда сущности и их связи перестают помещаться у тебя в голове, когда приходится делать много похожих вещей,
тогда и имеет смысл усложнять архитектуру, и вот там-то и становится понятным, какие фичи полезны и удобны, а какие не очень.
Re[4]: Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 19.09.23 22:57
Оценка:
Здравствуйте, graniar, Вы писали:

G>

G>И не лень тебе было портировать эту простыню, лучше б подумал немножко, что тебе хотели сказать.

Мне стоило лишь отдать приказ — и за меня все сделал раб мой GPT. Заняло 10 сек. моего времени.

G>Мой код делает ровно тоже, что и твой. И проще и удобнее сопровождать.


Но ведь смысл кода — продемонстрировать возможности языка по реализации Liskov substitution principle.
Отредактировано 19.09.2023 22:58 Shmj . Предыдущая версия .
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: vsb Казахстан  
Дата: 19.09.23 23:08
Оценка: +1
Ты ставишь необходимость ООП в аксиоматику и доказываешь, что код на языках, поддерживающие ООП, выглядит компактней.

С этим, конечно, спорить просто глупо.

Лично я считаю, что полновесный ООП уместен в малом числе случаев. Я вообще не припоминаю, когда последний раз я бы писал какую-то иерархию классов, кроме как для удовлетворения идиотского фреймворка.

Поэтому ООП я могу сравнить с такой фичей интересной, под названием "множественная диспетчеризация". В ООП выбор реализации метода зависит от типа первого аргумента this. Это одиночная диспатчеризация. Множественная диспатчеризация расширяет этот выбор до произвольного числа аргумнентов. В частности есть известный паттерн Визитёр, который, используя одиночную диспатчеризацию (к примеру C++, как в классической книге Четырёх) реализует двойную диспатчеризацию (ну и по аналогии можно реализовать произвольную диспатчеризацию). И там, где у языка с двойной диспатчеризацией будет очень простой код, этот самый Визитёр городит огромную кучу дополнительного кода.

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

По поводу ООП такого консенсуса нет, это я готов признать. Но своё мнение я высказал.

Лично я считаю полезным подмножеством ООП интерфейсы, наследование интерфейсов, реализации. Также может быть полезен синтаксический сахар, для замены наследования реализаций композицией. Вот это подмножество действительно полезно и часто применимо. А вот добавлять в это подмножество полновесное наследование реализаций (или, не приведи господи, множественное наследование реализаций) — лишнее. Вреда больше, чем пользы. И, что забавно, Go, Rust как раз и реализуют указанное подмножество.
Отредактировано 19.09.2023 23:09 vsb . Предыдущая версия .
Re[2]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 20.09.23 05:29
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Лично я считаю полезным подмножеством ООП интерфейсы, наследование интерфейсов, реализации...А вот добавлять в это подмножество полновесное наследование реализаций (или, не приведи господи, множественное наследование реализаций) — лишнее.


Э... А нет ли здесь противоречий? Или в первом предложении под словом "реализации" подразумевалось не 'наследование реализации'?
Re[2]: Отказ от ООП - пример C# vs С++ vs Rust
От: Sharov Россия  
Дата: 20.09.23 09:06
Оценка: +1
Здравствуйте, Разраб, Вы писали:

S>>Выводы какие? Даже на простейшем примере видно удобство ООП.

Р>C# Затачивался под winforms.

Тогда уж Ява, что, согласитесь, абсурдно.
Кодом людям нужно помогать!
Re[3]: Отказ от ООП - пример C# vs С++ vs Rust
От: vsb Казахстан  
Дата: 20.09.23 10:50
Оценка:
Здравствуйте, so5team, Вы писали:

vsb>>Лично я считаю полезным подмножеством ООП интерфейсы, наследование интерфейсов, реализации...А вот добавлять в это подмножество полновесное наследование реализаций (или, не приведи господи, множественное наследование реализаций) — лишнее.


S>Э... А нет ли здесь противоречий? Или в первом предложении под словом "реализации" подразумевалось не 'наследование реализации'?


Подразумевалось "интерфейсы", "наследование интерфейсов", "реализации".
Re[4]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 20.09.23 10:53
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>>>Лично я считаю полезным подмножеством ООП интерфейсы, наследование интерфейсов, реализации...А вот добавлять в это подмножество полновесное наследование реализаций (или, не приведи господи, множественное наследование реализаций) — лишнее.


S>>Э... А нет ли здесь противоречий? Или в первом предложении под словом "реализации" подразумевалось не 'наследование реализации'?


vsb>Подразумевалось "интерфейсы", "наследование интерфейсов", "реализации".


Понятнее не стало. А что такое "реализации" в контексте ООП?
Re[5]: Отказ от ООП - пример C# vs С++ vs Rust
От: vsb Казахстан  
Дата: 20.09.23 11:22
Оценка:
Здравствуйте, so5team, Вы писали:

vsb>>Подразумевалось "интерфейсы", "наследование интерфейсов", "реализации".


S>Понятнее не стало. А что такое "реализации" в контексте ООП?


Вот пример на Java. На С++ интерфейс это класс без данных и с полностью виртуальными методами.

// интерфейс
interface MyInterface1 {
   void foo();
}

// наследование интерфейсов
interface MyInteface2 extends MyInterface1 {
  void bar();
}

// реализация
class MyClass implements MyInterface2 {
  @Override void foo() {}
  @Override void bar() {}
}
Re[6]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 20.09.23 12:52
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>>>Подразумевалось "интерфейсы", "наследование интерфейсов", "реализации".


S>>Понятнее не стало. А что такое "реализации" в контексте ООП?


vsb>Вот пример на Java. На С++ интерфейс это класс без данных и с полностью виртуальными методами.


Что такое интерфейсы в Java понятно. Просто странно, что наличие такой штуки, как "реализация интерфейса" рассматривают как особенность ООП, да еще и положительную особенность.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.