Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 17.09.23 09:16
Оценка:
Давайте пока с простейшего примера, потом, возможно, добавлю чуть интереснее:

  C#
namespace ConsoleApp4 {
    internal class Program {
        class Widget {
            public string? ControlName { get; set; }
            public string? ControlId { get; set; }

            public virtual void Render() {
                Console.WriteLine(ControlName + "=" + ControlId);
            }
        }

        class TextEditWidget : Widget {
            public string? Text { get; set; }

            public override void Render() {
                base.Render();
                Console.WriteLine("Text=" + Text);
            }
        }

        class CheckWidget : Widget {
            public bool IsChecked { get; set; }

            public override void Render() {
                base.Render();
                Console.WriteLine("IsChecked=" + IsChecked);
            }
        }

        static void Main(string[] args) {
            List<Widget> widgets = new List<Widget>();

            widgets.Add(new TextEditWidget() { ControlId = "1", ControlName="Text1", Text="text"});
            widgets.Add(new CheckWidget { ControlId = "2", ControlName = "Check1", IsChecked = true});
            
            foreach (var widget in widgets)
            {
                widget.Render();
            }
        }
    }
}


42 строки

  C++
#include <iostream>
#include <string>
#include <vector>
#include <memory>

class Widget {
public:
    std::string controlName;
    std::string controlId;

    Widget(const std::string& controlName, const std::string& controlId) noexcept 
        : controlName(controlName), controlId(controlId) { }

    virtual void Render() {
        std::cout << controlName << "=" << controlId << std::endl;
    }
};

class TextEditWidget : public Widget {
public:
    std::string text;

    TextEditWidget(const std::string& controlName, const std::string& controlId, const std::string& text) noexcept
        : Widget(controlName, controlId), text(text) { }

    void Render() override {
        Widget::Render();
        std::cout << "Text=" << text << std::endl;
    }
};

class CheckWidget : public Widget {
public:
    bool isChecked;

    CheckWidget(const std::string& controlName, const std::string& controlId, const bool isChecked) noexcept
        : Widget(controlName, controlId), isChecked(isChecked) { }

    void Render() override {
        Widget::Render();
        std::cout << "IsChecked=" << isChecked << std::endl;
    }
};

int main() {
    std::vector<std::unique_ptr<Widget>> widgets;

    auto textWidget = std::make_unique<TextEditWidget>("1", "Text1", "text");
    widgets.push_back(std::move(textWidget));

    auto checkWidget = std::make_unique<CheckWidget>("2", "Check1", true);
    widgets.push_back(std::move(checkWidget));

    for (const auto& widget : widgets) {
        widget->Render();
    }

    return 0;
}


59 строк

  Rust
trait Widget {
    fn render(&self);
}

struct BaseWidget {
    control_name: Option<String>,
    control_id: Option<String>,
}

impl Widget for BaseWidget {
    fn render(&self) {
        if let Some(ref name) = self.control_name {
            print!("{}", name);
        }

        print!("=");

        if let Some(ref id) = self.control_id {
            print!("{}", id);
        }

        println!();
    }
}

struct TextEditWidget {
    base: BaseWidget,
    text: Option<String>,
}

impl Widget for TextEditWidget {
    fn render(&self) {
        self.base.render();
        if let Some(ref text) = self.text {
            println!("Text={}", text);
        }
    }
}

struct CheckWidget {
    base: BaseWidget,
    is_checked: bool,
}

impl Widget for CheckWidget {
    fn render(&self) {
        self.base.render();
        println!("IsChecked={}", self.is_checked);
    }
}

fn main() {
    let widgets: Vec<Box<dyn Widget>> = vec![
        Box::new(TextEditWidget {
            base: BaseWidget {
                control_id: Some("1".to_string()),
                control_name: Some("Text1".to_string()),
            },
            text: Some("text".to_string()),
        }),
        Box::new(CheckWidget {
            base: BaseWidget {
                control_id: Some("2".to_string()),
                control_name: Some("Check1".to_string()),
            },
            is_checked: true,
        }),
    ];

    for widget in widgets {
        widget.render();
    }
}


73 строки

Видно что ООП языки — примерно одинаковой компактности, в то время как язык без ООП даже на простейшем примере потребовал писать почти в 2 раза больше строк кода. Хотя там еще добавляется многословность в связи с Option — но кто им виноват, что не использовали ? как в C# на уровне языка, а то постоянно лепят свой Option.

Выводы какие? Даже на простейшем примере видно удобство ООП. А теперь представьте что пример будет реальным — сразу 50 тыс. строк превращаются в 100 тыс.
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: kov_serg Россия  
Дата: 17.09.23 09:54
Оценка: +1 -1 :)
Здравствуйте, Shmj, Вы писали:

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

S>C# 42 строки
S>C++ 59 строк
S>Rust 73 строки

S>Выводы какие? Даже на простейшем примере видно удобство ООП. А теперь представьте что пример будет реальным — сразу 50 тыс. строк превращаются в 100 тыс.

Никакие. Язык без ООП lua:
require "object"

Widget={ render=function(self) print(self.name.."="..self.id)  end }
TextEditWidget=object(Widget) { render=function(self) inherited(self,"render")() print("Text="..self.text)  end }
CheckWidget=object(Widget) { render=function(self)  inherited(self,"render")() print(("IsChecked=%s"):format(self.is_checked))  end }

local widgets={}
table.insert(widgets, object(TextEditWidget) { id=1, name="Text1", text="text" })
table.insert(widgets, object(CheckWidget) { id=2, name="Check1", is_checked=true })
for i,widget in pairs(widgets) do widget:render() end

10 строк и 12 строк эмуляция ооп
  object.lua
function object(parent)
    return function(prm)
        local res=setmetatable(prm or {},{__index=parent})
        if res.init then res:init() end
        return res
    end
end
function inherited(obj,fn)
    local class=(getmetatable(obj) or {__index={}}).__index
    local parent=(getmetatable(class) or {__index={}}).__index
    return function(...) if parent~=nil then local f=parent[fn] if f~=nil then return f(obj,...) end end end
end
Отредактировано 17.09.2023 9:55 kov_serg . Предыдущая версия .
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: Нomunculus Россия  
Дата: 17.09.23 10:00
Оценка: 3 (1) +3
Здравствуйте, Shmj, Вы писали:

Как ты связал простоту и краткость? Вообще не связанные вещи. Докторская Ландау занимала пять страниц. Теорема Ферма вообще на полях книги была написана.

И с чего ты вдруг решил, что «раз на простом примере… значит». Нифига не значит. Hello World на MFC займет сотни строк. И что? Да ничего
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: T4r4sB Россия  
Дата: 17.09.23 14:23
Оценка: +1
Здравствуйте, Shmj, Вы писали:

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



Дык примеры неравноценны. Давай в крестах с опционами покажи. Ну и в русте куча лишних строк изза того что не использовано .unwrap_or()
Re[2]: Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 17.09.23 15:05
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Дык примеры неравноценны. Давай в крестах с опционами покажи. Ну и в русте куча лишних строк изза того что не использовано .unwrap_or()


Но вообще лучше убрать Option — иначе будем обсуждать иной вопрос, а не сабжевый. Можно сказать что Option протек случайно — не хотел писать конструктор в C#-версии и просто на автомате применил nullable-типы, а в Rust это потребовало писать Option.

Но вот взять базовый класс и вирт. функции с реализацией по умолчанию — в Rust для каждой из них нужно будет писать минимум 1 строчку кода для каждой функции в наследнике. Если, конечно, нет придумать спец. атрибут.
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: SkyDance Земля  
Дата: 17.09.23 15:12
Оценка:
S> widgets.Add(new TextEditWidget() { ControlId = "1", ControlName="Text1", Text="text"});
S>42 строки

Строка длиной в 100 символов.

S> TextEditWidget(const std::string& controlName, const std::string& controlId, const std::string& text) noexcept

S>59 строк

Строка длиной в 115 символов.

S> Box::new(TextEditWidget {

S> base: BaseWidget {
S> control_id: Some("1".to_string()),
S> control_name: Some("Text1".to_string()),
S> },
S> text: Some("text".to_string()),
S> }),
S>73 строки

А тут даже с огроменными отступами самая длинная строка — 57 символов (без отступов и вовсе 41).

Сдается мне, тут имеет место быть сравнение идиотичности форматтеров (или выбраного стиля форматирования).
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: Muxa  
Дата: 17.09.23 17:18
Оценка:
S>Выводы какие? Даже на простейшем примере видно удобство ООП. А теперь представьте что пример будет реальным — сразу 50 тыс. строк превращаются в 100 тыс.

А какую проблему пытаешься решить? Сэкономить место в репе или время набора текста?
Пока что ничего кроме как «и чо?» не приходит в голову в качестве ответного комента.
Отредактировано 17.09.2023 18:19 Muxa . Предыдущая версия .
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 17.09.23 17:55
Оценка: 3 (1)
Здравствуйте, Shmj, Вы писали:

S>[ccode]

S>class Widget {
S>public:
S> std::string controlName;
S> std::string controlId;

S> Widget(const std::string& controlName, const std::string& controlId) noexcept

S> : controlName(controlName), controlId(controlId) { }
S>[/code]

Это вам ChatGPT подсказал такую срань: пометить подобного вида конструктор как noexcept?
Re[2]: Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 17.09.23 19:22
Оценка:
Здравствуйте, so5team, Вы писали:

S>Это вам ChatGPT подсказал такую срань: пометить подобного вида конструктор как noexcept?


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

Для vector нужно ставить на конструктор перемещения, иначе при расширении будет использовать копирование вместо перемещения.
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: Разраб  
Дата: 17.09.23 23:57
Оценка:
Здравствуйте, Shmj, Вы писали:



S>Выводы какие? Даже на простейшем примере видно удобство ООП. А теперь представьте что пример будет реальным — сразу 50 тыс. строк превращаются в 100 тыс.


https://doc.rust-lang.org/stable/book/ch17-00-oop.html

C# нет смысла сравнивать. Код на rust более читабельный(понятный) чем на плюсах.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 18.09.23 05:26
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>Это вам ChatGPT подсказал такую срань: пометить подобного вида конструктор как noexcept?


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


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


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

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

S>

Готов выслушать конкретику. Вот пример, который это демонстрирует: https://metanit.com/cpp/tutorial/14.4.php
Re[5]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 18.09.23 07:36
Оценка:
Здравствуйте, Shmj, Вы писали:

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

S>>

S>Готов выслушать конкретику.


А я не готов учить вас забесплатно. Вы ChatGPT деньги платите, вот пусть ChatGPT вас и учит.

S>Вот пример, который это демонстрирует: https://metanit.com/cpp/tutorial/14.4.php


Вот уж в прямом смысле "смотришь в книгу, а видишь..."
Re: Отказ от ООП - пример C# vs С++ vs Rust
От: vdimas Россия  
Дата: 18.09.23 09:42
Оценка:
Здравствуйте, Shmj, Вы писали:

S>C#

S>42 строки

S>C++

S>59 строк

Можно было портировать один-в-один строки
widgets.Add(new TextEditWidget() { ControlId = "1", ControlName="Text1", Text="text"});
widgets.Add(new CheckWidget { ControlId = "2", ControlName = "Check1", IsChecked = true});
Re[6]: Отказ от ООП - пример C# vs С++ vs Rust
От: Shmj Ниоткуда  
Дата: 18.09.23 09:46
Оценка:
Здравствуйте, so5team, Вы писали:

S> Вот уж в прямом смысле "смотришь в книгу, а видишь..."


Да вот же:

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

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


Тут не учить за бесплатно — а просто признай что не знал этого — не сталкивался. И хотел как бы покичиться — а вышло наоборот, что опозорился.

Или если я не прав — то ткни носом, а не прячься за, мол, учить бесплатно.
Re[4]: Отказ от ООП - пример C# vs С++ vs Rust
От: T4r4sB Россия  
Дата: 18.09.23 09:47
Оценка:
Здравствуйте, so5team, Вы писали:

S>


Для тебя это открытие?
Re[5]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 18.09.23 09:57
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>


TB>Для тебя это открытие?


Нет. Но глубина поражает. Как тут не вспомнить Энштейна с его бесконечностями...
Re[7]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 18.09.23 10:03
Оценка: 1 (1)
Здравствуйте, Shmj, Вы писали:

S>Или если я не прав — то ткни носом


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

В общем, я давно придерживаюсь мнения, что далеко не всех людей можно научить программировать. А из тех, кого можно научить программировать, далеко не всех можно научить программировать на C++ (а программировать нормально на чистом Си можно научить вообще исчезающе малое количество). Обычно за такой шовинизм мне прилетает. Но вы являетесь отличным доказательством того, что я прав

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


Вообще-то когда мы обучаем людей пользоваться нашими инструментами, то иногда (к счастью иногда) приходится и объяснять какие-то вещи из C++. Делается это все за деньги.

Но, может быть здесь найдется добрая душа, которая объяснит вам в чем дело. Забесплатно.
Re[8]: Отказ от ООП - пример C# vs С++ vs Rust
От: student__  
Дата: 18.09.23 10:46
Оценка:
Здравствуйте, so5team, Вы писали:

S>Но, может быть здесь найдется добрая душа, которая объяснит вам в чем дело. Забесплатно.


А зачем вообще существуют форумы, типа того же RSDN?
Здесь же тоже бесплатно отвечают на вопросы.
Во всяком случае, я ценников на ответах не видел.
Re[9]: Отказ от ООП - пример C# vs С++ vs Rust
От: so5team https://stiffstream.com
Дата: 18.09.23 10:59
Оценка:
Здравствуйте, student__, Вы писали:

S>>Но, может быть здесь найдется добрая душа, которая объяснит вам в чем дело. Забесплатно.


__>А зачем вообще существуют форумы, типа того же RSDN?

__>Здесь же тоже бесплатно отвечают на вопросы.
__>Во всяком случае, я ценников на ответах не видел.

Ага. А потом приходит Шмыж и все портит. Он уже знаменит (по крайней мере в форумах по C/C++) своим нежеланием воспринимать то, что ему пытаются объяснить (а делать это пытались неоднократно). Так что дело именно в нежелании помогать конкретному персонажу, а не вообще.
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...
Пока на собственное сообщение не было ответов, его можно удалить.