Re[8]: Староверы не хотят переходить на Rust...
От: Privalov  
Дата: 16.09.24 06:24
Оценка:
Здравствуйте, Shmj, Вы писали:

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


Если язык без ООП даже рассматривать не стоит, значит, снова пихать его во все щели?
Интересно, как мне удалось обходиться без ООП, когда я JNI делал?
Re[9]: Староверы не хотят переходить на Rust...
От: Shmj Ниоткуда  
Дата: 16.09.24 07:04
Оценка: +1
Здравствуйте, Privalov, Вы писали:

P>Если язык без ООП даже рассматривать не стоит, значит, снова пихать его во все щели?


Во все щели пихать что угодно — это плохая практика, хотя и популярная. Пихать шаблоны во всех щели или лямбды — так же плохо, как и пихать ООП.
Re[10]: Староверы не хотят переходить на Rust...
От: Privalov  
Дата: 16.09.24 07:30
Оценка:
Здравствуйте, Shmj, Вы писали:

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


В предыдущем сообщении было:

язык без ООП даже рассматривать не стоит

Это разве не означает "пихать во все щели"?
Re[11]: Староверы не хотят переходить на Rust...
От: Shmj Ниоткуда  
Дата: 16.09.24 07:56
Оценка:
Здравствуйте, Privalov, Вы писали:

P>В предыдущем сообщении было:

P>

P>язык без ООП даже рассматривать не стоит

P>Это разве не означает "пихать во все щели"?

Нет. Если в языке есть ООП но ваша текущая задача его не требует — то не используйте. Вторая задача потребует ООП и вы будете писать на привычном вам языке.
Re[12]: Староверы не хотят переходить на Rust...
От: Privalov  
Дата: 16.09.24 08:10
Оценка:
Здравствуйте, Shmj, Вы писали:

P>>

P>>язык без ООП даже рассматривать не стоит


S>Нет. Если в языке есть ООП но ваша текущая задача его не требует — то не используйте. Вторая задача потребует ООП и вы будете писать на привычном вам языке.


А если в языке нет ООП и текущая задача его не требует, рассматривать?
Re[13]: Староверы не хотят переходить на Rust...
От: so5team https://stiffstream.com
Дата: 16.09.24 08:27
Оценка:
Здравствуйте, Privalov, Вы писали:

S>>Нет. Если в языке есть ООП но ваша текущая задача его не требует — то не используйте. Вторая задача потребует ООП и вы будете писать на привычном вам языке.


P>А если в языке нет ООП и текущая задача его не требует, рассматривать?


Лучше таки нет, т.к. нет запаса "на вырост".
Re[4]: Староверы не хотят переходить на Rust...
От: alpha21264 СССР  
Дата: 16.09.24 08:58
Оценка:
Здравствуйте, пффф, Вы писали:

П>Батхерт от собственных реализаций "тех же векторов/списков" происходит от того, что ничего нового, кроме кучи багов, эти реализации не добавляют обычно.


До сих пор контейнеры STL не имеют метода contains().

Течёт вода Кубань-реки куда велят большевики.
Re[4]: Староверы не хотят переходить на Rust...
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.09.24 15:51
Оценка: +1 :)
Здравствуйте, FR, Вы писали:

ЕМ>>В первую очередь — возможность указать компилятору "тут я замыслил делать вот так, и бей меня по рукам, если я где-то попробую сделать иначе".


FR>С такими мыслями надо сразу на раст переходить


В Rust, насколько я знаю, эта концепция используется весьма последовательно. А в C++ до сих пор борются (и еще долго будут бороться) два подхода: "этого нужно избегать любой ценой" и "если кажется, что программист решил отстрелить себе яйца, то недопустимо мешать ему сделать это с комфортом и без напряга".
Re[5]: Староверы не хотят переходить на Rust...
От: dsorokin Россия  
Дата: 16.09.24 16:55
Оценка:
Здравствуйте, Shmj, Вы писали:

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


S>>Очередная демонстрация незнания предмета. Без хорошего знания особенностей C++ сделать свой аналог std::vector будет не просто.


S>А свой аналог List на C# — легко сделать? Для частного случае, для себя, чтобы иметь ограниченное количество вариантов использования — не проблема. А вот чтобы это работало для других людей и миллионы людей с сотнями тысяч вариантов использования остались довольны — уже задача не такая уж простая


На C# несравнимо легче, на порядки легче. Хотя я с товарищем so5team предпочитаю не пересекаться, но вот здесь с ним соглашусь.

А так получается, что ты не читал ни талмуд Страуструпа (пример с simple vector), ни книгу Александреску и Саттера "Стандарты программирования" (про уровни безопасности). А исключения — это такая сложная штука. И мне, кстати, интересно, как в Аде с этим борются. Там исключения появились раньше, и преподносились они как супер-фича.

Вообще, так как я — неисправимый фанат ФП, то мне, конечно, нравится Rust. И один из моментов, почему нравится, это то, что из исключений там есть только паника. Сложность представляет собой код unsafe, где по-хорошему нужно думать о том, как будет вести себя блок unsafe во время паники, о чем многие забывают... В коде safe вроде как все должно отработать четко — так и задумывалось. А так, это такое облегчение, что в Rust почти нет исключений. Сразу гора с плеч. Но Rust все равно далек от идеала. У него и своих проблем хватает, которые я затронул выше. Увы, идеала никакого нет. Н-да, и не будет!
Re[6]: Староверы не хотят переходить на Rust...
От: Shmj Ниоткуда  
Дата: 16.09.24 17:30
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>На C# несравнимо легче, на порядки легче. Хотя я с товарищем so5team предпочитаю не пересекаться, но вот здесь с ним соглашусь.


Так а вы смотрели исходники стандартного List<T> в C#? Не так то все и просто

D>А так получается, что ты не читал ни талмуд Страуструпа (пример с simple vector), ни книгу Александреску и Саттера "Стандарты программирования" (про уровни безопасности). А исключения — это такая сложная штука. И мне, кстати, интересно, как в Аде с этим борются. Там исключения появились раньше, и преподносились они как супер-фича.


И так ясно что реализация vector из стандартной библиотеки — для большинства людей не посильна. Вот, для примера, что выдал GPT в качестве примера по моим наводкам:

#include <iostream>

#include <stdexcept>
#include <utility>
#include <iterator>  // для std::iterator

template<typename T>
class SimpleVector {
private:
    T* _data; // Тип должен быть T*, а не uint8_t*
    uint8_t _size;
    uint8_t _capacity;
    
public:
    SimpleVector() : _size(0), _capacity(10)
    {
        _data = new T[_capacity]; // Соответствует типу T
    }
    
    ~SimpleVector()
    {
        delete[] _data;
    }
    
    SimpleVector(const SimpleVector& other) : _size(other._size), _capacity(other._capacity)
    {
        _data = new T[_capacity];
        for (uint8_t i = 0; i < _size; ++i)
        {
            _data[i] = other._data[i];
        }
    }
    
    SimpleVector& operator=(const SimpleVector& other)
    {
        if (this == &other) return *this;
        
        delete[] _data;
        
        _size = other._size;
        _capacity = other._capacity;
        _data = new T[_capacity];
        
        for (uint8_t i = 0; i < _size; ++i)
        {
            _data[i] = other._data[i];
        }
        
        return *this;
    }
    
    SimpleVector(SimpleVector&& other) noexcept(std::is_nothrow_move_constructible<T>::value)
    : _data(other._data), _size(other._size), _capacity(other._capacity)
    {
        other._data = nullptr;
        other._size = 0;
        other._capacity = 0;
    }
    
    SimpleVector& operator=(SimpleVector&& other) noexcept(std::is_nothrow_move_constructible<T>::value)
    {
        if (this == &other) return *this;
        
        delete[] _data;
        
        _data = other._data;
        _size = other._size;
        _capacity = other._capacity;
        
        other._data = nullptr;
        other._size = 0;
        other._capacity = 0;
        
        return *this;
    }
    
    T& operator[](uint8_t index)
    {
        if (index >= _size) throw std::out_of_range("Index out of range");
        return _data[index];
    }
    
    void pushBack(const T& value)
    {
        if (_size == _capacity) resize();
        _data[_size++] = value;
    }
    
    uint8_t size() const
    {
        return _size;
    }
    
    uint8_t capacity() const
    {
        return _capacity;
    }
    
    // Итератор (неконстантный)
    class iterator {
    private:
        T* _ptr;
        
    public:
        using iterator_category = std::random_access_iterator_tag;
        using value_type = T;
        using difference_type = std::ptrdiff_t;
        using pointer = T*;
        using reference = T&;
        
        explicit iterator(T* ptr) : _ptr(ptr) {}
        
        T& operator*() const
        {
            return *_ptr;
        }
        
        iterator& operator++()
        {
            _ptr++;
            return *this;
        }
        
        iterator operator++(int)
        {
            iterator temp = *this;
            ++(*this);
            return temp;
        }
        
        iterator& operator--()
        {
            _ptr--;
            return *this;
        }
        
        iterator operator--(int)
        {
            iterator temp = *this;
            --(*this);
            return temp;
        }
        
        bool operator==(const iterator& other) const
        {
            return _ptr == other._ptr;
        }
        
        bool operator!=(const iterator& other) const
        {
            return _ptr != other._ptr;
        }
        
        iterator operator+(difference_type n) const
        {
            return iterator(_ptr + n);
        }
        
        iterator operator-(difference_type n) const
        {
            return iterator(_ptr - n);
        }
        
        difference_type operator-(const iterator& other) const
        {
            return _ptr - other._ptr;
        }
    };
    
    // Константный итератор
    class const_iterator {
    private:
        const T* _ptr;
        
    public:
        using iterator_category = std::random_access_iterator_tag;
        using value_type = T;
        using difference_type = std::ptrdiff_t;
        using pointer = const T*;
        using reference = const T&;
        
        explicit const_iterator(const T* ptr) : _ptr(ptr) {}
        
        const T& operator*() const
        {
            return *_ptr;
        }
        
        const_iterator& operator++()
        {
            _ptr++;
            return *this;
        }
        
        const_iterator operator++(int)
        {
            const_iterator temp = *this;
            ++(*this);
            return temp;
        }
        
        const_iterator& operator--()
        {
            _ptr--;
            return *this;
        }
        
        const_iterator operator--(int)
        {
            const_iterator temp = *this;
            --(*this);
            return temp;
        }
        
        bool operator==(const const_iterator& other) const
        {
            return _ptr == other._ptr;
        }
        
        bool operator!=(const const_iterator& other) const
        {
            return _ptr != other._ptr;
        }
        
        const_iterator operator+(difference_type n) const
        {
            return const_iterator(_ptr + n);
        }
        
        const_iterator operator-(difference_type n) const
        {
            return const_iterator(_ptr - n);
        }
        
        difference_type operator-(const const_iterator& other) const
        {
            return _ptr - other._ptr;
        }
    };
    
    // Методы для получения итераторов
    iterator begin()
    {
        return iterator(_data);
    }
    
    iterator end()
    {
        return iterator(_data + _size);
    }
    
    const_iterator begin() const
    {
        return const_iterator(_data);
    }
    
    const_iterator end() const
    {
        return const_iterator(_data + _size);
    }
    
    const_iterator cbegin() const
    {
        return const_iterator(_data);
    }
    
    const_iterator cend() const
    {
        return const_iterator(_data + _size);
    }
    
private:
    void resize()
    {
        _capacity *= 2;
        T* newData = new T[_capacity];
        for (uint8_t i = 0; i < _size; ++i)
        {
            newData[i] = _data[i];
        }
        delete[] _data;
        _data = newData;
    }
};


int main(int argc, const char * argv[]) {
    // Создаем вектор с элементами типа int
    SimpleVector<int> vec;
    
    // Добавляем несколько элементов
    vec.pushBack(10);
    vec.pushBack(20);
    vec.pushBack(30);
    
    // Выводим элементы с помощью индекса
    std::cout << "Элементы вектора (индексация):" << std::endl;
    for (uint8_t i = 0; i < vec.size(); ++i)
    {
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;
    
    // Используем итератор для вывода элементов
    std::cout << "Элементы вектора (итератор):" << std::endl;
    for (auto it = vec.begin(); it != vec.end(); ++it)
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    
    // Используем range-based for для вывода элементов
    std::cout << "Элементы вектора (range-based for):" << std::endl;
    for (const auto& elem : vec)
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;
    
    return 0;
}


Сможете ли вы сходу найти ошибки?
Re[7]: Староверы не хотят переходить на Rust...
От: dsorokin Россия  
Дата: 16.09.24 17:52
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Сможете ли вы сходу найти ошибки?


Я че тут на экзамене? Ты лучше запроси у этого искусственного неинтеллекта, что не так с твоим кодом — вдруг получится.

А если хочешь увидеть код на C# — возьми дизассемблер. Раньше был .NET Reflector. Сейчас — ILSpy.
Re[7]: Староверы не хотят переходить на Rust...
От: so5team https://stiffstream.com
Дата: 16.09.24 19:30
Оценка: 1 (1)
Здравствуйте, Shmj, Вы писали:

S>Сможете ли вы сходу найти ошибки?


Сходу, не вчитываясь, у вас конструктор копирования+операторы копирования и методы resize/pushBack не exception safe, в resize запросто произойдет переполнение _capacity, а еще ваш SimpleVector не будет работать с T у которого нет дефолтного конструктора.
Re[5]: Староверы не хотят переходить на Rust...
От: Stanislaw K СССР  
Дата: 16.09.24 19:42
Оценка:
Здравствуйте, Артём, Вы писали:

Аё>Если не могут написать с нуля на расте, тогда зачем мучают 5 точку? Вон в MS когда-то хотели всю OS на пончике запилить, но что-то пошло не так. На жаве попытки были "чистой безопасной OS".


в каждой sim карте сотового оператора и в каждой банковской карте с чипом (контактной или nfc) внутри работает jvm со своей безопасной ос.

это, примерно, от 30 до 50 миллиардов устройств в промышленной эксплуатации.
Все проблемы от жадности и глупости
Re[2]: Староверы не хотят переходить на Rust...
От: kov_serg Россия  
Дата: 16.09.24 20:26
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>что новые фичи (типа умных указателей) языку безопасности не прибавляют, так как всё равно остаются способы отстрелить себе ногу.


cve-rs allows you to introduce common memory vulnerabilities (such as buffer overflows and segfaults) into your Rust program in a memory safe manner
Re[9]: Староверы не хотят переходить на Rust...
От: пффф  
Дата: 16.09.24 20:56
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Интересно, как мне удалось обходиться без ООП, когда я JNI делал?


Наверное, всё можно было бы сделать в несколько раз проще. И скорее всего, ООП там тоже был, только свой, костыльный, как у vsb
Re[7]: Староверы не хотят переходить на Rust...
От: so5team https://stiffstream.com
Дата: 17.09.24 04:16
Оценка:
Здравствуйте, Shmj, Вы писали:

S>
S>    void resize()
S>    {
S>        _capacity *= 2;
S>        T* newData = new T[_capacity];
S>        for (uint8_t i = 0; i < _size; ++i)
S>        {
S>            newData[i] = _data[i];
S>        }
S>        delete[] _data;
S>        _data = newData;
S>    }
S>


S>Сможете ли вы сходу найти ошибки?


Еще из очевидного: ваш resize не обрабатывает ситуацию, когда вектор оказался пустым в результате перемещения. У вас _capacity будет 0, вы ноль умножите на два и получите ноль. Вот пример такого сценария:
SimpleVector<int> first;
first.pushBack(1);
first.pushBack(2);
SimpleVector<int> second{std::move(first)};
first.pushBack(3);
Re[8]: Староверы не хотят переходить на Rust...
От: Shmj Ниоткуда  
Дата: 17.09.24 05:07
Оценка:
Здравствуйте, so5team, Вы писали:

S>Еще из очевидного: ваш resize не обрабатывает ситуацию, когда вектор оказался пустым в результате перемещения. У вас _capacity будет 0, вы ноль умножите на два и получите ноль. Вот пример такого сценария:

S>
S>SimpleVector<int> first;
S>first.pushBack(1);
S>first.pushBack(2);
S>SimpleVector<int> second{std::move(first)};
S>first.pushBack(3);
S>


Если объект переместили — к нему уже нельзя обращаться. Какое поведение вы ожидали?
Re[9]: Староверы не хотят переходить на Rust...
От: so5team https://stiffstream.com
Дата: 17.09.24 05:56
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>Еще из очевидного: ваш resize не обрабатывает ситуацию, когда вектор оказался пустым в результате перемещения. У вас _capacity будет 0, вы ноль умножите на два и получите ноль. Вот пример такого сценария:

S>>
S>>SimpleVector<int> first;
S>>first.pushBack(1);
S>>first.pushBack(2);
S>>SimpleVector<int> second{std::move(first)};
S>>first.pushBack(3);
S>>


S>Если объект переместили — к нему уже нельзя обращаться. Какое поведение вы ожидали?


Тупизма и непонимания с вашей стороны. Что и получилось.

ЗЫ. Уж точно не тихой порчи хипа здесь нужно ожидать.
Re[10]: Староверы не хотят переходить на Rust...
От: Privalov  
Дата: 17.09.24 07:25
Оценка:
Здравствуйте, пффф, Вы писали:

П>Наверное, всё можно было бы сделать в несколько раз проще. И скорее всего, ООП там тоже был, только свой, костыльный, как у vsb


Основной проект был на Java. В принципе, ООП, только наследования реализации было слишком до хрена и часто не по делу.
Коллега делал какую-то утилиту или дополнение, уже не помню. И что-то ему понадобилось от Винды. А Java сама не могла. Коллега спросил меня, я был немного в курсе, ну и сделал JNI. Десятки строк на голых Сях, ничего особенного. Лепить классы, заворачивать их в функции было бы слишком.
В принципе я на Сях ничего такого больше нескольких сотен строк не делал. И, как правило, это были дополнения к чему-то. К Фортрану или Жаве. Плюс пара-тройка небольших утилит.
Re[10]: Староверы не хотят переходить на Rust...
От: Shmj Ниоткуда  
Дата: 17.09.24 07:45
Оценка:
Здравствуйте, so5team, Вы писали:

S>Тупизма и непонимания с вашей стороны. Что и получилось.

S>ЗЫ. Уж точно не тихой порчи хипа здесь нужно ожидать.

Ну перейти на личности легче всего. А конкретно — после std::move(first) вы опять пытаетесь использовать first. В Rust вам бы на уровне компиляции выдало ошибку, в C++ ошибку на уровне компиляции не выдаст, но все знают что так делать нельзя.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.