Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Как правильно переписать программу с Delphi на C#?

#c_sharp #delphi


Вводные данные

Возникла задача переписать программу, которая несколько длиннее чем Hello World,
с Delphi на C#. Программа очевидно рабочая, к ней привыкли многие пользователи, и она
вообщем-то очень хороша, но не развивается как необходимо, или в силу обстоятельств
вообще уже не работает, не суть важно... Исходники на Delphi есть, но очень слабо документированы,
а писатель вне зоны доступа. Необходимость переписать на C#, вероятно связана с упрощением
сопровождения в наше время, но до конца не известна.

Вопрос

Работать ботом-переводчиком, переводя процедуру за процедурой, не понимая до конца
их сути, с Борланд Паскаля на Майкрософт C# мне кажется немного неверным подходом.
Может потому что я не разу не переводил ничего из литературы? Вообщем, существуют какие-либо
наработанные способы и стратегии на этом пути?

P.S.

Вопрос не касается меня напрямую. Я сейчас ничего не перевожу. Просто в вопросах
этого дня:
  Delphi смещение указателя
  Что происходит, когда заходишь за границы массива
встретилось несколько упоминаний преамбулы моего вопроса, и путь по которому идёт
автор, мне кажется не вполне продуманным.
    


Ответы

Ответ 1



Если проект достаточно большой, то переписать его один-в-один будет скорее всего практически невозможно, из-за использования внешних библиотек и фреймворков. Поэтому, всё что вы сможете сделать, так это создать некую похожую программу со сходным функционалом, т.е. "клона". И вам, вероятно, придётся сильно изменить/упростить GUI из-за того, что Delphi славится богатым набором VCL компонентов, которым может не оказаться аналогов. Для того, чтобы клон получился максимально похожим на оригинал и переход прошёл гладко, вам нужно быть экспертом в обоих языках и досконально представлять архитектуру и функционал оригинального проекта. НО если вы знаете Delphi и разберётесь с архитектурой оригинального проекта, то и сопровождать его (и рефакторить) вам не составит особого труда. По крайней мере, это будет в 100500 раз проще, чем переписывать. Поэтому, тут стоит очень сильно подумать. Подход с механическим транслированием кода, очевидно, не подойдёт в глобальном смысле, но некоторые куски кода (число-дробильные алгоритмы и тому подобное) можно будет так перенести, даже не понимая, как он работает (только не забудьте про тесты). Но в глобальном смысле, плясать надо от архитектуры - составить архитектуру оригинала со всеми взаимосвязями между модулями и классами, затем, определить узкие места и неудачные решения, затем улучшить и адаптировать её с учётом особенностей C# и только потом можно будет начинать что-то делать. Чем тщательнее вы выполните этот анализ и адаптацию, тем проще вам будет в итоге переписывать. Может оказаться так, что в оригинале архитектура вообще никуда не годится и её надо будет разрабатывать с нуля, стараясь сохранить как можно больше исходного функционала. В итоге получится, что вы измените часть гуя из-за используемых компонентов, измените часть логики/функционала из-за изменившейся архитектуры, измените ещё что-то и получится у вас уже другая программа, о которой можно будет сказать, что она "основана на...".

Ответ 2



1) Сначала необходимо понять архитектуру программы и используемые технологии: способы хранения данных, СУБД, настройки, ветки реестра, используются ли сокеты (сетевое взаимодействие), потоки, какие программа запускает процессы. Лучше на бумаге все выписать для начала и создать модель. Может быть даже самому попытаться свою архитектура разработать исходя из требуемого функционала. А уже потом сравнить с имеющейся архитектурой. Проанализировать, что сделано как и почему. Не всегда изначальная архитектура правильная, опыт подсказывает, что её можно улучшить практически всегда. Как раз есть такой шанс. Конечно зависит от объема проекта. Если большой и сложный и сроки жмут, то лучше оставить старую архитектуру. Получить общую схему работы ПО. 2) Понять, что происходит при автозагрузке и инициализации проекта. При создание форм (FormCreate), загрузке модулей и библиотек (Секция initialization), что в dpr файле делается. В принципе работы программы это загрузка (подготовка) + работа в ответ на действия пользователя. 3) Адаптировать GUI. Несмотря на большое наличие компонентов, программы на Delphi использует либо контролы Windows (TListView, TTreeView) либо аналогичные, но базовые (TLabel). Набросать те же или похожие контролы и шаг за шагом перенести их обработчики. Можно заглушки сделать. Есть данные отделяются от визуализации в проекте, то многие обработчики будут завязаны только на контролы (удалить элемент, отсортировать). Добится того, чтобы на экране появилось тоже самое, что и в исходной программе. Тут важно учесть, что GUI не всегда понятное и есть шанс его упростить/улучшить (конечно лучше без ущерба для пользователей), но шансом надо пользоваться, мусор волочь за собой не надо. 4) Переписать ядро программы. То есть основные классы, основной функционал. Главное понять, что на входе, а что получается на выходе. Если Вы поняли архитектуру, то возможно окажется, что некоторые классы не надо переписывать вообще, так как они будут лишними. Лично для меня лучше сделать свой вариант, потом посмотреть в чем отличия оригинала. Возможно, что-то не было учтено. Потом внести коррективы в свой код.

Комментариев нет:

Отправить комментарий