Название: Помогите с умными указателями Отправлено: Fregloin от Май 07, 2015, 14:57 Привет. Так уж довелось что за время работы с с++ умными указателями практически не пользовался.
А тут решил перевести свой код на их использование. Возникла проблема понимания QSharedPointer и QWeakPointer. Опишу проблему и надеюсь услышать советы по оптимизации. Есть несколько базовых объектов-синглтонов, которые предоставляют доступ к некоторым данным. Каждый синглтон отвечает за свои данные. Синглтоны реализованы в разных либах. Есть так же несколько синглтонов, которые используют базовые синглтоны (назовем их композитные). Так же реализованы в разных либах. Вот код базового синглтона base.h Код: class CBaseManager; Код: СBaseManager СBaseManager::instance() Т.е. базовый синглтон создается при первом вызове, а далее только инкрементируется его счетчик ссылок, и удаляется после того как на него никто не ссылается. Вот пример композитного синглтона Код: class CTrainManager; Такой вопрос, нужно хранить 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 не нужны никакие смартпоинтеры. сингелтон не убиваем. если это не так - значит это будет более глючная и сволочная конструкция, которая провоцирует ошибки и только усложняет жизнь. Название: Re: Помогите с умными указателями Отправлено: _Bers от Август 01, 2015, 08:12 Синглтон - зло. много раз слышал. ни разу не получил ни одного вразумительного ответа на вопрос: а почему собственно? Название: Re: Помогите с умными указателями Отправлено: Igors от Август 01, 2015, 09:19 Синглтон - зло. много раз слышал. ни разу не получил ни одного вразумительного ответа на вопрос: а почему собственно? Код Где MyMenuManager - синглтон. (Главное) Меню в приложении одно, а нужно всем, из совершенно разных мест никак не связанных между собой. Почему я должен избегать синглтона, и что вместо него? Недостатки заметны когда я пытаюсь задействовать MyMenuManager уже в др приложении. Ну да приходится подлатать с #ifdef :) Название: Re: Помогите с умными указателями Отправлено: _Bers от Август 01, 2015, 15:42 Недостатки заметны когда я пытаюсь задействовать MyMenuManager уже в др приложении. Ну да приходится подлатать с #ifdef :) у меня единственная причина отказа от сингелтона - издержки связанные с многопоточностью. иногда лучше иметь локальные копии переменных, пусть даже их придется передавать по многим аргументам, но не иметь проблем с синхронизацией. Название: Re: Помогите с умными указателями Отправлено: Tuxford от Август 02, 2015, 22:32 Синглтон - зло. много раз слышал. ни разу не получил ни одного вразумительного ответа на вопрос: а почему собственно? 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 И так формально оба класса должны быть синглтонами. Следуя вашей логики, реализация должна быть такая. Код: void UpdateDownloadManager::apply(const std::string& url) Теперь немного переиначим. Код: class UpdateDownloadManager Код: void UpdateDownloadManager::apply(const std::string& url) Ну и пишем фабрику. Думаю все догадаются как это делать. В результате. Манагеру подсовываем легко фейковый сторедж и тестим себе все что угодно. Никаких глобальных состояний. Инициализацией занимается фабрика. Все чудненько. Название: 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 вот это мне больше нравится. итак, начнем. покажите дизайн использования. напишите тесты, конкретно для вот этого вот класса. смысл тестов - они должны проиллюстрировать как использовать данный класс в работе. мне вот например, не понятно, что вообще должен делать данный класс, для чего он нужен, и как с ним работать. проиллюстрируйте использование. Название: Re: Помогите с умными указателями Отправлено: Tuxford от Август 07, 2015, 10:46 проблем от сингелтонов не наблюдал вообще никаких. Значит мало еще работаете. На моей практики 80% за последние 10 лет, синглотоны были вообще запрещены. (на самом деле наблюдал, но то был мелкий "деццкий" проект, Вот и пример. На "автомате" еще веселее бывает. И тогда вот поиск багов веселье. Если не проходили это, то еще ждет. Опыт такая штука класная :)и сингелтоны там были "деццкими" с ручным приводом. приходилось вручную следить за ними: за порядком инициализации и деинициализации. при деинициализации проект то и дело крякал. я предложил человеку уйти с "ручного привода" на "автомат". человек ответил: я хочу сам все контролировать. контролируй - ответил я ему. через два месяца человек снова ко мне обратился, и попросил научить как делать "автомат". в общем он задолбался вручную их пасти) и я не уверен, насчет вас в этом моменте. Угу. При этом всякие там системы логирования начинают уходить от этого дела. Если работали с какой либо иплементации osgi, так там вообще проспокойно можно без этого обойтись. Едиственная проблема нормальны иплементаций с++ фришных нет. по одной простой причине: основной юзкейс сингелтонов - глобальные точки доступа. и нужны они в основном только для каких то подсистем. это например: сетевая подсистема, звуковая подсистема, графическая, логгер, и тп. зачастую они вообще никак между собой не связаны. количество их весьма ограниченно. прозрачные сингелтоны - количество может исчисляться десятками и сотнями. Во первых прозрачный синглтонт тоже саможе что гарячий лед. но они не есть головная боль, просто потому, что программисты могут даже и не подозревать об их существовании. Во вторых я уже ответил. Название: Re: Помогите с умными указателями Отправлено: Tuxford от Август 07, 2015, 10:47 Пожалуйста. Самый примитивный пример. Код: class UpdateDownloadManager вот это мне больше нравится. итак, начнем. покажите дизайн использования. напишите тесты, конкретно для вот этого вот класса. смысл тестов - они должны проиллюстрировать как использовать данный класс в работе. мне вот например, не понятно, что вообще должен делать данный класс, для чего он нужен, и как с ним работать. проиллюстрируйте использование. Название: 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 Очень просто. Чуть ниже написан код. ниже нет никакого кода. вы какой то бестолковый. я рассчитывал на интересную дискуссию. а у нас тут оказывается проблема: автор кода не в состоянии проиллюстрировать использование собственного класса. Название: 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 Вы отличаете разницу между юнит тестированием и функциональным тестирование. да. Представьте себе что вы не в курсе что этот код делает. Просто тужно убедится что этот код рабатоет правильно. Что-то скачивает и что-то сохраняет куда-то. Представьте себе что скачивает он какие-то строки, а сохраняет скажем куда-то на другой сайт. бред. программист всегда в курсе, что делает код, который он пишет, или использует. можно быть не в курсе деталей реализации стороннего механизма. но нельзя быть не в курсе его интерфейса (апи библиотеки, если угодно). если программист написал: Код: foo(params); значит он в курсе, что делает функция foo, что обозначают её аргументы, и что он хочет получить в результате. Вот представьте себе есть проект миллионы строк кода. Ни они программист не в курсе что он делает. Авторы которые писали либо уже давно менеджеры и давно забыли что писали, либо уволились. И тут опс, надо новую фичу добавить или баг пофиксить. Но для начала воспроизвести. Вот задача. Да, я стыкался с такими тасками. При этом некоторые переменные названы то ли на голландском то ли на фламандском. Реально такое у меня было. я предложил вам продемонстрировать простейшие тесты для класса UpdateDownloadManager. смысл которых - проиллюстрировать дизайн использования. ничего особенного. просто покажите на примерах, как используется ваш класс. но вы не предоставили ни тестов, ни намека на документацию. не понятно, ни как использовать ваш класс, ни для чего он вообще нужен. вы не в состоянии ответить на простейшие вопросы. Пишу простейший кейс. Код: void MyTestClass::TestDwlMgrAppy() Что еще не ясно? Скаразу скажу, что такие ответы потому что на синглтонах это сделать почти не возможно. своими бестолковыми ответами, вы создали у меня впечатление, что вы просто ни бум бум в теме. я могу упростить вам задачу: пусть это будет не сингелтон. перепишите класс UpdateDownloadManager так, что бы это был самый обычный класс. и покажите тестами дизайн использования. Пример использования. Код: UpdateDownloadManager mgr; // в случае с синглтоном. при этом, меня не интересуют детали его реализации. Я привел достаточно кода. Вам нужно только apply. И оно есть. Остальное можете оставить пустым. Или на ваше усмотрение.нужно только две вещи: зачем он нужен, и как им пользоваться. Название: Re: Помогите с умными указателями Отправлено: _Bers от Август 26, 2015, 22:09 Скажите пожалуйста, вы в курсе что такое легаси код? Если в курсе, то работали? да. и это не имеет никакого отношения к тому, что мы сейчас с вами обсуждаем. а обсуждаем мы предложенный вами класс. для которого вы оказались не в состоянии написать кейсы. Пишу простейший кейс. это у вас такой кейс? Код: void MyTestClass::TestDwlMgrAppy() пустой ничего не делающий и ничего не иллюстрирующий тест? На входе принимается линк на локальный сервак, который грузит xml-ну, парсит ее и сохраняет в сторедж. Как я уже писал, реального стореджа у вас нет. Да и не нужно. Скажем, дорого. По сколько xmlна локальная, структура вам известна. Вопрос состоит в том, что сторедж надо мокнуть. Результат будет приемлемым если данные, которые попали в сторедж будут соответствовать тем которые в xml. Это и сеть результат функции apply. Протестировать надо исключительно бизнес-логику. Структуру данных можете придумать сами. Это не важно. Что еще не ясно? теперь продемонстрируйте сказанное вами сейчас в виде кода. напишите тесты. мне например, совершенно не очевидно, зачем вообще нужен какой то сторедж, про который я ничего не знаю. который в паблике никак не фигурирует. не понятно, зачем вообще может понадобиться грузить xml, если к ней нельзя получить доступ. проиллюстрируйте работу своего класса. Пример использования. Код: UpdateDownloadManager mgr; // в случае с синглтоном. вот это уже чем то отдаленно начинает напоминать нужное от вас. теперь оформите это в виде теста, который иллюстрирует кейс. здесь вы задействовали функцию apply. ну ок. теперь продемонстрируйте тест, который наглядно покажет, зачем вообще понадобился её запуск, и заодно проконтролирует корректность её работы. Я привел достаточно кода. Вам нужно только apply. И оно есть. Остальное можете оставить пустым. Или на ваше усмотрение. нет, не достаточно. не понятно, зачем был нужен вызов apply, что она делает, и зачем вообще понадобился целый класс для того, что бы прогрузить xml. так же, не понятно, накой болт нужен этот config.xml. что с ним делать дальше? у меня такое впечатление, что вы реально просто не осознаете, как на самом деле пишутся тесты. вот вам простейший пример: Код: TEST(tools, xml) вот так примерно и должны выглядеть нормальные тесты. они иллюстрируют принцип работы с механизмом. сразу должно быть понятно, что за механизм, как с ним работать, и как получать профит. однозначно ваша проблема не с сингелтонами. вы похоже просто не осознаете, что такое "дизайн использования". Название: Re: Помогите с умными указателями Отправлено: Tuxford от Август 27, 2015, 10:53 Еще раз смотрим код функции apply (случай с синглтоном):
Код: void UpdateDownloadManager::apply(const std::string& url) В результате я хотел видет что-то такое. Код: void MyTestClass::TestDwlMgrAppy() Теперь рассматриваю случай нормального проектирования. Код: UpdateDownloadManager::UpdateDownloadManager(IStoragePtr pStorage) : _pStorage(pStorage) И пишем тестик. Код: class StorageMock : public IStorage Вот оно что нужно было. Чтобы не было тролинга, сразу уточню getNewItems() в продакшин-класе не представляется возможен. К тому же 10 раз было проигнорирован тот факт, что физически сторедж недоступен. Так что учитесь писать правильно код без костылей. Название: Re: Помогите с умными указателями Отправлено: _Bers от Август 30, 2015, 14:36 Так что учитесь писать правильно код без костылей. с моей точки зрения: инъекции зависимостей и есть костыль. последствие унылого дизайна. смотрите какой дизайн у вас в итоге получился: Код: StorageMock pStorage = std::make_shared<StorageMock>(); и чем это отличается от простейшего: Код: Items newItems = DownladManager::apply(url); ну и нафига здесь вообще нужен какой то сингелтон, и какой то сторедж? сначала вы делаете простые вещи сложными. а потом изобретаете костыли и пишите моки, что бы хоть как то это контролировать. Название: Re: Помогите с умными указателями Отправлено: Tuxford от Август 31, 2015, 17:16 Так что учитесь писать правильно код без костылей. с моей точки зрения: инъекции зависимостей и есть костыль. последствие унылого дизайна. и чем это отличается от простейшего: Получается что мы наружу показываем те данные, которые туда не должны идти. Вполне возможно что айтемы могут бить дурных размеров. В итоге получается что вылазит лишнее копирование. Зачем такой изврат? Код: Items newItems = DownladManager::apply(url); ну и нафига здесь вообще нужен какой то сингелтон, и какой то сторедж? сначала вы делаете простые вещи сложными. а потом изобретаете костыли и пишите моки, что бы хоть как то это контролировать. и чем это отличается от простейшего: Нужен. См. что я повторил 11й раз. Второе - у стореджа свой респонсибилити. Он занимается исключительно операциями ввода-вывода. В нашем случаем только сохранением. Вопрос отдельного класса не обсуждается в принципе. Он может быть реализован или через интерфейс или через синглтон. Точно так же использовать его должен DownloadManager. Считайте что это некое ограничение. Скажем заказчик так захотел. ну и нафига здесь вообще нужен какой то сингелтон, и какой то сторедж? сначала вы делаете простые вещи сложными. Этот вопрос не обсуждается. Это вам кажется сложно. В действительности при достаточных знаний ООД и ТДД, это тривиальная задача. которая в данном случае решена правильно. Вообще то там все намного сложнее. Там есть свой даулоадер, который иплементирован точно так же. И апдейтер. Все оттестировано и все работает. В теории все эти сущности и есть синглтоны в контексте приложения. Но сделаны как обычные классы для минимизации зависимостей. Но я вопрос сильно упростил чтобы показать суть проблемы. Другой вопрос что вы пытаетесь откатится эдтак к 2005му году, когда синглтоны шли по полной, а большинство джуниоров и от некоторый процент мидлов, еще замечали проблем мультипоточности, связанности кода и прочие прелести. В то время как сеньоры с тимлидами уже матом ругались на это дело. а потом изобретаете костыли и пишите моки, что бы хоть как то это контролировать. Название: Re: Помогите с умными указателями Отправлено: _Bers от Август 31, 2015, 20:12 11й раз повторяю: ФИЗИЧЕСКИ стореджа НЕТ (или занят). Как предлагаете этот вопрос обойти с помощью синглтона? что значит "физически нет" ? нахер он тогда нужен? ваш собственный кейс: Код: StorageMock pStorage = std::make_shared<StorageMock>(); предполагает, что очень даже доступен. можно периписать этот говнокод так: Код: DownladManager mgr; я много страниц пытался добиться от вас юз-кейса. никому нахер не нужен какой то там стородж. нужны результаты использования. если получить профит нельзя - проблема не в сингелтоне, а у вас в голове, со здравым смыслом. Название: 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й раз повторяю: ФИЗИЧЕСКИ стореджа НЕТ (или занят). Как предлагаете этот вопрос обойти с помощью синглтона? что значит "физически нет" ? нахер он тогда нужен? ваш собственный кейс: Код: StorageMock pStorage = std::make_shared<StorageMock>(); предполагает, что очень даже доступен. можно периписать этот говнокод так: Не можно переписать. Тогда придется ждать когда появится физический девайс. А работать надо уже. Если вы не бывали в такой ситуации, значит или пока что ваш уровень джуниор и не выше. Код: DownladManager mgr; я много страниц пытался добиться от вас юз-кейса. никому нахер не нужен какой то там стородж. нужны результаты использования. если получить профит нельзя - проблема не в сингелтоне, а у вас в голове, со здравым смыслом. Предназначение стореджа - хранение шифрованных данных. Просто говоря положил что-то и тебя не волнует что оно делает с ним. Пользователь знает что их никто не украдет. Вообще слишком много вопросов. Задача предельно просто, но у вас все не так. Если в все так, то надо уже задуматься. Проблему в данном случае я описал и сказал, что на синглтонах ее решить невозможно в принципе. Вы пытаетесь как-то выкрутится. Но получается какая-то лажа. В прочем я подобное предполагал. Не думал что все настолько запущено. Проблема в том что синглтон Mock'ать никак не получится. Еще не дошло? Название: Re: Помогите с умными указателями Отправлено: Tuxford от Сентябрь 01, 2015, 12:32 Получается что мы наружу показываем те данные, которые туда не должны идти. Вполне возможно что айтемы могут бить дурных размеров. В итоге получается что вылазит лишнее копирование. Зачем такой изврат? если они не нужны снаружи, тогда нахер они тогда вообще нужны? какой профит должен получить пользователь? вы вообще понимаете,что делаете? Я это уже давно сделал, сейчас работаю на другом проекте. И это не имеет никакого отношения к сути задачи.касательно "тяжести структуры". Скажем так. Передать по ссылке не получится. Если через указатель, то получаем снова никому ненужное копирование. Так как надо выделить блок и скопировать туда данные. Через одно место. Все это в архитектуре все это было учтено.её в любом случае необходимо создать. можете вернуть наружу по значению и забыть (грамотно) можете сформировать внутри, а наружу выдать ссылку (опционально). Если так подходить как предлагаете, то мы возвратимся к процедурному программированию времен Паскаля. Даже не С. Название: Re: Помогите с умными указателями Отправлено: Tuxford от Сентябрь 01, 2015, 12:40 Этот вопрос не обсуждается. Это вам кажется сложно. В действительности при достаточных знаний ООД и ТДД, это тривиальная задача. учитывая, что вы не смогли сформулировать ни задачу, ни проиилюстрировать дизайн вашего механизма, который её решает - это как то беспонтово звучит. я понял, что бы ни бум бум TDD Название: Re: Помогите с умными указателями Отправлено: Tuxford от Сентябрь 01, 2015, 12:44 1. Bers просил ему рассказать про smart pointers. Сначала почитайте о чего весь этот сыр-бор начался. Вопрос состоит в том, что Bers бьется о стену что код с синглтоном легко поддается юниттестированию. Вот только беда - кода надо "немножко" переколбасить. То архитектура плохая, то задача плохая, то еще что-то плохое. И так далее. При тому уже устал писать что это физически не получится.2. Он попытался привести пример что он имеет ввиду. Спрашивается: нахрена ему тут толковать про TDD про легаси код? Ему оно не нужно. Откуда это желание учить других? ??? Ответа Bers явно показывают что он не понимает что вы ему говорите. Че биться головой об стену? Название: Re: Помогите с умными указателями Отправлено: KrupaKarlo от Сентябрь 01, 2015, 15:21 Цитата из самого первого поста
Привет. Так уж довелось что за время работы с с++ умными указателями практически не пользовался. А тут решил перевести свой код на их использование. Возникла проблема понимания QSharedPointer и QWeakPointer. Опишу проблему и надеюсь услышать советы по оптимизации. Где здесь слова про TDD и тд и тп Название: Re: Помогите с умными указателями Отправлено: KrupaKarlo от Сентябрь 01, 2015, 15:23 Прошу прощения, но вы всю тему тупо оффтопите.
Название: Re: Помогите с умными указателями Отправлено: Tuxford от Сентябрь 01, 2015, 16:36 Цитата из самого первого поста http://www.prog.org.ru/index.php?topic=28871.msg213488#msg213488Привет. Так уж довелось что за время работы с с++ умными указателями практически не пользовался. А тут решил перевести свой код на их использование. Возникла проблема понимания QSharedPointer и QWeakPointer. Опишу проблему и надеюсь услышать советы по оптимизации. Где здесь слова про TDD и тд и тп И мое следующее сообщение. Название: 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 Такое требование кастомера. Еще вопросы будут? вопрос на самом деле только один: что это за хрень, и как с нею работать? представьте себе, что я даю вам механизм, который загрузит файл. но вам он его не отдаст. и вы никак до него не дотянетесь. закономерный вопрос: нахрена вам вообще нужен такой механизм? каким образом и какие ваши потребности такой механизм может удовлетворить? у вас сложность тупо в том, что вы не в состоянии объяснить дизайн использования. В данному случае, поскольку это либа, то лишные данные не должны торчать в внешний мир. Вполне логично. Если на то, мы слишком увлеклись от вопроса. Или mock для синглтона, или ффсад. Все. Название: Re: Помогите с умными указателями Отправлено: Igors от Сентябрь 04, 2015, 10:37 ..11й раз повторяю: ... Поймите что с таким подходом "залупистого сеньора" Вам доказать ничего не удастся (даже если предположить что объективно Вы 1000% правы)...Объясняю 12й раз. .. ...Если вы не бывали в такой ситуации, значит или пока что ваш уровень джуниор и не выше. ... Проблема в том что синглтон Mock'ать никак не получится. Еще не дошло? Нет, не дошло. Вероятно (ну это я только предполагаю) Вы исходите из правила типа "тестирование должно проверять ЭТОТ - и только ЭТОТ класс (или файл)". Тогда видна какая-то логика - ведь синглтон "извне". Но накручивание "фабрики с явной инициализацией" по меньшей мере не выглядит естественным - ведь все равно Вы чем-то управляете за рамками тестируемого класса.Но это лишь мои догадки, а разговаривать "на понтах" желания у меня никакого, больше встревать не буду :) Название: Re: Помогите с умными указателями Отправлено: Tuxford от Сентябрь 04, 2015, 11:22 ..11й раз повторяю: ... Поймите что с таким подходом "залупистого сеньора" Вам доказать ничего не удастся (даже если предположить что объективно Вы 1000% правы)...Объясняю 12й раз. .. ...Если вы не бывали в такой ситуации, значит или пока что ваш уровень джуниор и не выше. ... Проблема в том что синглтон Mock'ать никак не получится. Еще не дошло? Нет, не дошло. Вероятно (ну это я только предполагаю) Вы исходите из правила типа "тестирование должно проверять ЭТОТ - и только ЭТОТ класс (или файл)". Тогда видна какая-то логика - ведь синглтон "извне". Но накручивание "фабрики с явной инициализацией" по меньшей мере не выглядит естественным - ведь все равно Вы чем-то управляете за рамками тестируемого класса.Но это лишь мои догадки, а разговаривать "на понтах" желания у меня никакого, больше встревать не буду :) Название: Re: Помогите с умными указателями Отправлено: _Bers от Сентябрь 04, 2015, 19:56 Начну с того что если вы думаете что заказчик глупый, то вы дурак в квадрате. на моей памяти даже самый наивный заказчик был в состоянии объяснить, чего он собственно хочет. в отличие от вас. Название: Re: Помогите с умными указателями Отправлено: Tuxford от Сентябрь 07, 2015, 11:25 Начну с того что если вы думаете что заказчик глупый, то вы дурак в квадрате. на моей памяти даже самый наивный заказчик был в состоянии объяснить, чего он собственно хочет. в отличие от вас. Еще был весьма интересный случай. Когда-то работал с одним немцем. Изначально казался странным. Но его отличие, что он был как бы посредником между конечным заказчиком и нами. Деньги платил нам. Показал в результате что нам что через год надо от нас. Все разрисовал красиво. Вот проблема требования нечеткие, можно сказать совсем нет. Кое-что, возможно во время работы уберут, а что-то добавят. Главная фишка - делать будем по недельным итерациям. Какой то идиот, сам не знает что делать, а нам что-то рассказывает что должно быть. - Размышляли некоторые, правда через год были уволены по результатам работы. Некоторые же до сих пор считают Agile плохой практикой. Вот первая итерация. Такс. Вот вам железо будущего контролера. Надо сделать так, чтобы оно с командной строки можно было считать значение со счетчика. - Дурной таск, сказали некоторые. Вот первая итерация. Прикрутите Poco и создайте бандл. Через него все это делайте. И так дальше. Те же товарищи начали кричать, он что совсем дебил раз предлагает С++ фреймворк на встроенную осю? И так далее. До самого конца года вечно все не так. Но! Деньги он платить! Ваше дело делать! В итоге не смотря на зложилателей, все получилось. Теперь у меня вопрос: кто в данном случае был дураком? |