Russian Qt Forum

Программирование => С/C++ => Тема начата: Fregloin от Май 07, 2015, 14:57



Название: Помогите с умными указателями
Отправлено: Fregloin от Май 07, 2015, 14:57
Привет. Так уж довелось что за время работы с с++ умными указателями практически не пользовался.
А тут решил перевести свой код на их использование. Возникла проблема понимания QSharedPointer и QWeakPointer.

Опишу проблему и надеюсь услышать советы по оптимизации.

Есть несколько базовых объектов-синглтонов, которые предоставляют доступ к некоторым данным. Каждый синглтон отвечает за свои данные. Синглтоны реализованы в разных либах.
Есть так же несколько синглтонов, которые используют базовые синглтоны (назовем их композитные). Так же реализованы в разных либах.

Вот код базового синглтона
base.h
Код:
class   CBaseManager;
typedef QSharedPointer<CBaseManager>   BaseManager;

class RAILCORESHARED_EXPORT CBaseManager : public  CManagerInterface, //наслденик от QObject
                                                        public  CDocumentItemInterface //интерфейс сериализации
{
Q_OBJECT

    static      BaseManager finstance;

protected:
    friend  class   QSharedPointer<СBaseManager>;
    explicit СBaseManager(QObject *parent = 0);
public:

    ~СBaseManager();
    static  BaseManager   instance();

Код:
СBaseManager СBaseManager::instance()
{
    if(finstance.isNull())
       finstance = BaseManager::create();
    return  finstance;
}

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

Вот пример композитного синглтона
Код:
class CTrainManager;
typedef QSharedPointer<CTrainManager>   TrainManager;

class TRAINSSHARED_EXPORT CTrainManager : public CManagerInterface, public CDocumentItemInterface, private CEventDispatcherListener, private CFeatureManagerInterface
{
    Q_OBJECT

    static  TrainManager                    finstance;

BaseManager1                fmanager1; //QSharedPointer<CBaseManager1>
BaseManager2                fmanager2;
..
BaseManagerN                fmanagerN;
}

Такой вопрос, нужно хранить shared_ptr или weak_ptr в композитных синглтонах?
Собственно это делается изза того, что я не знаю как инициализировать синглтон в библиотеке до запуска основного приложения.
Не хочется лепить какие то костыли. К тому же эти синглтоны у меня используются в очень многих местах программы и некоторые связаны между собой.

Или например в каком то объекте (диалоговом окне например) нужно получить досутп к данным определенного синглтона. я копирую shared_ptr. Правильно ли я делаю в данном случае?
Прочитал много статей и инфы, но в целом картина с shared_ptr проясняется, а вот с weak_ptr не очень.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Июль 30, 2015, 11:02
weak_ptr не будет удален пока не будут грохнуты все shared_ptr, которые на него ссылаются. 
Что-то не вижу причин использовать weak_ptr. Не вижу в этом коде циклических ссыллок.

Вообще делать такого дикобраза на синглтонах - то же самое что ходит по минному полю. В свое время на такие яйца нарывался. Больше не хочу. Синглтон - зло.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 01, 2015, 08:11
Не хочется лепить какие то костыли. К тому же эти синглтоны у меня используются в очень многих местах программы и некоторые связаны между собой.

представленный код - один большой костыль.

рецепт сингелтона:

Код:
struct sample
{
    static sample& Get()    { static sample s; return s; }
};

не нужны никакие смартпоинтеры.
сингелтон не убиваем.

если это не так - значит это будет более глючная и сволочная конструкция,
которая провоцирует ошибки и только усложняет жизнь.



Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 01, 2015, 08:12
Синглтон - зло.

много раз слышал.
ни разу не получил ни одного вразумительного ответа на вопрос:
а почему собственно?



Название: Re: Помогите с умными указателями
Отправлено: Igors от Август 01, 2015, 09:19
Синглтон - зло.

много раз слышал.
ни разу не получил ни одного вразумительного ответа на вопрос:
а почему собственно?
Присоединяюсь к вопросу. Не все в синглтоне хорошо, но часто я не нахожу лучшего решения. Ну вот хотя бы
Код
C++ (Qt)
MyMenuManager::Instance()->AddSomething();
Где MyMenuManager - синглтон. (Главное) Меню в приложении одно, а нужно всем, из совершенно разных мест никак не связанных между собой. Почему я должен избегать синглтона, и что вместо него?

Недостатки заметны когда я пытаюсь задействовать MyMenuManager уже в др приложении. Ну да приходится подлатать с #ifdef  :)


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 01, 2015, 15:42
Недостатки заметны когда я пытаюсь задействовать MyMenuManager уже в др приложении. Ну да приходится подлатать с #ifdef  :)

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

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


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 02, 2015, 22:32
Синглтон - зло.

много раз слышал.
ни разу не получил ни одного вразумительного ответа на вопрос:
а почему собственно?


1. Глобальная переменная. Неявная инициализация/деинициализация. Просто говоря может инициализироваться или там или там или там. Особенно весело есть есть зависимости между синглтонами. В простеньких проектах все хорошо. Но вот когда все разрастется, вот там танцы с бубном обеспечены.
2. Две разные респонсибилити: инициализация и контроль. Это уже больше вопрос проектирования. Насколько архитектура вашего приложения хороша.
3. Если вы работали с ТДД, попробуйте создать мок-объект синглтона. Ну-ну. Поделитесь опытом как правильно сделать.

Чем заменить? Фабрикой с явной инициализацией.


Название: Re: Помогите с умными указателями
Отправлено: Fregloin от Август 03, 2015, 10:33
действительно, я пришёл к фабрикам с явной инициализацией. Искал в шаблонах проектированя, но пришёл к фабрикам. По сути есть один синглтон, задача которого создавать глобальные объекты из фабрик, хранить у себя и возвращать их по запросу. При этом у каждого такого глобального объекта есть своя приватная статическая переменная, которая указывает на единстенный экземпляр.
После того как все глобальные объекты созданы, я их инициализирую, т.е. на момент инициализации все необходимые объекты уже есть в наличии.


Название: Re: Помогите с умными указателями
Отправлено: Igors от Август 03, 2015, 15:21
Ну-ну..
Мне доводы не кажутся убедительными, но они звучат столь категорично/безапеляционно, так что лучше не спорить  :), ограничусь одним замечанием ниже

Чем заменить? Фабрикой с явной инициализацией.
действительно, я пришёл к фабрикам с явной инициализацией.
Ой как хорошо чувствовать что, мол, "на правильном пути" :) Только что изменилось если вместо одного "ярлычка" навесили другой? Все равно экземпляр один, все равно все зависимости отслеживать.

Возвращаясь к вопросу "для чего weak_ptr". Хорошая штука, пусть и не так уж часто нужна. Он не "удерживает" указатель (в отличие от shared_ptr), т.е. если кто-то другой его освободил, объект может быть удален. Но "weak" позволяет узнать "жив ли" указатель, это ценная возможность. Как только задействован shared_ptr, "обычный" указатель уже не катит, а копируя shared мы сами "держим" объект, это не всегда то что нужно.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 03, 2015, 15:52
Вы в курсе, что такое ТДД? Работали с множеством синглтонов? Скорее всего нет. Поробатаете на большом проекте с десятком синглтонами, тогда 100% мнение измените.

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


Название: Re: Помогите с умными указателями
Отправлено: Igors от Август 03, 2015, 16:50
Вы в курсе, что такое ТДД? Работали с множеством синглтонов? Скорее всего нет. Поробатаете на большом проекте с десятком синглтонами, тогда 100% мнение измените.

Объект один - то что и нужно. Только без глобальных переменных и прочих прелестей, которые делает синглтон. При этом все очевидно и связаность кода меньша.
Ну у меня десятка 2 точно (может и больше) наберется  :) И, пожалуйста, не надо "играть в учителя", наивно мня что у Вас-то уж точно "опыта побольше" :) Отвечайте по существу, а не так, "на понтах" - здесь это не катит. Напр покажите (на простом примере, псевдокод) Ваш метод/подход. Словом, давайтe "обсуждать", а не "диктовать". Спасибо за понимание.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 04, 2015, 10:30
Пожалуйста. Самый примитивный пример.
Код:
class UpdateDownloadManager
{
  static UpdateDownloadManager* pInstance;
public:
  static instance();
  void apply(const std::string& url);
private:
  UpdateDownloadManager();
  Items compareWithLocal();
  void saveNewState(const Items& items);
}

class Storage
{
   static Storage* pInstance;
  public:
    static instance();
    Storage(const std::string& path);
    void save(const Items& items);
    Items load();
}


И так формально оба класса должны быть синглтонами.
Следуя вашей логики, реализация должна быть такая.
Код:
void UpdateDownloadManager::apply(const std::string& url)
{
  Items dwlItems = Download(url);
  StoragePtr pStorage = Storage::instance();
  Items localItems = pStorage->getLocal();
  Items diff = compareWithLocal(localItems , dwlItems);
  doUpdate(diff);
  saveNewState(diff);
}

void UpdateDownloadManager::saveNewState(const Items& items)
{
  StoragePtr pStorage = Storage::instance();
  pStorage->save(items);
}
Все хорошо. А теперь напишите юниттесты дла этого дела, чтобы протестить весь код. Я не вижу такой возможности.

Теперь немного переиначим.
Код:
class UpdateDownloadManager
{
public:
  UpdateDownloadManager(const std::string& url, IStoragePtr pStorage);
  void apply();
private:
  UpdateDownloadManager();
  Items compareWithLocal();
  void saveNewState(const Items& items);
private:
  IStoragePtr pStorage;
}

class Storage : public IStorage
{
  public:
    Storage(const std::string& path);
    virtual void save(const Items& items);
    virtual Items load();
}
И реализация:
Код:
void UpdateDownloadManager::apply(const std::string& url)
{
  Items dwlItems = Download(url);
  Items localItems = pStorage->getLocal();
  Items diff = compareWithLocal(localItems , dwlItems);
  doUpdate(diff);
  saveNewState(diff);
}

void UpdateDownloadManager::saveNewState(const Items& items)
{
  pStorage->save(items);
}

Ну и пишем фабрику. Думаю все догадаются как это делать.
В результате. Манагеру подсовываем легко фейковый сторедж и тестим себе все что угодно. Никаких глобальных состояний. Инициализацией занимается фабрика. Все чудненько.



Название: Re: Помогите с умными указателями
Отправлено: Igors от Август 05, 2015, 09:30
Все хорошо. А теперь напишите юниттесты дла этого дела, чтобы протестить весь код. Я не вижу такой возможности.
Насколько я понял, это главный, он же единственный и убийственный аргумент. Но скажите, почему я должен писать какие-то тесты? Наверное у Вас на работе такой порядок, ну раз надо так надо. Но у меня такого нет, почему Вы решили что эти правила должны неуклонно соблюдаться всеми?  :)

Не так уж давно был подобный случай: "так нельзя потому что... нарушается БИНАРНАЯ СОВМЕСТИМОСТЬ!". Тоже придумали "священную корову". Не спорю, и TDD и "совместимость" смысл имеют, может в Ваших проектах они даже необходимы, не мне судить. Но требовать от всех делать то же самое - это, мягко говоря, чересчур


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 05, 2015, 10:24
Чтобы продемострировать всякие лажи которые бывают из-за инициализаций, придется много выложить кода. В даном случае может сыграть даже порядок линковки и пр. прелести. Вариантов очень много.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 06, 2015, 01:42
1. Глобальная переменная. Неявная инициализация/деинициализация. Просто говоря может инициализироваться или там или там или там. Особенно весело есть есть зависимости между синглтонами. В простеньких проектах все хорошо. Но вот когда все разрастется, вот там танцы с бубном обеспечены.
2. Две разные респонсибилити: инициализация и контроль. Это уже больше вопрос проектирования. Насколько архитектура вашего приложения хороша.
3. Если вы работали с ТДД, попробуйте создать мок-объект синглтона. Ну-ну. Поделитесь опытом как правильно сделать.

Чем заменить? Фабрикой с явной инициализацией.

1.
ну так в этом и есть цемес: глобальная точка доступа.

по поводу "неявной инициализации" не понятно.
что значит неявно?

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

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

в чем проблема то?

я работал над весьма крупными проектами,
где использовались в том числе созависимые сингелтоны.
и никаких танцев с бубнами.
это - автоматика, которая способна заботиться о себе самостоятельное (ну, почти).

2.
не понятно, что значит "респонсибилити" ?
тезис вообще не понятен.

3.
я работаю по методике ТДД, и ни разу не возникла потребность его мокать.
однако, если бы потребовалось - не вижу в этом никаких выполнить статическую подмену:

Код:
singelton<system>

на

Код:
singelton<face_system>

я предлагаю вам не делать голословных утверждений в духе "а вы попробуйте, ну-ну".
вместо этого: проиллюстрируйте проблему.





Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 06, 2015, 01:55
Вы в курсе, что такое ТДД? Работали с множеством синглтонов? Скорее всего нет. Поробатаете на большом проекте с десятком синглтонами, тогда 100% мнение измените.
да, в курсе. и да, я работаю по методике ТДД.
проблем от сингелтонов не наблюдал вообще никаких.

(на самом деле наблюдал, но то был мелкий "деццкий" проект,
и сингелтоны там были "деццкими" с ручным приводом.
приходилось вручную следить за ними: за порядком инициализации и деинициализации.
при деинициализации проект то и дело крякал.
я предложил человеку уйти с "ручного привода" на "автомат".
человек ответил: я хочу сам все контролировать.
контролируй - ответил я ему.
через два месяца человек снова ко мне обратился,
и попросил научить как делать "автомат".
в общем он задолбался вручную их пасти)

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

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

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

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



Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 06, 2015, 02:00
Пожалуйста. Самый примитивный пример.
Код:
class UpdateDownloadManager
{
  static UpdateDownloadManager* pInstance;
public:
  static instance();
  void apply(const std::string& url);
private:
  UpdateDownloadManager();
  Items compareWithLocal();
  void saveNewState(const Items& items);
}

вот это мне больше нравится.

итак, начнем.

покажите дизайн использования.
напишите тесты, конкретно для вот этого вот класса.
смысл тестов - они должны проиллюстрировать как использовать данный класс в работе.

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

проиллюстрируйте использование.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 07, 2015, 10:46
проблем от сингелтонов не наблюдал вообще никаких.
Значит мало еще работаете. На моей практики 80% за последние 10 лет, синглотоны были вообще запрещены.

(на самом деле наблюдал, но то был мелкий "деццкий" проект,
и сингелтоны там были "деццкими" с ручным приводом.
приходилось вручную следить за ними: за порядком инициализации и деинициализации.
при деинициализации проект то и дело крякал.
я предложил человеку уйти с "ручного привода" на "автомат".
человек ответил: я хочу сам все контролировать.
контролируй - ответил я ему.
через два месяца человек снова ко мне обратился,
и попросил научить как делать "автомат".
в общем он задолбался вручную их пасти)
Вот и пример. На "автомате" еще веселее бывает. И тогда вот поиск багов веселье. Если не проходили это, то еще ждет. Опыт такая штука класная :)

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

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

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


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 07, 2015, 10:47
Пожалуйста. Самый примитивный пример.
Код:
class UpdateDownloadManager
{
  static UpdateDownloadManager* pInstance;
public:
  static instance();
  void apply(const std::string& url);
private:
  UpdateDownloadManager();
  Items compareWithLocal();
  void saveNewState(const Items& items);
}

вот это мне больше нравится.

итак, начнем.

покажите дизайн использования.
напишите тесты, конкретно для вот этого вот класса.
смысл тестов - они должны проиллюстрировать как использовать данный класс в работе.

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

проиллюстрируйте использование.
Вот Вы напишите. Я не умаею, так чтоб не получилось через одно место.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 07, 2015, 23:06
Значит мало еще работаете. На моей практики 80% за последние 10 лет, синглотоны были вообще запрещены.

мне не интересны голословные утверждения.

мне интересны конкретные ответы на конкретные вопросы.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 07, 2015, 23:08
Вот Вы напишите. Я не умаею, так чтоб не получилось через одно место.

это ваш класс.
вы не в состоянии привести пример-иллюстрацию использования?

ваше "я не умею" создает не очень хорошее о вас впечатление.

полагаю, от вас я так и дождусь вразумительного ответа на свой вопрос.




Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 10, 2015, 11:06
Вот Вы напишите. Я не умаею, так чтоб не получилось через одно место.

это ваш класс.
вы не в состоянии привести пример-иллюстрацию использования?

ваше "я не умею" создает не очень хорошее о вас впечатление.

полагаю, от вас я так и дождусь вразумительного ответа на свой вопрос.
Очень просто.
Чуть ниже написан код. Вот и напишите следующие тест кейсы.
1. Несуществующий файл. Сторедж бросает ексцепшин.
2. Сторедж недоступен. Сторедж бросает ексцепшин.
3. Сторедж вернул пустыйе данные. Ошибка стореджа, но менеджер не должен загрунтся.
4. Загрузка кривых данных в сторедж. Сторедж на такое бросит ексцепшин.
Суть такая. Что надо создать фейковы


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 10, 2015, 11:10
Вот Вы напишите. Я не умаею, так чтоб не получилось через одно место.

это ваш класс.
вы не в состоянии привести пример-иллюстрацию использования?

ваше "я не умею" создает не очень хорошее о вас впечатление.

полагаю, от вас я так и дождусь вразумительного ответа на свой вопрос.
Очень просто.
Чуть ниже написан код. Вот и напишите следующие тест кейсы.
1. Поличить несуществующе даные. Сторедж бросает ексцепшин.
2. Сторедж недоступен. Сторедж бросает ексцепшин.
3. Сторедж вернул пустыйе данные. Ошибка стореджа, но менеджер не должен загрунтся.
4. Загрузка кривых данных в сторедж. Сторедж на такое бросит ексцепшин.
Суть такая. Что надо создать фейковый сторедж, с помощью которого будут моделироватся эти ситуации.
Если брать реальность, то сторедж это удаленный https сервер, который поднять локально не возможно. На случай если скажете что проще поднять локально. - Локально не получится.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 13, 2015, 00:30
Очень просто.
Чуть ниже написан код.

ниже нет никакого кода.
вы какой то бестолковый.

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


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 13, 2015, 12:57
Очень просто.
Чуть ниже написан код.

ниже нет никакого кода.
вы какой то бестолковый.

я рассчитывал на интересную дискуссию.
а у нас тут оказывается проблема:
автор кода не в состоянии проиллюстрировать использование собственного класса.
http://www.prog.org.ru/index.php?topic=28871.msg213629#msg213629


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 13, 2015, 23:46
http://www.prog.org.ru/index.php?topic=28871.msg213629#msg213629

вы вообще понимаете, что такое "пример использования" ?

что делает этот класс?
зачем вообще нужен?
где описания методов?

где функция main с демонстрацией использования механизма?

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

это - очень тупо с вашей стороны.

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

если человек не в состоянии проиллюстрировать идею,
и принцип использования своего класса,
то с ним просто не о чем  разговаривать.







Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 14, 2015, 10:29
Вы отличаете разницу между юнит тестированием и функциональным тестирование. Представьте себе что вы не в курсе что этот код делает. Просто тужно убедится что этот код рабатоет правильно. Что-то скачивает и что-то сохраняет куда-то. Представьте себе что скачивает он какие-то строки, а сохраняет скажем куда-то на другой сайт. Суть такова, что в тестах сторедж надо подменить. Все поняли?

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


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 22, 2015, 01:18
Вы отличаете разницу между юнит тестированием и функциональным тестирование.

да.

Представьте себе что вы не в курсе что этот код делает. Просто тужно убедится что этот код рабатоет правильно. Что-то скачивает и что-то сохраняет куда-то. Представьте себе что скачивает он какие-то строки, а сохраняет скажем куда-то на другой сайт.

бред.

программист всегда в курсе, что делает код,
который он пишет, или использует.

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

если программист написал:
Код:
foo(params);

значит он в курсе, что делает функция foo,
что обозначают её аргументы,
и что он хочет получить в результате.


я предложил вам продемонстрировать
простейшие тесты для класса UpdateDownloadManager.
смысл которых - проиллюстрировать дизайн использования.

ничего особенного.
просто покажите на примерах,
как используется ваш класс.


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

вы не в состоянии ответить на простейшие вопросы.



Суть такова, что в тестах сторедж надо подменить. Все поняли?

пока вы не предоставили информацию:
зачем вообще нужен класс UpdateDownloadManager,
и как его следует использовать,
нет никакого смысла рассматривать детали его реализации,
и нет никакого смысла рассматривать
его возможное взаимодействие с другими классами.

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

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

я могу упростить вам задачу: пусть это будет не сингелтон.
перепишите класс UpdateDownloadManager так,
что бы это был самый обычный класс.

и покажите тестами дизайн использования.

при этом, меня не интересуют детали его реализации.
нужно только две вещи: зачем он нужен, и как им пользоваться.

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




Как коговорят "слив засчитан".
деццкий сад.


Название: Re: Помогите с умными указателями
Отправлено: Igors от Август 22, 2015, 12:57
_Bers, Вы напрасно теряете время и слова. Для нормального обсуждения нужно нормальное взаимопонимание, а здесь его нет и следа
Вы в курсе, что такое ТДД? Работали с множеством синглтонов? Скорее всего нет. Поробатаете на большом проекте с десятком синглтонами, тогда 100% мнение измените.
Значит мало еще работаете. На моей практики ...
Если работали с какой либо иплементации osgi, так там ..
Понты-понты :) Кстати создал тему TDD - там тоже ничего вразумительного не услышал, у людей применять все это особого желания нет.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 22, 2015, 13:46
Кстати создал тему TDD - там тоже ничего вразумительного не услышал, у людей применять все это особого желания нет.

что-то как-то не видно вашей темы.
не понятно, чего именно нет желания применять: технику TDD ?

просто я вот например, использую при любой возможности.
и без горячо любимого gmock чувствую себя уже не комфортно.
к хорошему быстро привыкаешь.


Название: Re: Помогите с умными указателями
Отправлено: Igors от Август 22, 2015, 14:18
что-то как-то не видно вашей темы.
Так вот же (http://www.prog.org.ru/index.php?topic=29149.msg213684#msg213684). И еще там пара моих тем - тоже хороших  :)

и без горячо любимого gmock чувствую себя уже не комфортно.
к хорошему быстро привыкаешь.
Никогда не слыхал о таком. Расскажите что же там такого хорошего  ???


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 22, 2015, 15:29
Так вот же (http://www.prog.org.ru/index.php?topic=29149.msg213684#msg213684). И еще там пара моих тем - тоже хороших  :)

почитал.
действительно, как то не вразумительно.

Цитировать
Никогда не слыхал о таком. Расскажите что же там такого хорошего  ???

gmock - кроссплатформенный инструмент для нужд тестирования от коорпорации google.

включает в себя gtest: для проведения юнит-тестов.

и собственно gmock: тестирование взаимодействия компонентов,
и их поведенческих особенностей.

https://code.google.com/p/googlemock/

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

это при том, что среди подобных инструментов,
gmock один из немногих, кто обладает столь широким набором
функциональных возможностей.



Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 26, 2015, 12:35
Вы отличаете разницу между юнит тестированием и функциональным тестирование.

да.
Cудя по на писаному вами ниже - вообще не видите разницы.

Представьте себе что вы не в курсе что этот код делает. Просто тужно убедится что этот код рабатоет правильно. Что-то скачивает и что-то сохраняет куда-то. Представьте себе что скачивает он какие-то строки, а сохраняет скажем куда-то на другой сайт.

бред.

программист всегда в курсе, что делает код,
который он пишет, или использует.

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

если программист написал:
Код:
foo(params);

значит он в курсе, что делает функция foo,
что обозначают её аргументы,
и что он хочет получить в результате.
Скажите пожалуйста, вы в курсе что такое легаси код? Если в курсе, то работали?
Вот представьте себе есть проект миллионы строк кода. Ни они программист не в курсе что он делает. Авторы которые писали либо уже давно менеджеры и давно забыли что писали, либо уволились. И тут опс, надо новую фичу добавить или баг пофиксить. Но для начала воспроизвести. Вот задача.
Да, я стыкался с такими тасками. При этом некоторые переменные названы то ли на голландском то ли на фламандском.
Реально такое у меня было.


я предложил вам продемонстрировать
простейшие тесты для класса UpdateDownloadManager.
смысл которых - проиллюстрировать дизайн использования.

ничего особенного.
просто покажите на примерах,
как используется ваш класс.


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

вы не в состоянии ответить на простейшие вопросы.

Пишу простейший кейс.
Код:
void MyTestClass::TestDwlMgrAppy()
{

}
На входе принимается линк на локальный сервак, который грузит xml-ну, парсит ее и сохраняет в сторедж. Как я уже писал, реального стореджа у вас нет. Да и не нужно. Скажем, дорого. По сколько xmlна локальная, структура вам известна. Вопрос состоит в том, что сторедж надо мокнуть. Результат будет приемлемым если данные, которые попали в сторедж будут соответствовать тем которые в xml. Это и сеть результат функции apply. Протестировать надо исключительно бизнес-логику. Структуру данных можете придумать сами. Это не важно.
Что еще не ясно?

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

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

я могу упростить вам задачу: пусть это будет не сингелтон.
перепишите класс UpdateDownloadManager так,
что бы это был самый обычный класс.

и покажите тестами дизайн использования.

Пример использования.
Код:
UpdateDownloadManager mgr; // в случае с синглтоном. 
mgr.apply("http://localhost:9821/config.xml");

при этом, меня не интересуют детали его реализации.
нужно только две вещи: зачем он нужен, и как им пользоваться.
Я привел достаточно кода. Вам нужно только apply. И оно есть. Остальное можете оставить пустым. Или на ваше усмотрение.




Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 26, 2015, 22:09
Скажите пожалуйста, вы в курсе что такое легаси код? Если в курсе, то работали?

да. и это не имеет никакого отношения к тому,
что мы сейчас с вами обсуждаем.

а обсуждаем мы предложенный вами класс.

для которого вы оказались не в состоянии написать кейсы.

Пишу простейший кейс.
Код:
void MyTestClass::TestDwlMgrAppy()
{

}
это у вас такой кейс?
пустой ничего не делающий и ничего не иллюстрирующий тест?


На входе принимается линк на локальный сервак, который грузит xml-ну, парсит ее и сохраняет в сторедж. Как я уже писал, реального стореджа у вас нет. Да и не нужно. Скажем, дорого. По сколько xmlна локальная, структура вам известна. Вопрос состоит в том, что сторедж надо мокнуть. Результат будет приемлемым если данные, которые попали в сторедж будут соответствовать тем которые в xml. Это и сеть результат функции apply. Протестировать надо исключительно бизнес-логику. Структуру данных можете придумать сами. Это не важно.
Что еще не ясно?

теперь продемонстрируйте сказанное вами сейчас в виде кода.
напишите тесты.

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

не понятно, зачем вообще может понадобиться грузить xml,
если к ней нельзя получить доступ.

проиллюстрируйте работу своего класса.

Пример использования.
Код:
UpdateDownloadManager mgr; // в случае с синглтоном. 
mgr.apply("http://localhost:9821/config.xml");

вот это уже чем то отдаленно начинает напоминать нужное от вас.

теперь оформите это в виде теста, который иллюстрирует кейс.

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

Я привел достаточно кода. Вам нужно только apply. И оно есть. Остальное можете оставить пустым. Или на ваше усмотрение.

нет, не достаточно.

не понятно, зачем был нужен вызов apply,
что она делает, и зачем вообще понадобился целый класс для того,
что бы прогрузить xml.
так же, не понятно, накой болт нужен этот config.xml.
что с ним делать дальше?

у меня такое впечатление, что вы реально просто не осознаете,
как на самом деле пишутся тесты.

вот вам простейший пример:

Код:
TEST(tools, xml)
{
    // --- заполняем файл какими то данными
    // фактическое содержимое сейчас не важно
    const XML src = GenerateTestData("config.xml");

    // --- заливаем на локалхост
    // если все в порядке, вернется true
    const auto success = PostData("http://localhost:9821", src)
    ASSERT_EQ(true, success);    

    // --- теперь выкачиваем файлик обратно
    // в случае ошибки будет выброшено исключение

    try{

        const XML dst = DownLoad("http://localhost:9821/config.xml");

        // --- убедимся, что отправленные данные
        // и полученные совпадают
        EXPECT_EQ(src, dst);    
   }
   catch(const std::exception& e)
   {
        ::testing::AssertionFailure() << e.what();
   }
}

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

сразу должно быть понятно,
что за механизм, как с ним работать, и как получать профит.

однозначно ваша проблема не с сингелтонами.
вы похоже просто не осознаете,
что такое "дизайн использования".


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 27, 2015, 10:53
Еще раз смотрим код функции apply (случай с синглтоном):
Код:
void UpdateDownloadManager::apply(const std::string& url)
{
  Items dwlItems = Download(url);
  StoragePtr pStorage = Storage::instance();
  Items localItems = pStorage->getLocal();
  Items diff = compareWithLocal(localItems , dwlItems);
  doUpdate(diff);
  pStorage->addNewItems(diff);
}
Эта функция должна загрузить, распарсить и положить в сторедж некие данные.
В результате я хотел видет что-то такое.

Код:
void MyTestClass::TestDwlMgrAppy()
{
  DownladManager mgr;
  mgr.apply(url);

 // Проверить каким то хреном что пошло в сторедж.
}

Теперь рассматриваю случай нормального проектирования.
Код:
UpdateDownloadManager::UpdateDownloadManager(IStoragePtr pStorage) : _pStorage(pStorage)
{}

void UpdateDownloadManager::apply(const std::string& url)
{
  Items dwlItems = Download(url);
  Items localItems = pStorage->getLocal();
  Items diff = compareWithLocal(localItems , dwlItems);
  doUpdate(diff);
  pStorage->addNewItems(diff);
}

И пишем тестик.
Код:
class StorageMock : public IStorage
{
public:
// Методы означенные ключевым словом virtual объявлены в интерфейсе. Остальные только в моке.
  virtual Items getLocal() override { return _someItems; }
  virtual void addNewItems(Items items) override  { _newItems = items;   }

  Items getNewItems() { return  _newItems; }

private:
  Items _newItems;
};

void MyTestClass::TestDwlMgrAppy()
{
  StorageMock pStorage = std::make_shared<StorageMock>();
  DownladManager mgr(pStorage);
  mgr.apply(url);

  Items newItems = pStorage->getNewItems();
  ASSERT_CHECK(newItems == expectedItems);
}

Вот оно что нужно было. Чтобы не было тролинга, сразу уточню getNewItems() в продакшин-класе не представляется возможен. К тому же 10 раз было проигнорирован тот факт, что физически сторедж недоступен.

Так что учитесь писать правильно код без костылей.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 30, 2015, 14:36
Так что учитесь писать правильно код без костылей.

с моей точки зрения: инъекции зависимостей и есть костыль.
последствие унылого дизайна.

смотрите какой дизайн у вас в итоге получился:

Код:
  StorageMock pStorage = std::make_shared<StorageMock>();
  DownladManager mgr(pStorage);
  mgr.apply(url);

  Items newItems = pStorage->getNewItems();
  ASSERT_CHECK(newItems == expectedItems);

и чем это отличается от простейшего:

Код:
  Items newItems =  DownladManager::apply(url);
  ASSERT_CHECK(newItems == expectedItems);

ну и нафига здесь вообще нужен какой то сингелтон, и какой то сторедж?

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



Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Август 31, 2015, 17:16
Так что учитесь писать правильно код без костылей.

с моей точки зрения: инъекции зависимостей и есть костыль.
последствие унылого дизайна.
11й раз повторяю: ФИЗИЧЕСКИ стореджа НЕТ (или занят).  Как предлагаете этот вопрос обойти с помощью синглтона?
 

и чем это отличается от простейшего:
Код:
  Items newItems =  DownladManager::apply(url);
  ASSERT_CHECK(newItems == expectedItems);

ну и нафига здесь вообще нужен какой то сингелтон, и какой то сторедж?

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

и чем это отличается от простейшего:
ну и нафига здесь вообще нужен какой то сингелтон, и какой то сторедж?
Нужен. См. что я повторил 11й раз. Второе - у стореджа свой респонсибилити. Он занимается исключительно операциями ввода-вывода. В нашем случаем только сохранением. Вопрос отдельного класса не обсуждается в принципе. Он может быть реализован или через интерфейс или через синглтон. Точно так же использовать его должен DownloadManager. Считайте что это некое ограничение. Скажем заказчик так захотел.

сначала вы делаете простые вещи сложными.
а потом изобретаете костыли и пишите моки,
что бы хоть как то это контролировать.
Этот вопрос не обсуждается. Это вам кажется сложно. В действительности при достаточных знаний ООД и ТДД, это тривиальная задача. которая в данном случае решена правильно. Вообще то там все намного сложнее. Там есть свой даулоадер, который иплементирован точно так же. И апдейтер. Все оттестировано и все работает. В теории все эти сущности и есть синглтоны в контексте приложения. Но сделаны как обычные классы для минимизации зависимостей. Но я вопрос сильно упростил чтобы показать суть проблемы. Другой вопрос что вы пытаетесь откатится эдтак к 2005му году, когда синглтоны шли по полной, а большинство джуниоров и от некоторый процент мидлов, еще замечали проблем мультипоточности, связанности кода и прочие прелести. В то время как сеньоры с тимлидами уже матом ругались на это дело.


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 31, 2015, 20:12
11й раз повторяю: ФИЗИЧЕСКИ стореджа НЕТ (или занят).  Как предлагаете этот вопрос обойти с помощью синглтона?

что значит "физически нет" ?
нахер он тогда нужен?

ваш собственный кейс:

Код:
  StorageMock pStorage = std::make_shared<StorageMock>();
  DownladManager mgr(pStorage);
  mgr.apply(url);

  Items newItems = pStorage->getNewItems();
  ASSERT_CHECK(newItems == expectedItems);

предполагает, что очень даже доступен.

можно периписать этот говнокод так:

Код:
  DownladManager mgr;
  mgr.apply(url);

  const auto& newItems = mgr.getNewItems();
  ASSERT_CHECK(newItems == expectedItems);

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

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


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 31, 2015, 20:16
Получается что мы наружу показываем те данные, которые туда не должны идти. Вполне возможно что айтемы могут бить дурных размеров. В итоге получается что вылазит лишнее копирование. Зачем такой изврат?

если они не нужны снаружи, тогда нахер они тогда вообще нужны?
какой профит должен получить пользователь?

вы вообще понимаете,что делаете?

касательно "тяжести структуры".
её в любом случае необходимо создать.

можете вернуть наружу по значению и забыть (грамотно)
можете сформировать внутри, а наружу выдать ссылку (опционально).




Название: Re: Помогите с умными указателями
Отправлено: _Bers от Август 31, 2015, 20:20
Этот вопрос не обсуждается. Это вам кажется сложно. В действительности при достаточных знаний ООД и ТДД, это тривиальная задача.

учитывая, что вы не смогли сформулировать ни задачу,
ни проиилюстрировать дизайн вашего механизма,
который её решает - это как то беспонтово звучит.

я понял, что бы ни бум бум TDD


Название: Re: Помогите с умными указателями
Отправлено: KrupaKarlo от Сентябрь 01, 2015, 11:58
1. Bers просил ему рассказать про smart pointers.
2. Он попытался привести пример что он имеет ввиду.

Спрашивается: нахрена ему тут толковать про TDD про легаси код? Ему оно не нужно. Откуда это желание учить других?  ???
Ответа Bers явно показывают что он не понимает что вы ему говорите. Че биться головой об стену?


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 01, 2015, 12:24
11й раз повторяю: ФИЗИЧЕСКИ стореджа НЕТ (или занят).  Как предлагаете этот вопрос обойти с помощью синглтона?

что значит "физически нет" ?
нахер он тогда нужен?
Объясняю 12й раз. Внешнее устройство, которое втыкается в ЮСБ. На весь тим одно. Стоит несколько килобаксов. Заказчик не успел еще сделать устройство. Да и до того времени как оно будет нужно, еще пол года жать. Что будем делать?
ваш собственный кейс:

Код:
  StorageMock pStorage = std::make_shared<StorageMock>();
  DownladManager mgr(pStorage);
  mgr.apply(url);

  Items newItems = pStorage->getNewItems();
  ASSERT_CHECK(newItems == expectedItems);

предполагает, что очень даже доступен.
Не предполагает. Прочитайте что такой Mock, Fake, Stub в контексте юнит-тестирования.

можно периписать этот говнокод так:

Код:
  DownladManager mgr;
  mgr.apply(url);

  const auto& newItems = mgr.getNewItems();
  ASSERT_CHECK(newItems == expectedItems);

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

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

Не можно переписать. Тогда придется ждать когда появится физический девайс. А работать надо уже. Если вы не бывали в такой ситуации, значит или пока что ваш уровень джуниор и не выше.
Предназначение стореджа - хранение шифрованных данных. Просто говоря положил что-то и тебя не волнует что оно делает с ним. Пользователь знает что их никто не украдет. Вообще слишком много вопросов. Задача предельно просто, но у вас все не так. Если в все так, то надо уже задуматься.
Проблему в данном случае я описал и сказал, что на синглтонах ее решить невозможно в принципе. Вы пытаетесь как-то выкрутится. Но получается какая-то лажа. В прочем я подобное предполагал. Не думал что все настолько запущено. Проблема в том что синглтон Mock'ать никак не получится. Еще не дошло?


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 01, 2015, 12:32
Получается что мы наружу показываем те данные, которые туда не должны идти. Вполне возможно что айтемы могут бить дурных размеров. В итоге получается что вылазит лишнее копирование. Зачем такой изврат?

если они не нужны снаружи, тогда нахер они тогда вообще нужны?
какой профит должен получить пользователь?
Такое требование кастомера. Еще вопросы будут?

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

касательно "тяжести структуры".
её в любом случае необходимо создать.

можете вернуть наружу по значению и забыть (грамотно)
можете сформировать внутри, а наружу выдать ссылку (опционально).
Скажем так. Передать по ссылке не получится. Если через указатель, то получаем снова никому ненужное копирование. Так как надо выделить блок и скопировать туда данные. Через одно место. Все это в архитектуре все это было учтено.

Если так подходить как предлагаете, то мы возвратимся к процедурному программированию времен Паскаля. Даже не С.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 01, 2015, 12:40
Этот вопрос не обсуждается. Это вам кажется сложно. В действительности при достаточных знаний ООД и ТДД, это тривиальная задача.

учитывая, что вы не смогли сформулировать ни задачу,
ни проиилюстрировать дизайн вашего механизма,
который её решает - это как то беспонтово звучит.

я понял, что бы ни бум бум TDD
Научитесь читать. Я даже привел кусок кода и юниттест, рассписал что на входе и что надо проверить. Понятное дело что решить такую задачу через синглтоны не возможно. К тому же не решает вопрос связности кода и непрозрачности связей. Я уже не буду говорить о каких более сложных вещах, как, например связанность тестов. Может уже пора признать что сделать Mock для синглтона невозможно?


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 01, 2015, 12:44
1. Bers просил ему рассказать про smart pointers.
2. Он попытался привести пример что он имеет ввиду.

Спрашивается: нахрена ему тут толковать про TDD про легаси код? Ему оно не нужно. Откуда это желание учить других?  ???
Ответа Bers явно показывают что он не понимает что вы ему говорите. Че биться головой об стену?

Сначала почитайте о чего весь этот сыр-бор начался. Вопрос состоит в том, что Bers бьется о стену что код с синглтоном легко поддается юниттестированию. Вот только беда - кода надо "немножко" переколбасить. То архитектура плохая, то задача плохая, то еще что-то плохое. И так далее. При тому уже устал писать что это физически не получится.


Название: Re: Помогите с умными указателями
Отправлено: KrupaKarlo от Сентябрь 01, 2015, 15:21
Цитата из самого первого поста
Привет. Так уж довелось что за время работы с с++ умными указателями практически не пользовался.
А тут решил перевести свой код на их использование. Возникла проблема понимания QSharedPointer и QWeakPointer.

Опишу проблему и надеюсь услышать советы по оптимизации.

Где здесь слова про TDD и тд и тп


Название: Re: Помогите с умными указателями
Отправлено: KrupaKarlo от Сентябрь 01, 2015, 15:23
Прошу прощения, но вы всю тему тупо оффтопите.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 01, 2015, 16:36
Цитата из самого первого поста
Привет. Так уж довелось что за время работы с с++ умными указателями практически не пользовался.
А тут решил перевести свой код на их использование. Возникла проблема понимания QSharedPointer и QWeakPointer.

Опишу проблему и надеюсь услышать советы по оптимизации.

Где здесь слова про TDD и тд и тп
http://www.prog.org.ru/index.php?topic=28871.msg213488#msg213488
И мое следующее сообщение.


Название: Re: Помогите с умными указателями
Отправлено: KrupaKarlo от Сентябрь 02, 2015, 15:24
я спрашиваю где TDD в теме сообщения. То что вы ходите поговорить про TDD и то что вы понимаете что это такое мы поняли из 4 страниц флуда.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 02, 2015, 16:12
я спрашиваю где TDD в теме сообщения. То что вы ходите поговорить про TDD и то что вы понимаете что это такое мы поняли из 4 страниц флуда.
Чукча не читатель, чукча писатель: http://www.prog.org.ru/index.php?topic=28871.msg213580#msg213580


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Сентябрь 03, 2015, 21:19
Такое требование кастомера. Еще вопросы будут?

вопрос на самом деле только один: что это за хрень, и как с нею работать?

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

закономерный вопрос: нахрена вам вообще нужен такой механизм?

каким образом и какие ваши потребности такой механизм может удовлетворить?

у вас сложность тупо в том, что вы не в состоянии объяснить дизайн использования.



Название: Re: Помогите с умными указателями
Отправлено: _Bers от Сентябрь 03, 2015, 21:23
Скажем так. Передать по ссылке не получится. Если через указатель, то получаем снова никому ненужное копирование. Так как надо выделить блок и скопировать туда данные. Через одно место. Все это в архитектуре все это было учтено.

ваш собственный тест, который вы итоге родили с таким трудном опровергает это утверждение.

Если так подходить как предлагаете, то мы возвратимся к процедурному программированию времен Паскаля. Даже не С.

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


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 04, 2015, 10:24
Такое требование кастомера. Еще вопросы будут?

вопрос на самом деле только один: что это за хрень, и как с нею работать?

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

закономерный вопрос: нахрена вам вообще нужен такой механизм?

каким образом и какие ваши потребности такой механизм может удовлетворить?

у вас сложность тупо в том, что вы не в состоянии объяснить дизайн использования.


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

Или mock для синглтона, или ффсад. Все.


Название: Re: Помогите с умными указателями
Отправлено: Igors от Сентябрь 04, 2015, 10:37
..11й раз повторяю: ...
...Объясняю 12й раз. ..
...Если вы не бывали в такой ситуации, значит или пока что ваш уровень джуниор и не выше.
...
Поймите что с таким подходом "залупистого сеньора" Вам доказать ничего не удастся (даже если предположить что объективно Вы 1000% правы)

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

Но это лишь мои догадки, а разговаривать "на понтах" желания у меня никакого, больше встревать не буду  :)


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 04, 2015, 11:22
..11й раз повторяю: ...
...Объясняю 12й раз. ..
...Если вы не бывали в такой ситуации, значит или пока что ваш уровень джуниор и не выше.
...
Поймите что с таким подходом "залупистого сеньора" Вам доказать ничего не удастся (даже если предположить что объективно Вы 1000% правы)
Если кое-кто читать так и не научился, то как еще сказать? На истину последней инстанции не претендую.

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

Но это лишь мои догадки, а разговаривать "на понтах" желания у меня никакого, больше встревать не буду  :)
Задание очень просто. Есть кое-какая какая реализация. Там есть серьезные ограничение. Всем понятно, что если этот жирный объект сделать синглтоном, то без придется каждого програмера обеспечивать физическим устройством. Вариант решения: мок. Вот и предлагается написать мокс для тестирования. _Bers предалагает полностью переколбасить архитектуру. При этом заиметь потенциальные проблемы, которые порождает синглтон. И всо потому что у него никогда не было проблем с синглтонами. А у меня были. И что? Может уже пора в конце концов сказать, что не получится такое и прекратить рассказывать что архитектура плохая и заказчик дурак?


Название: Re: Помогите с умными указателями
Отправлено: _Bers от Сентябрь 04, 2015, 19:56
Начну с того что если вы думаете что заказчик глупый, то вы дурак в квадрате.

на моей памяти даже самый наивный заказчик был в состоянии объяснить, чего он собственно хочет.
в отличие от вас.


Название: Re: Помогите с умными указателями
Отправлено: Tuxford от Сентябрь 07, 2015, 11:25
Начну с того что если вы думаете что заказчик глупый, то вы дурак в квадрате.

на моей памяти даже самый наивный заказчик был в состоянии объяснить, чего он собственно хочет.
в отличие от вас.

Заказчику во многих случаях больше не надо. Он платит деньги, и за эти ему нужен продукт, а не то что какой то программер Вася себе надумал, что так будет лучше. Там где я начинал история была вообще интересная. Надо было сделать програмулину для управления антенной. Программеры забабахали супер мега интерерфейс на Стингрее, все красиво все работает. Но когда дело дошло до приемки, оказалось что комп тупо не вытягивает эту прогу. Тупит, по таймингам все слетает. Поменять комп нет возможности. Точнее это очень дорого. Все идет в одном комплекте. Второй пункт, для поверки нужно была возможность ручного управления. То есть, выставить углы в программе вручную и вывести в это положение. Такой возможности нет. Что делать заказчику? Он этим идиотам заплатил, они сделали какую-то хрень. Половина требование казалась не ясным и были проигнорированы. Заказчик не был в курсе что-такое С++, Stingray и прочее. Ему нахер это нужно. А программеры всен гнали - он дурак и ничего не понимает. И вот таких програмеров целые стада.

Еще был весьма интересный случай. Когда-то работал с одним немцем. Изначально казался странным. Но его отличие, что он был как бы посредником между конечным заказчиком и нами. Деньги платил нам. Показал в результате что нам что через год надо от нас. Все разрисовал красиво. Вот проблема требования нечеткие, можно сказать совсем нет. Кое-что, возможно во время работы уберут, а что-то добавят. Главная фишка - делать будем по недельным итерациям. Какой то идиот, сам не знает что делать, а нам что-то рассказывает что должно быть. - Размышляли некоторые, правда через год были уволены по результатам работы. Некоторые же до сих пор считают Agile плохой практикой.
Вот первая итерация. Такс. Вот вам железо будущего контролера. Надо сделать так, чтобы оно с командной строки можно было считать значение со счетчика. - Дурной таск, сказали некоторые.
Вот первая итерация. Прикрутите Poco и создайте бандл. Через него все это делайте. И так дальше. Те же товарищи начали кричать, он что совсем дебил раз предлагает С++ фреймворк на встроенную осю?
И так далее. До самого конца года вечно все не так. Но! Деньги он платить! Ваше дело делать! В итоге не смотря на зложилателей, все получилось.
Теперь у меня вопрос: кто в данном случае был дураком?