I
про мув читал что-то
Anatoly
не очень. Я практически не знаю нутрей языка
тогда, наверное, в @supapro можно более подробно поговорить
Max
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение. ИНТРО Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда Ctrl+Z и Ctrl+Shift+Z Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке. Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack. ПРОБЛЕМА Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку. Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь. ВОПРОС Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте. Заранее спасибо.
🦥Alex Fails
ну, могу посоветовать хранить не сырые указатели, а шаредопойнтеры
Aidar
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение. ИНТРО Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда Ctrl+Z и Ctrl+Shift+Z Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке. Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack. ПРОБЛЕМА Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку. Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь. ВОПРОС Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте. Заранее спасибо.
так я не понял, там же должна быть команда восстановления блока
Aidar
просто блок нужно идентифицировать не указателем
Aidar
если и указателем то както запоминать новый указатель или типа того
Egor
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение. ИНТРО Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда Ctrl+Z и Ctrl+Shift+Z Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке. Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack. ПРОБЛЕМА Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку. Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь. ВОПРОС Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте. Заранее спасибо.
Паттерн "Команда", заабстрагировать все действия в него и сделать операцию "примени и верни обратную команду"? Только надо будет аккуратно с тем, что именно есть "команда"
Max
ну, могу посоветовать хранить не сырые указатели, а шаредопойнтеры
УТОЧНЕНИЕ Дело не только в поинтерах, это частичный случай. По сути, есть дофига мегаклассов, каждые спокойно, нарушая инкапсуляцию, читают/меняют данные других классов, все через *опу короче. Поэтому вероятность отстрелить ноги крайне высока. Тем более, что, например, создание того же текста дергает новые модальные окна, которые дергают кучу других вещей, и т.п.
Aidar
нужно или хранить блоки в памяти пока команда удаления в стеке или менять идентификацию блоков
Berkus
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение. ИНТРО Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда Ctrl+Z и Ctrl+Shift+Z Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке. Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack. ПРОБЛЕМА Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку. Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь. ВОПРОС Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте. Заранее спасибо.
смотри Sean Parent, "Inheritance is the base class of evil"
Max
Паттерн "Команда", заабстрагировать все действия в него и сделать операцию "примени и верни обратную команду"? Только надо будет аккуратно с тем, что именно есть "команда"
Это как раз подход, который реализует Qt. Но я должен в каждую команду засунуть указатели на поинтеры какого-нибудь мегакласса, чтоб она могла з ними работать. В этом главная проблема. При redo/undo, когда что либо удаляется, поинтеры стают сырыми.
Berkus
там про это всё есть
Aidar
не вижу смысла не хранить блоки в памяти(или их значимую часть)
Aidar
всеравно для восстановления нужны эти данные
Max
Если б у меня был вариант все переписать по человечески, не нарушая ООП подходы и сохраняя нормальную архитектуру, я б с радостью это сделал.
Anatoly
либо наводи порядок, либо страдай. других вариантов не остается
Egor
Можно наводить порядок в подмножестве кода
Egor
И, скажем, при совершении неподдерживаемых операций обнулять нафиг стэк undo
Max
Команды должны быть самодостаточными, кодирующими конкретное изменение состояния. И не ссылаться на что-то, что кто-то другой может грохнуть.
Чтобы просто врапнуть все, что мне надо, в команды, я должен в команду пихать методы этих же мегаклассов, и передавать им ссылку на их клас, короче через std::bind(&Class::method, this) Иначе нужно полностью переписывать логику и разносить по классам все сущности
Aidar
этож не синглтоны
Aidar
ну или make_shared_from_this
Max
Я пожалуй приведу пример проблемы кодом. Пару мин
Денис
Всем привет! Народ, надо сделать tcp-сервер на чистом си В задании сказано вот что
Денис
Это значит принять всю последовательность и только после выделить субпоследовательность или можно по мере поступления?
Max
Ссылка на код https://ideone.com/9Pp8OV Вопрос Есть общий интерфейс UndoCommand. Чтобы использовать метод класса View, я через std::bind передаю в команду сам метод для коллбэка и параметры. Пусть есть такой воркфлоу: 1. Добавили блок. 2. Добавили на него текст. 3. Удалили блок. 4. Ctrl + Z. Блок был удален с кучи, при восстановлении поинтер на него устареет у текста. Кроме того, я должен передавать все эти var1-3 для работы метода, так как он их использует. ВОПРОС Какого хрена я этим занимаюсь?(зачеркнуто). Как это правильно организовать на сущесвтующей архитектуре? P.S. Данный пример илюстрирует только малую долю зависимостей, есть например классы, которые должны всегда иметь валидные поинтеры на все элементы виджета и т.п. UPD class MyCommand : public UndoCommand
🦥Alex Fails
пункт 3 - надо не удалять из кучи а пометить на удаление
Max
пункт 3 - надо не удалять из кучи а пометить на удаление
Методы, которые отображают данные, тоже через *опу. Менять удаление на фиктивное удаление равно переписать больше половины кода.
Max
Но я так понимаю, выбор у меня невелик :)
🦥Alex Fails
ну да
🦥Alex Fails
тебе ж надо будет как-то откатываться к тому, что было "удалено"
Egor
Ссылка на код https://ideone.com/9Pp8OV Вопрос Есть общий интерфейс UndoCommand. Чтобы использовать метод класса View, я через std::bind передаю в команду сам метод для коллбэка и параметры. Пусть есть такой воркфлоу: 1. Добавили блок. 2. Добавили на него текст. 3. Удалили блок. 4. Ctrl + Z. Блок был удален с кучи, при восстановлении поинтер на него устареет у текста. Кроме того, я должен передавать все эти var1-3 для работы метода, так как он их использует. ВОПРОС Какого хрена я этим занимаюсь?(зачеркнуто). Как это правильно организовать на сущесвтующей архитектуре? P.S. Данный пример илюстрирует только малую долю зависимостей, есть например классы, которые должны всегда иметь валидные поинтеры на все элементы виджета и т.п. UPD class MyCommand : public UndoCommand
А как это вообще должно работать? Блок удалили. Что семантически должна делать команда "вернуть текст на удалённый блок"?
Egor
Кажется, что сначала должна выполниться команда "отменить удаление блока", а уже потом "восстановить текст на удалённом блоке".
Egor
Тогда, действительно, самым простым кажется вместо удаления при помощи какого-нибудь delete передавать владение команде в стеке.
Egor
И тогда никакие указатели не устаревают
Egor
Если есть инвариант, что надо уметь восстанавливать только последнюю совершённую команду и что отмена восстанавливает состояние _в точности_ (в том числе с указателями)
Max
ты уже прочитал про это в GoF? тщательно?
А про что конкретно? Какой именно паттерн, или раздел
Egor
Мне кажется, что перед чтением паттернов надо придумать что _должно происходить с точки зрения пользователя_. Странно думать про код, когда неясно, как проверять корректность.
Berkus
А про что конкретно? Какой именно паттерн, или раздел
в паттерне Command по-моему детально разбирается случай как раз с undo/redo
Berkus
А про что конкретно? Какой именно паттерн, или раздел
и я правильно понял что рекомендацию про Шона Парента ты тщательно проигнорировал?
Max
Мне в принципе суть понятна, и понятно, как бы я это хотел реализовать с самого начала, но к сожалению существующий код разбит не по командах, а на спагетти. Было б по другому, не было б проблем. Всем спасибо за рекомендации, буду разбираться дальше.
Max
и я правильно понял что рекомендацию про Шона Парента ты тщательно проигнорировал?
Посмотрел. Эта гениальная идея уже лежит в проекте, в другой его части. Фишка там в том, что работает оно в силу дибильности легаси кода по несколько секунд на команду, когда юзер работает с большими проектами.
FailsBot
http://en.cppreference.com/w/cpp/filesystem/path/empty
Vladislav
🦥Alex Fails
дык триггернули. там сломался медиавики очередной, шлет html вместо жисона. Позже отдебажу.
🦥Alex Fails
там не cppreference, там другой
Anonymous
А... А какой?
Matwey
Ему медиавики на каждый чих нужна что-ли?
Anonymous
Очевидно, что вместо JSON пришел HTML, ошибка парсинга, никто не поймал экзепшен ибо не ожидалось, бот сложился.
Matwey
Ггг
Matwey
Ну надо было на erlang писать
🦥Alex Fails
нет, надо было try-catch Добавить, из-за которого тоже падает
Matwey
Если серьезно, какая-то странная отмазка. Получить из внешнего мира данные и не ожидать, что они будут невалидными
🦥Alex Fails
нет, надо было try-catch Добавить, из-за которого тоже падает
я тут уже писал о проблемах с этим говном. как добавляешь try-catch, то оно сегфолтится, без него - пишет, что unhandled exception. Я там в некоторых местах без исключений старался делать, потому что вот такая задница с ними была
Matwey
Я вот в первую очередь ожидаю, что мне пидарасы с той стороны мусора насыпали вместо данных!
Anonymous
Там и HTML вместо JSON приходил, и ответы не соответствовали схеме...
Anonymous
Собсно я и забросил либу для их чуда.
🦥Alex Fails
Там и HTML вместо JSON приходил, и ответы не соответствовали схеме...
ну, тут как я понял, та же хуйня. детально не смотрел, только консольный лог
🦥Alex Fails
Ты Accept: то правильно шлешь?
спасибо за помощь, после работы я сам все поправлю, хорошо?
🦥Alex Fails
да потому что достали уже просить его исправить XD всем говорю, что как доделаю дела покритичнее - поправлю