2010-01-24 2 views
3

Я работаю с командой для более крупного приложения с Delphi 2007. Он использует большую унаследованную структуру для доступа к данным. Оба приложения и рамки используют String как тип данных для строк. Я начал изменять код в фреймворке для поддержки строк Delphi 2009, см. Мои предыдущие вопросы об этом.Как выбрать путь миграции из Delphi 2007

Я вижу 2 варианта теперь:

Alt 1 - Продолжать использовать строку, как и раньше. Это, пожалуй, самое чистое решение, так как инфраструктура будет поддерживать Unicode. Но код в рамках должен быть сильно изменен, чтобы это работало. Это требует глубокого понимания внутренних алгоритмов в рамках. Это также больший шанс ввести новые ошибки.

Alt 2 - Заменить строку AnsiString и Char с помощью AnsiChar. Это облегчает решение, а также как я начинаю изменять код (но потом я начинаю думать и задавать этот вопрос ...). Отрицательная сторона этого не поддерживает Unicode. Поддержка Unicode не является требованием, поскольку она работала до этого, но это приятно иметь. Он также может быть полезен в будущем. Другая проблема заключается в том, что приложение должно отправлять Ansistring переменные в качестве параметров в методах для фреймворка вместо String. Есть тысячи вызовов для изменения ...

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

EDIT Другая проблема - это память. Я написал быстрый тест, который выделяет массив из миллиона строк. Каждая строка была заполнена 26 символами от А до Я.

С Delphi 2007 потребовалось 40.011.600 байт, время было 4:15 минут. С Delphi 2009 потребовалось 72.015.580 байт, время было 4:45 минут.

Потребление памяти было измерено с помощью GetHeapStatus.TotalAllocated.

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

Нестандартно иметь 500 МБ в потреблении памяти для каждого клиента. Я думаю, что многое из этого как строки. Уместно стараемся использовать AnsiString как можно больше.

С уважением

+0

Интересные комментарии от всех, спасибо! По-видимому, неясно, что выбрать. Я чувствую себя немного больше для Alt 2, но комментарий Андреаса беспокоит меня. Если Pos вернет неправильный указатель, он может ввести новые ошибки. –

+0

См. Редактирование в моем ответе: «ссылка на сеанс Unicode на CodeRage 4 и объяснение того, что происходит в ситуации, описанной Андреасом». –

ответ

2

Начните с «alt 2», затем постепенно добавьте поддержку Unicode к своей структуре, а затем перейдите к Unicode.

Обоснование: вы хотите стабильное приложение; переход на Delphi 2009+ в конечном итоге потребует от вас поддержки Unicode.

Редактировать: 20100125

Хотя делать "альт 2" смотреть компилятор Delphi подсказки предупреждения.
Ситуация, которую описывает Andreas, генерирует такие подсказки и предупреждения.

Я объяснил это в своем CodeRage 4 session about Unicode and other encodings.
Вышеуказанная ссылка указывает на страницу, где вы можете просмотреть повтор этой сессии.

Если у вас остались вопросы, просто бросьте их сюда.

--jeroen

+0

Alt 2 может вызвать у него больше проблем, чем Alt 1, потому что RTL и VCL являются Unicode. Например, если он использует функцию «Pos», компилятор предпочтет версию Unicode, если оба параметра не являются AnsiStrings. Если первый - строковый литерал или литер символов, компилятор будет использовать версию Unicode. И есть несколько многобайтовых строк, которые представлены в Юникоде другим числом символов, что заставляет Pos возвращать неверный индекс. –

+0

Интересно, есть ли у вас какие-либо справочные или реальные случаи, когда это может произойти? –

+0

Я думаю, что он означает сказать, что преобразование из литералов в Юникод предпочтительнее, чем литералы, для анкетирования при оценке того, какую версию вызывать. Я думаю, что это правильно, хотя его нельзя переоценивать. Я бы ожидал, что (ansistring, char) выберет ангистрационную версию. –

1

Это будет больше работы, но я очень рекомендую вам обновить строки Unicode, потому что это родной тип строки из VCL и поэтому все ваши элементы управления будут иметь дело со строками Unicode в любом случае , Попытка превратить все взад и вперед вызовет у вас всевозможные неприятности.

+0

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

3

Либо остаться со старой версией Delphi, либо пройти весь путь. В любом случае вам придется рано и поздно.

Обратите внимание на то, что схема «заменить все на запретную» также не является полностью надежной, особенно если вы касаетесь потоков, а ваши файловые форматы должны оставаться неизменными. Нет никаких объяснительных TStringlists, tstringstream и т. Д. С расширением.

То же самое, вероятно, относится к Datasnap, Indy и другим фреймворкам.

Вы можете попытаться использовать этот трюк для определенных струйных деталей сначала, чтобы избежать слишком большого количества кода. Например. У меня была собственная библиотека XML, которую я заплатил, чтобы оставаться в основном ангистрантом. Библиотека использовалась только в боковом направлении, и unicode не имел к ней никакого значения.

+0

Да, я заметил, что AnsiString заменит трек не на 100%. –

2

Мы оценили переход 2007 -> 2009 год назад и попробовал меньший проект (200k линии). В результате везде, где вы не используете «причудливые» вещи, такие как указатели, набор символов и т. Д., Портирование действительно не так сложно. Особенно мы собираем единицы графического интерфейса в течение дня или около того. Это эквивалентно opt1.

Библиотечные подразделения с низкоуровневыми процедурами, доступ к измерительным системам и т. Д. И т. Д. Были совершенно другой историей. Здесь мы выбираем перевод строки -> ansistring, char -> ansichar и т. Д. И т. Д. Портирование этих единиц - это боль, чтобы получить правильное решение, и клиент не заплатит за переход. Следовательно opt2 для этих единиц.

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

+0

Возможно, это будет так, как мы делаем разговор, но вся команда должна обсудить и спланировать это. –