Является ли хорошей практикой использование динамического массива в поле объекта? - PullRequest
1 голос
/ 27 ноября 2009

Я перевожу некоторый существующий код Delphi в класс.

В текущем коде используется глобальная переменная, определенная как динамический массив array of byte. Во время инициализации код вычисляет размер массива и использует SetLength для его выделения. Это удобно как в качестве буфера для получения данных, так и в качестве контейнера времени выполнения для последующей обработки.

Я хочу переместить эту переменную в качестве одного из атрибутов объекта.

Но я не уверен, можно ли поддерживать его тип. Это считается хорошей практикой?

Альтернатива, которую я рассматриваю, заключается в преобразовании его в динамический контейнер, такой как TList. Я сохраню тот же код для получения данных с локальным динамическим массивом, но перенесу его в контейнер до конца своей жизни. Стоит ли усилий? Я знаю, что элегантность всегда окупается в конце, но я не вижу ценности усилий в данный момент. Есть мысли?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

Динамические массивы хороши, но на самом деле только для фиксированных размеров. Если они должны расти, особенно с шагом в одну запись, это может привести к возможным ошибкам со стороны диспетчера памяти (и возможным проблемам с производительностью), поскольку массив должен быть перераспределен и скопирован в новое место назначения большего размера. TList, по крайней мере, имеет «растущий» механизм, который вызывается реже.

2 голосов
/ 27 ноября 2009

Я знаю, что элегантность всегда окупается в конце

Это так? Обратите внимание, что изменение рабочего кода всегда включает в себя риск что-то сломать. ИМХО, должно быть решено в любой ситуации, стоит ли приобретенная элегантность риска.

В вашем случае, если вы добавляете и удаляете элементы во время выполнения, я бы использовал TList, так как эти операции намного проще. Если вы просто инициализируете длину один раз, а массивы остаются постоянными после инициализации, вы можете просто сохранить динамический массив. Определенно нет «хорошей практики», утверждающей, что вы не должны использовать динамические массивы.

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