Информация об изменениях

Сообщение Re[2]: Подходы с присвоением больших сложных массивов от 08.09.2023 16:09

Изменено 08.09.2023 16:09 swame

Re[2]: Подходы с присвоением больших сложных массивов
Здравствуйте, alpha21264, Вы писали:

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


K>>У меня перестала запускаться моя программа, и я ищу ошибки в старом дерьмокоде, написанном 20 лет назад. Видно что общей ошибкой было частое использование указателей и всяких new, dispose, getmem, freemem, вместо использования классов. Другая ошибка заключалась в том, что вместо assign-ов использовалось копирование указателей на сложные структуры. Предположим, у вас есть сложный иерархический массив с разными вложенными элементами, а в другой модуле сопряжённый с ним другой массив (например первый массив хранит данные для логики программы, а второй для их визуального отображения на формах). Так вот надо при присвоении вторым массивом первого прописывать процедуру assign, а у меня раньше могло быть копирование указателей на структуру (тогда, если сделать присвоение а потом первый массив очистить, то второй перестанет нормально работать).


A>Ну, вообще-то у тебя "большие и сложные данные" (не массивы, а данные!!!).

A>Чтобы держать всё это в голове, я рекомендую создать одну большую структуру "все данные", где хранить всё.
A>Только эта структура (класс) может создавать, хранить и удалять данные, все остальные — не могут.

A>А все остальные структуры данных работают с этой структурой в режиме "только чтение".

A>И вот они содержат ссылки на структуру "Все данные", но никогда не могут ни удалить, ни изменить что-то.
A>Таким образом ты можешь избавиться от дублирования данных.

Забористо. НО такой похход годится только там, где данные не требуется загружать — выгружать сложнострукткрированные данные.

A>Но в такой системе при изменении структуры "все данные" ссылки могут потерять актуальность и привести к SegFault.

A>Поэтому я храню не ссылки, а индексы в массиве. Индекс можно хотя бы проверить перед использованием.

Для исключения ссылок на сдестроенные объекты я регистрирую объекты в коллекции TDictionary<int64, TObject>
Объяетам назначаются идентификаторы int64, при создание объекта он регистрирует себя в коллекции, при дестрое удаляется оттуда.
в ссылках между объектами хранятся не указатели, а эти идентификаторы.
Массив не годится там где объекты постоянно создаются — удаляются

A>В идеале у тебя не должно быть никаких данных кроме объекта "все данные".

A>Этот обьект сам отвечает за свою консистентность.
A>И любой объект в твоей программе — это просто часть объекта "все данные".
A>Кроме этого Объекта в программе могут быть только индексы и итераторы.
Re[2]: Подходы с присвоением больших сложных массивов
Здравствуйте, alpha21264, Вы писали:

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


K>>У меня перестала запускаться моя программа, и я ищу ошибки в старом дерьмокоде, написанном 20 лет назад. Видно что общей ошибкой было частое использование указателей и всяких new, dispose, getmem, freemem, вместо использования классов. Другая ошибка заключалась в том, что вместо assign-ов использовалось копирование указателей на сложные структуры. Предположим, у вас есть сложный иерархический массив с разными вложенными элементами, а в другой модуле сопряжённый с ним другой массив (например первый массив хранит данные для логики программы, а второй для их визуального отображения на формах). Так вот надо при присвоении вторым массивом первого прописывать процедуру assign, а у меня раньше могло быть копирование указателей на структуру (тогда, если сделать присвоение а потом первый массив очистить, то второй перестанет нормально работать).


A>Ну, вообще-то у тебя "большие и сложные данные" (не массивы, а данные!!!).

A>Чтобы держать всё это в голове, я рекомендую создать одну большую структуру "все данные", где хранить всё.
A>Только эта структура (класс) может создавать, хранить и удалять данные, все остальные — не могут.

A>А все остальные структуры данных работают с этой структурой в режиме "только чтение".

A>И вот они содержат ссылки на структуру "Все данные", но никогда не могут ни удалить, ни изменить что-то.
A>Таким образом ты можешь избавиться от дублирования данных.

Забористо. НО такой похход годится только там, где не требуется много загружать — выгружать сложнострукткрированные данные.

A>Но в такой системе при изменении структуры "все данные" ссылки могут потерять актуальность и привести к SegFault.

A>Поэтому я храню не ссылки, а индексы в массиве. Индекс можно хотя бы проверить перед использованием.

Для исключения ссылок на сдестроенные объекты я регистрирую объекты в коллекции TDictionary<int64, TObject>
Объяетам назначаются идентификаторы int64, при создание объекта он регистрирует себя в коллекции, при дестрое удаляется оттуда.
в ссылках между объектами хранятся не указатели, а эти идентификаторы.
Массив не годится там где объекты постоянно создаются — удаляются

A>В идеале у тебя не должно быть никаких данных кроме объекта "все данные".

A>Этот обьект сам отвечает за свою консистентность.
A>И любой объект в твоей программе — это просто часть объекта "все данные".
A>Кроме этого Объекта в программе могут быть только индексы и итераторы.