Дополнить wrapper новыми методами - как бы вы сделали
От: Shmj Ниоткуда  
Дата: 13.10.23 05:40
Оценка:
Есть 2 библиотеки. Одна официальная — 10 тыс. звезд. Вторая — враппер над основным классом этой библиотеки — 100 звезд.

Вот именно так сделано, это 100% отражает суть проблемы. Фукнция open не статическая (но вряд ли это чем поможет):

  Скрытый текст
#include <iostream>

class SuperStarClass1
{
public:
    void superFun1() { std::cout << "1 \r\n"; }
    void superFun2() { std::cout << "2 \r\n"; }
};

class Wrapper
{
public:
    Wrapper* open()
    {
        Wrapper* wrapper = new Wrapper();
        wrapper->m_superStar = std::make_unique<SuperStarClass1>();

        return wrapper;
    }
    void wrapperFun() {m_superStar->superFun1();}
private:
    std::unique_ptr<SuperStarClass1> m_superStar;
};

int main(int argc, const char * argv[])
{
    std::unique_ptr<Wrapper> wrapper = std::make_unique<Wrapper>();
    std::unique_ptr<Wrapper> wrapper2 = std::unique_ptr<Wrapper>(wrapper->open());
    wrapper2->wrapperFun();
    //wrapper2->m_superStar->superFun2();
    
    return 0;
}


Wrapper по сути скрывает и не оставляет возможности доступа к функциям оригинальной библиотеки, а такой доступ нужен.

Изначально был сделан форк этого Wrapper, куда я добавил нужные функции.

Однако проблема вот в чем — этот Wrapper часто обновляется, выходят новые версии с исправлениями ошибок. И каждый раз поддерживать форк — накладно.

Как бы сделать, чтобы была обертка над этим Wrapper из нескольких функций, которым требуется доступ к объекту m_superStar? Как это седлать малой кровью?

Тут стоить добавить, что на использовании этого Wrapper категорически настаивает начальник.

Какие есть идеи?

Будет ли хорошей идеей такое решение: https://habr.com/ru/articles/762250/

Как бы сделали вы?
Отредактировано 13.10.2023 6:05 Shmj . Предыдущая версия . Еще …
Отредактировано 13.10.2023 5:55 Shmj . Предыдущая версия .
Re: Дополнить wrapper новыми методами - как бы вы сделали
От: so5team https://stiffstream.com
Дата: 13.10.23 06:52
Оценка: 4 (1)
Здравствуйте, Shmj, Вы писали:

S>Как бы сделать, чтобы была обертка над этим Wrapper из нескольких функций, которым требуется доступ к объекту m_superStar? Как это седлать малой кровью?

S>Какие есть идеи?
S>Как бы сделали вы?

Сделал бы PR для Wrapper-а в котором добавил бы в Wrapper публичный метод для доступа к SuperStarClass1:

class Wrapper
{
public:
    ...
    [[nodiscard]]
    SuperStarClass1 & access_underlying_object() { return *m_superStar; }
private:
    std::unique_ptr<SuperStarClass1> m_superStar;
};


И объяснил в описании к PR (или в обсуждении этого PR) зачем метод access_undelying_object нужен и почему вам нужен доступ к m_superStart.
Лучше всего было бы привести несколько конкретных use-case с примерами кода: мол, сейчас приходится извращаться вот так, а можно было бы обойтись малой кровью.
Re: Дополнить wrapper новыми методами - как бы вы сделали
От: sergii.p  
Дата: 13.10.23 08:52
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Будет ли хорошей идеей такое решение: https://habr.com/ru/articles/762250/


почему бы и нет? В долгосрочной перспективе конечно можно ноги пострелять. Н-р завтра m_superStar захотят прикрыть мьютексом, а ваш Паблик Морозов разумеется про него ничего знать не будет. Но это всё в теории, надо оценивать и взвешивать всё на месте.
Re: Дополнить wrapper новыми методами - как бы вы сделали
От: kov_serg Россия  
Дата: 13.10.23 11:34
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Тут стоить добавить, что на использовании этого Wrapper категорически настаивает начальник.

Так если на это выделены средства, то почему нет?
Re: Дополнить wrapper новыми методами - как бы вы сделали
От: Sm0ke Россия ksi
Дата: 13.10.23 15:12
Оценка:
Здравствуйте, Shmj, Вы писали:

  Скрытый текст
#include <iostream>

class SuperStarClass1
{
public:
    void superFun1() { std::cout << "1 \r\n"; }
    void superFun2() { std::cout << "2 \r\n"; }
};

class Wrapper
{
public:
    Wrapper* open()
    {
        Wrapper* wrapper = new Wrapper();
        wrapper->m_superStar = std::make_unique<SuperStarClass1>();

        return wrapper;
    }
    void wrapperFun() {m_superStar->superFun1();}
private:
    std::unique_ptr<SuperStarClass1> m_superStar;
};

int main(int argc, const char * argv[])
{
    std::unique_ptr<Wrapper> wrapper = std::make_unique<Wrapper>();
    std::unique_ptr<Wrapper> wrapper2 = std::unique_ptr<Wrapper>(wrapper->open());
    wrapper2->wrapperFun();
    //wrapper2->m_superStar->superFun2();
    
    return 0;
}


Если бы m_superStar во враппере был protected, то я бы предложил написать свой враппер, отнаследовав его от их враппера (для добавления туда своих методов).
Добавить в свой враппер перегрузку оператора стрелка для доступа к суперстару.
Методы суперстара будут по стрелке. А методы вашего и их врапперов будут по точке.

Или даже авторам их враппера предложить что-нибудь из:
* идею с оператором стрелка
* и идею с помещением m_superStar из private в protected
Или оба варианта

Это один момент.

--

Второе..
В проге:
int main(int argc, const char * argv[])
{
    std::unique_ptr<Wrapper> wrapper = std::make_unique<Wrapper>();
    std::unique_ptr<Wrapper> wrapper2 = std::unique_ptr<Wrapper>(wrapper->open());

Если этот код переписать так:
int main(int argc, const char * argv[])
{
    Wrapper wrapper;
    std::unique_ptr<Wrapper> wrapper2{ wrapper->open() };

.. то Это будет работать?
Отредактировано 13.10.2023 15:17 Sm0ke . Предыдущая версия . Еще …
Отредактировано 13.10.2023 15:16 Sm0ke . Предыдущая версия .
Отредактировано 13.10.2023 15:15 Sm0ke . Предыдущая версия .
Отредактировано 13.10.2023 15:15 Sm0ke . Предыдущая версия .
Отредактировано 13.10.2023 15:13 Sm0ke . Предыдущая версия .
Re: Дополнить wrapper новыми методами - как бы вы сделали
От: Кодт Россия  
Дата: 14.10.23 13:24
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Есть 2 библиотеки. Одна официальная — 10 тыс. звезд. Вторая — враппер над основным классом этой библиотеки — 100 звезд.


Если эти библиотеки публичные, то просто назови их! И к каким функциям понадобился прямой доступ.
Возможно, мы совместным умом найдём правильный подход, вместо форка с хаком и паблика морозова.

В крайнем случае, есть же такой подход
— делаешь форк
— вносишь как можно меньшие правки — например, делаешь функцию публичного доступа к потрохам (хоть это и грязно)
— а потом ребейзишь / черрипикаешь эти правки на свежую версию основной репы (ну или наоборот, черрипикаешь из основной репы к себе)
один леший, поскольку правка изолированная, то конфликтов почти никогда не будет.

Этот процесс даже автоматизировать можно, в конце концов.

Дальше уже нюансы, как именно организованы репы в вашей компании. Всякие там субрепозитории, прочие радости...
Перекуём баги на фичи!
Re: Дополнить wrapper новыми методами - как бы вы сделали
От: vsb Казахстан  
Дата: 14.10.23 14:20
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Как бы сделали вы?


Ну вообще я бы сделал как считаю нужным. Всякие врапперы я не одобряю, поэтому я бы их не использовал. Если начальник настаивает, то флаг ему в руки, а я на другой проект пойду, или в другую компанию, как говорится, если что-то не нравится, HR-ов за забором очередь стоит.

Но если отвечать на технический вопрос — вытащил бы указатель, не в астрале же он лежит, скорей всего по вполне определённому смещению. Понятно, что решение такое себе, ну как говорится, на такое ТЗ и результат ХЗ. В конкретном билде работать будет, а завтра сами разбирайтесь.
Re[2]: Дополнить wrapper новыми методами - как бы вы сделали
От: Sm0ke Россия ksi
Дата: 16.10.23 21:31
Оценка:
Здравствуйте, vsb, Вы писали:

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


to TS:

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