Наши услуги

Мы предлагаем

serv2
Сайт визитка - лендинг
Одна шаблонная страница - когда надо сегодня
serv2
Сайт магазин с CRM
Главная страница, каталог товаров/услуг, личный кабинет продавца
serv2
Дизайн для своего сайта
Нарисуем вам новый дизайн
serv2
Доработка существующего сайта
Когда что-то сломалось
serv2
Дизайн печатной продукции
Визитки, баннеры, стикеры и прочее нецифровое, что можно будет потрогать :)
serv2
Не знаю как объяснить - посмотрите сами
И такое делаем :)

Почему мы?

Минимум взаимодействий
Минимум взаимодействий
Из материалов только ваша страница или сайт
Всегда на связи
Всегда на связи
Голосовые, текст, видео - как удобно :)
Бывает и дорого, но есть бесплатно
Бывает и дорого, но есть бесплатно
Качество не зависит от цены
Индивидуальный подход
Индивидуальный подход
Разумеется :)
business
Коротко

О нас

wow5
2015
работаем успешно с
wow3
5
Реализованных проектов

Это начало интересного текста обо мне

Чуть позже напишу тут интересный текст

Партнёров пока нет
Но, ты пиши если что :)

Наши работы

Работа 1
Работа 2

Ознакомьтесь с нашим сервисом и комфортным сотрудничеством

Тарифы

Сайтик фри
0
Точно такой лендинг
checkedВаши фото, контакты и тексты
checkedИмя сайта имя.dencompany.ru
checkedБез мелкого шрифта и камней
Лайт
от
5 000
₽/год
Когда сайт пробник понравился и надо расширяться
checkedСамостоятельное имя сайта
checkedИндивидуальные настройки
checkedCRM (личный кабинет продавца)
checkedБез мелкого шрифта и камней
Хочу всё
от
15 000
₽/мес
Когда налажен процесс или не очень, но надо много и не хочется вникать
checkedСамостоятельное имя сайта
checkedИндивидуальный дизайн
checkedCRM (личный кабинет продавца)
checkedПеренос товаров с текущего сайта
checkedБез мелкого шрифта и камней

Профессионалы своего дела

Наша команда

Фото
Fullstack ведущий программист
Денис

О нас говорят

Отзывы клиентов

Фото отзыв
Я — специалист по SMM
Linda
Дизайнер
Фото отзыв
Отзыв 1
Mark
Backend разработчик
Смотреть все

Все, что нужно знать о бизнесе

Блог

Читать блог
Фото блог
16
08.2026
5 основных инструментов для продвижения интернет-бизнеса
Я — специалист по SMM.
Фото блог
16
08.2026
5 основных инструментов для продвижения интернет-бизнеса
Раньше работала дома.
Фото блог
16
08.2026
5 основных инструментов для продвижения интернет-бизнеса
Я работала дома.

Все, что нужно знать о создании сайтов

Статьи

16.08.2026
Миграция легаси-приложения на Delphi: пошаговое руководство для мидл-разработчика Миграция фреймворка — это всегда сложный и ответственный процесс, особенно когда речь идет о таком ветеране программирования, как Delphi. Для разработчика уровня middle это не просто задача по замене библиотек, а целый проект, требующий системного подхода, глубокого понимания архитектуры и умения работать с унаследованным кодом. В этой статье мы разберем ключевые этапы миграции Delphi-приложения, типичные ловушки и практические рекомендации, которые помогут провести процесс без потери качества и в срок. Оценка масштаба и постановка целей Прежде чем писать первую строку кода, необходимо четко определить, что мы мигрируем и зачем. Для мидл-разработчика это этап, на котором нужно проявить аналитические способности и умение задавать правильные вопросы. Аудит текущего кода Начните с полного аудита исходного кода. Не пытайтесь охватить все сразу — разбейте проект на модули и оцените каждый по следующим критериям: Возраст кода — код, написанный на Delphi 5-7, будет сильно отличаться от кода на Delphi 10.4+. Используемые библиотеки — составьте полный список сторонних компонентов и библиотек, от которых зависит проект. Степень связанности — определите, насколько модули зависят друг от друга. Чем выше связанность, тем сложнее будет миграция. Покрытие тестами — наличие автоматических тестов критически важно для безопасной миграции. Если их нет, это первая задача, которую нужно решить. Определение целевой версии Выбор целевой версии Delphi — стратегическое решение. Не всегда нужно гнаться за самой свежей версией. Оцените, какие новые возможности вам действительно нужны, и совместимы ли они с вашим стеком технологий. Например, переход на Delphi 10.3+ дает доступ к современным возможностям языка (inline variables, enhanced RTTI), но может потребовать обновления сторонних библиотек. Планирование миграции После аудита переходим к планированию. Это этап, где мидл-разработчик должен проявить свои навыки тайм-менеджмента и управления рисками. Стратегия миграции Существует два основных подхода к миграции: «большой взрыв» (big bang) и поэтапная миграция. Для больших проектов второй подход предпочтительнее. Поэтапная миграция — вы постепенно переносите модули на новую версию, сохраняя работоспособность приложения на каждом этапе. Это позволяет быстрее выявлять ошибки и снижает риски. Параллельная работа — старая и новая версии работают одновременно, что позволяет сравнить поведение системы и плавно переключить пользователей. Составление карты зависимостей Создайте детальную карту зависимостей между модулями. Это поможет определить порядок миграции: начинать нужно с самых низкоуровневых модулей, которые не зависят от других, и постепенно подниматься вверх. Используйте инструменты анализа кода, такие как Pascal Analyzer или ModelMaker, чтобы автоматизировать этот процесс. Процесс миграции кода Теперь переходим к самой технической части. Здесь мидл-разработчик сталкивается с конкретными проблемами, которые требуют внимательности и знания особенностей Delphi. Изменения в языке и RTL Каждая новая версия Delphi вносит изменения в язык и Runtime Library. Вот что нужно проверить в первую очередь: Изменения в типах данных — например, размер некоторых целочисленных типов мог измениться. Депрецированные функции — функции, которые были помечены как deprecated, могут быть удалены в новой версии. Изменения в работе с памятью — особенно если вы используете ручное управление памятью или интерфейсы. Изменения в VCL/FMX — визуальные компоненты могли изменить свое поведение или свойства. Работа с устаревшими конструкциями Код, написанный 10-15 лет назад, часто содержит устаревшие конструкции. Например, использование глобальных переменных, прямых ссылок на внутренние структуры данных или устаревших паттернов работы с исключениями. В процессе миграции это нужно аккуратно рефакторить, но помните: не пытайтесь переписать все сразу. Сначала добейтесь того, чтобы код компилировался и работал на новой версии, а затем уже улучшайте его. Совместимость сторонних библиотек Одна из самых частых проблем — несовместимость сторонних компонентов. Проверьте, есть ли обновленные версии для целевой платформы. Если библиотека не обновляется, у вас есть три варианта: Найти альтернативную библиотеку с аналогичным функционалом. Написать собственную обертку (wrapper) для замены функционала. Перенести код библиотеки в проект и адаптировать его вручную (самый трудоемкий вариант). Тестирование и обеспечение качества Без качественного тестирования миграция обречена на провал. Для мидл-разработчика это возможность проявить свои навыки в создании надежного программного обеспечения. Стратегия тестирования Разработайте стратегию тестирования, которая включает в себя: Модульное тестирование — используйте DUnit или DUnitX для проверки отдельных модулей. Интеграционное тестирование — проверка взаимодействия между модулями. Системное тестирование — проверка всего приложения в целом. Регрессионное тестирование — убедитесь, что новая версия не сломала существующий функционал. Автоматизация тестов Настройте автоматический запуск тестов при каждой сборке. Это позволит быстро выявлять ошибки на ранних этапах. Используйте системы непрерывной интеграции (CI), такие как Jenkins или GitLa
11.08.2026
Решаем проблему фреймворка в QBasic: руководство для джуна Когда мы слышим слово «фреймворк», мы обычно представляем Django, Spring или Laravel. Но в мире QBasic, где царит процедурное программирование и прямое обращение к памяти, понятие фреймворка трансформируется в нечто иное. Здесь фреймворк — это не библиотека классов, а набор соглашений, модулей и макросов, которые позволяют структурировать код и избавляют от хаоса. Для джуна, который привык к современным IDE, QBasic покажется архаизмом, но именно здесь можно понять фундаментальные принципы организации кода, не отвлекаясь на сложный синтаксис. Почему в QBasic возникает проблема «фреймворка»? QBasic не имеет встроенной поддержки объектно-ориентированного программирования, исключений или пакетов. Весь код — это последовательность строк, выполняемых интерпретатором. Когда проект разрастается, возникает классическая проблема: глобальные переменные и перекрестные вызовы превращают программу в «спагетти». Джуны часто пытаются решить эту проблему, создавая подобие фреймворка, но терпят неудачу из-за отсутствия дисциплины. Суть проблемы в том, что QBasic не навязывает структуру. В отличие от строгих компиляторов, он позволяет писать код как угодно. Это свобода, которая убивает проект. Поэтому «фреймворк» здесь — это свод правил, которые вы сами себе устанавливаете. Основные компоненты самодельного фреймворка Чтобы решить проблему, нужно разбить её на три кита: модульность, управление состоянием и единая точка входа. Рассмотрим каждый пункт с точки зрения джуна. 1. Модульность через SUB и FUNCTION В QBasic нет классов, но есть SUB (процедуры) и FUNCTION (функции). Это ваш единственный инструмент для создания модулей. Проблема джуна в том, что он пытается сделать одну гигантскую процедуру, которая делает всё. Правильный подход — разбить программу на маленькие кирпичики. Каждая SUB должна выполнять ровно одну задачу (принцип единственной ответственности). Имена процедур должны быть глаголами: DrawMenu, CalculateScore, SaveGame. Избегайте GOTO — это убивает структуру. Используйте циклы DO...LOOP и IF...THEN...ELSE. Пример правильной структуры: SUB Main CALL Initialize DO CALL ProcessInput CALL Update CALL Render LOOP UNTIL GameOver CALL Shutdown END SUB Это и есть каркас вашего фреймворка. Он напоминает игровой цикл, но подходит для любого приложения. 2. Управление состоянием: избегаем глобальных переменных Глобальные переменные в QBasic — это зло. Они доступны отовсюду, и любая процедура может их изменить. Это приводит к трудноотловимым багам. Решение — использовать общие блоки данных через COMMON SHARED или, что лучше, передавать параметры по ссылке. Для джуна важно понять: состояние программы должно быть инкапсулировано. Создайте один тип данных (например, TYPE PlayerState) и передавайте его в процедуры как параметр. TYPE Player X AS INTEGER Y AS INTEGER Health AS INTEGER END TYPE DIM SHARED CurrentPlayer AS Player SUB MovePlayer (P AS Player, DX AS INTEGER, DY AS INTEGER) P.X = P.X + DX P.Y = P.Y + DY END SUB Такой подход позволяет тестировать процедуры изолированно и не бояться, что кто-то случайно перезапишет чужую переменную. 3. Единая точка входа и инициализация Фреймворк должен иметь чёткую точку старта. В QBasic это обычно метка Main или первая строка кода. Проблема джуна в том, что он начинает писать код сразу, без плана. Правильно — создать процедуру Initialize, которая настраивает все параметры: экран, переменные, файлы. Сначала объявите все типы и константы. Затем вызовите Initialize для установки начальных значений. Только потом запускайте основной цикл. Это похоже на конструктор в ООП, но реализовано процедурно. Такой подход гарантирует, что вы не обратитесь к переменной до её инициализации. Практический пример: мини-фреймворк для игры Представьте, что вы пишете змейку. Без фреймворка код будет состоять из 500 строк с перемешанными выводами на экран и логикой. С фреймворком — из 5 модулей. Структура: Init.bas — настройка экрана и переменных. Input.bas — обработка нажатий клавиш. Logic.bas — движение змейки, проверка столкновений. Draw.bas — отрисовка всех объектов. Main.bas — связующий код, который вызывает остальные модули. Каждый модуль — это отдельный файл, который вы подключаете через '$INCLUDE. Это и есть ваш фреймворк. Он не универсален, но решает конкретную задачу и легко расширяется. Типичные ошибки джуна и как их избежать Первая ошибка — преждевременная оптимизация. Джуны пытаются написать универсальный движок, который решает все проблемы сразу. В итоге получается абстрактный код, который не работает ни для одной задачи. Начните с конкретной программы, а потом выделите общие части в процедуры. Вторая ошибка — игнорирование обработки ошибок. В QBasic нет try-catch, но есть ON ERROR GOTO. Используйте его в критических местах: чтение файлов, деление на ноль. Это часть фреймворка — защита от сбоев. Третья ошибка — отсутствие комментариев. Джуны считают, что код говорит сам за себя. Но в QBasic, где нет автодополнения и подсветки синтаксиса, комментарии — это единственный способ не запутаться. Пишите комментарии к каждой процедуре: что она делает,
08.08.2026
Сравнение фреймворков для Clipper: взгляд сеньора Когда речь заходит о Clipper, большинство современных разработчиков пожимают плечами. Однако для сеньора, заставшего эпоху DOS-приложений и миграции на Windows, эта тема — не археология, а практическая инженерия. Clipper (Summer'87, 5.x, а затем и его наследники вроде Clip, FlagShip, xBase++) — это не просто язык, а целая парадигма работы с данными. Сравнивать здесь «фреймворки» нужно не как React и Vue, а как слои абстракции над терминальным вводом-выводом и драйверами баз данных. Для сеньора критично понимать, что выбор фреймворка в 2026 году — это выбор стратегии поддержки легаси и цены миграции. Ключевые игроки на поле Clipper Прежде чем углубляться в сравнение, стоит разделить инструменты на три условные категории, потому что сравнивать их напрямую — методологическая ошибка. Для сеньора это разделение — база для принятия архитектурного решения. Классические библиотеки визуальных компонентов (например, FiveWin, Clip4Win) — это обёртки над Windows API, дающие окна, кнопки и гриды. Терминальные фреймворки (Say/Get, TBrowse, а также их расширенные версии вроде Jet.dll от Alaska Software) — работают в консоли, эмулируя текстовый интерфейс. Современные гибриды (xHarbour + HWGUI, или FlagShip с собственным рантаймом) — пытаются объединить скорость разработки на xBase с современными контролами. Сеньор должен понимать: выбор фреймворка здесь — это выбор уровня риска. Ни один из них не даст той плавности разработки, что даёт C# или Java. Но они дают то, что критично для бизнеса — сохранение бизнес-логики, написанной 20 лет назад. Сравнение по критериям для сеньора Ниже приведено сравнение по параметрам, которые важны не для новичка, а для архитектора, отвечающего за жизненный цикл системы. 1. Управление памятью и утечки Классический Clipper (до 5.3) использовал ручное управление памятью с пулами. Современные фреймворки (Harbour, xHarbour) имеют сборщик мусора, но он не детерминированный. FiveWin в этом плане капризен: при работе с объектами Windows (HWND) часто возникают утечки, если не вызывать Release() явно. HWGUI (построенный на Harbour) более предсказуем, но его сборщик мусора может «подвисать» при интенсивной работе с массивами. Для сеньора это означает, что нельзя полагаться на RAII или using-блоки — нужен строгий аудит кода на предмет освобождения ресурсов. 2. Работа с базами данных Это ахиллесова пята всех наследников Clipper. Родные драйверы (DBFNTX, DBFCDX) работают быстро, но не поддерживают современные транзакции на уровне сервера. FlagShip предлагает встроенную поддержку SQL через ODBC, но его реализация далека от идеала: курсоры часто «съезжают» при параллельном доступе. xHarbour с библиотекой RDD (Replaceable Database Drivers) позволяет подключать MySQL и PostgreSQL, но требует от сеньора глубокого понимания внутреннего устройства RDD, чтобы настроить пул соединений. В отличие от них, FiveWin для работы с SQL требует сторонних библиотек (например, FWH's ADO), что добавляет уровень сложности и непредсказуемости. 3. Модель событий и потоки Классический Clipper был однопоточным. Современные фреймворки пытаются добавить потоки, но делают это неуклюже. Harbour имеет нативную поддержку потоков (HB_THREAD), но работа с GUI из фоновых потоков — это боль. FiveWin требует, чтобы все обращения к контролам происходили в главном потоке, иначе — мгновенный краш. Clip4Win (более старый) вообще не имеет понятия потоков, что вынуждает сеньора использовать асинхронные паттерны на основе таймеров. Вывод: если ваша система требует реальной многопоточности (например, для фоновой обработки отчётов), ни один из этих фреймворков не даст вам удобной модели. Придётся писать костыли через внешние DLL. 4. Совместимость с современными API Здесь лидирует xHarbour в связке с HWGUI. Эта связка позволяет вызывать любые функции WinAPI напрямую, что даёт сеньору возможность интегрировать современные библиотеки (например, для работы с JSON или HTTP-запросами). FiveWin также предоставляет доступ к API, но его синтаксис перегружен макросами, что усложняет чтение кода. FlagShip — самый закрытый вариант: он компилируется в промежуточный код, и вызов нативных функций требует специальных обёрток, что снижает гибкость. Практические рекомендации для сеньора Если вы пришли в проект, где уже есть код на Clipper, не пытайтесь переписать всё на C#. Это экономически нецелесообразно. Вместо этого оцените, какой фреймворк позволит вам постепенно мигрировать. Мой опыт подсказывает, что оптимальным выбором для долгосрочной поддержки является Harbour + HWGUI. Причины: Harbour активно развивается, имеет открытый исходный код и поддерживает современные стандарты C++ (через компилятор MinGW). HWGUI предоставляет достаточно стабильный набор контролов, а его исходники доступны для модификации. Вы можете писать новые модули на C или C++ и вызывать их из Harbour, сохраняя старый код на Clipper нетронутым. В то же время, если проект заморожен и не требует новых фич, а бюджет ограничен — оставьте FiveWin на старой версии, но обязательно зафиксируйте окружение (виртуальная машина с Windows 7) и не пытайтесь обновлять библиотеку, так как это может сломать существующий код. Заключение Сравнение фреймворков для Clipper — это не выбор «лучшего», а выбор «наименее худшего» для конкретной бизнес-задачи. Сеньор должен трезво оценивать риски: ни один из этих инструментов не даст вам современного DX, но они дают возможность сохранить работающий бизнес-процесс. Гла
Открыть все статьи
bg_1
Остались вопросы? Задавайте их немедленно.
мы проконсультируем совершенно бесплатно