Net-Base Revista

14.07.2026

Refactoritzar codi legacy a Delphi: reduir riscos, augmentar la mantenibilitat, garantir la continuïtat operativa

Les aplicacions Delphi evolucionades sovint són crítiques per al negoci — però cada petit canvi s'encareix. Aquest article mostra com refactoritzar codi legacy en Delphi sense posar en risc l'explotació: amb una avaluació clara de l'estat, mesures prioritzades, proves, dades i...

14.07.2026

Del tema de la revista a la pràctica del projecte

Pàgines de serveis i tècniques pertinents per a l'article

Video-Botschaft

Refactoritzar codi legacy a Delphi: reduir riscos, augmentar la mantenibilitat, garantir la continuïtat operativa

Kurze Einordnung, warum kontrolliertes Refactoring bei geschäftskritischen Delphi-Systemen Betriebssicherheit und Änderungsfähigkeit verbessert, ohne einen riskanten Rewrite zu starten.

Video mit KI erstellt

Transkript anzeigen

Hallo. Kurz ein Thema, das im Betrieb schnell teuer wird.

Der Beitrag heißt: „Legacy-Code in Delphi refactoren: Risiken senken, Wartbarkeit erhöhen, Betrieb sichern“. Wenn jede kleine Änderung ein potenzieller Ausfall ist, werden Releases langsam, und niemand fasst das System gern an.

Legacy heißt hier nicht nur „alt“. Es heißt: schwer erklärbar, stark verknüpft, und dadurch riskant.

Refactoren bedeutet: umbauen, ohne das Verhalten zu ändern. Also kein Rewrite, sondern ein kontrollierter Umbau am fahrenden System.

Wichtig für Admins und IT-Leitung ist die Reihenfolge: erst Bestandsaufnahme. Was ist geschäftskritisch?

Wo hängen Datenbank, Schnittstellen und Jobs dran? Dann kleine, priorisierte Schritte, abgesichert durch Tests und sauberes Logging, damit Fehler auffallen, bevor Nutzer sie melden.

Wenn Sie dazu Fragen haben, schauen wir es gern gemeinsam an.

Qui opera una aplicació crítica per al negoci Delphi coneix el camp de tensions: funciona de manera estable, modela processos clau i està profundament integrada amb bases de dades, interfícies i fluxos de treball. Al mateix temps, l’esforç de canvi i el risc augmenten amb cada release, perquè al llarg dels anys s’han acumulat compromisos, casos especials i dependències. Precisament aquí s’intervé amb un Refactoritzar codi legacy en Delphi: no com un projecte de “Rewrite”, sinó com una reestructuració controlada en un sistema en funcionament — amb efectes mesurables sobre la mantenibilitat, la seguretat dels releases i l’operació.

En la pràctica, el refactoring rarament fracassa per culpa de Delphi en si, sinó per falta de transparència: què és crític des del punt de vista funcional? On hi ha deutes tècnics (és a dir, defectes estructurals que encareixen canvis posteriors)? Quines parts es poden tocar en finestres de manteniment i quines no? I com s’evita que el “netejar” generi nous errors o problemes de rendiment en producció? Aquest article descriu un enfocament pràctic que acompanya la direcció d’IT i l’administració: des de la presa d’estat fins a temes d’arquitectura i dades, passant per proves, procés de release i qüestions de seguretat.

Què significa realment «Legacy» en projectes Delphi?

Sovint s’associa «Legacy» amb «antic». En el context empresarial, però, el codi legacy és principalment codi amb un alt risc de canvi i amb un comportament només parcialment explicable. Això pot ser una aplicació VCL (Visual Component Library, UI d’escriptori clàssica Windows), però també un servei, un planificador o un sistema client‑servidor.

Les característiques típiques del legacy en entorns Delphi són:

  • Forta acoblació: la interfície, l’accés a dades i la lògica de negoci estan mesclats; els canvis provoquen efectes secundaris.
  • Regles implícites: la lògica funcional està dins d’esdeveniments, variables globals o triggers de base de dades, no en mòduls clars.
  • Accés a dades obsolet: p. ex. BDE (Borland Database Engine) o components propietaris; manca d’estratègies de pooling/timeout.
  • Gestió d’errors inconsistent: s’empassen excepcions, els missatges no arriben al registre central.
  • Fragilitat en build i release: dependències, problemes de rutes, configuracions de compilador diferents, treballs manuals posteriors.
  • Manca de proves: el coneixement està en els caps de les persones o en la ’seqüència de clics‘ d’usuaris experimentats.

Important: el codi legacy no és automàticament «dolent». Sovint és resultat de pressió de temps, cicles tecnològics i decisions pragmàtiques. El refactoring és llavors una inversió en la controlabilitat — des del punt de vista de l’operació, la seguretat, el compliment i la velocitat de canvi.

Refactoring vs. Rewrite: què canvia per a l’operació i el risc

Un Rewrite (reescriptura/Neuentwicklung) promet un punt de partida net, però sovint comporta llargues fases paral·leles, noves classes d’errors i alts riscos de migració. El refactoring, en canvi, busca la millora incremental mantenint la capacitat de lliurament continu. Per a l’operació d’IT i les àrees funcionals, sovint aquesta és la diferència decisiva: el sistema continua productiu i les millores s’entreguen en paquets manejables.

Diferenciació pràctica:

  • Refactorització: s’améliora l’estructura; el comportament extern ha de romandre igual. Foc: mantenibilitat, testabilitat, estabilitat, reserves de rendiment.
  • Reestructuració/Modernització: a més, canvis de comportament dirigits, p. ex. noves interfícies, nova base de dades, nous objectius de plataforma.
  • Reescriptura: nova base de codi, normalment nova UI/arquitectura; requereix migració de dades, processos, interfícies – sovint „Big Bang“ o una llarga fase de transició.

Per als decisors, el punt és central: la refactorització no és un fi en si mateixa, sinó una palanca per reduir els riscos de canvi. Això és immediatament rellevant per a l’explotació quan l’aplicació afecta processos 24/7, fluxos propers a la producció o portals orientats al client.

Refactoritzar codi llegat en Delphi: començament amb una avaluació fiable de l’estat

El primer pas no és una eina, sinó una visió comuna sobre riscos i objectius. Sense aquesta visió, la refactorització ràpidament es transforma en «anem a fer neteja aquí» – i precisament això és difícil de justificar en explotació.

1) Avaluar la criticitat i la realitat d’explotació

Documenteu quines parts són realment crítiques per al negoci: tancament diari, interfícies amb ERP/DMS/CRM, captura de dades de producció, facturació, gestió de drets. Complementeu amb paràmetres d’explotació: finestres de manteniment, possibilitats de rollback, monitorització, volum de dades, requisits de latència.

Preguntes útils:

  • Quines funcionalitats han de continuar funcionant fins i tot en cas d’aturades parcials (capacitat de degradació)?
  • On hi ha punts únics de fallada (p. ex. un planificador central)?
  • Quines dades són sensibles des del punt de vista regulatori o de protecció de dades?
  • Quines integracions són les més propenses a fallades (imports de fitxers, TCP/IP, SOAP/REST, missatgeria)?

2) Fer visibles els deutes tècnics — no només l’estil de codi

En projectes Delphi els deutes tècnics sovint són d’abast arquitectònic: estats globals, dependències unitàries cícliques, accessos a dades difícils de provar o esdeveniments d’UI que fan d’«orquestració». Les mètriques (p. ex. complexitat, mida de les unitats, gràfic de dependències) ajuden, però només són valuoses si es tradueixen en mesures.

Un esquema pràctic és una anàlisi 2×2:

  • Freqüentment modificat i arriscat: màxima prioritat per a la refactorització.
  • Freqüentment modificat i poc arriscat: millorar processos i proves, mesures estructurals menors.
  • Rarament modificat i arriscat: estabilització/assegurament (proves, registre), no és imprescindible „fer-ho bonic“.
  • Rarament modificat i poc arriscat: deixar-ho deliberadament com està.

3) Inventariar dependències: dades, interfícies, temps d’execució

Per a administració i responsables de projecte és clau saber què depèn fora del codi: backends de base de dades, ODBC/OLE DB, comparticions de fitxers, canals d’impressió i PDF, COM/ActiveX, automatització d’Office, Windows-serveis, tasques programades, certificats, configuracions de proxy.

Aquí els costos de refactorització sovint s’originen de manera indirecta: un canvi «petit» pot exigir nova lògica d’instal·lador, nous drets o noves regles de tallafocs. Aquests efectes secundaris s’han de documentar aviat en un mapa tècnic.

Zones problemàtiques típiques en codi llegat Delphi i com abordar-les de manera dirigida

La refactorització es torna manejable quan s’aplica a patrons recurrents. Els àmbits següents solen ser, a la pràctica, els majors factors de risc i cost.

Forms monolítics: quan la UI manté el sistema unit

Moltes aplicacions VCL han crescut històricament «Form-driven»: el formulari carrega dades, comprova regles, escriu de nou, activa informes i actualitza altres pantalles. Això funciona — fins que hi intervenen diversos equips o anys d’historial de canvis.

Una via provada en operacions és alleugerir pas a pas la UI:

  • Serveis propers al cas d’ús introduir: operacions de negoci com a mètodes amb noms clars en lloc de cadenes d’esdeveniments.
  • Encapsular l’accés a dades: consultes/transaccions no en esdeveniments de la UI, sinó en capes d’accés a dades.
  • DTOs/models (objectes de dades simples) utilitzar per separar l’estat del formulari i l’estat de la base de dades.

L’objectiu no és la «puresa del patró», sinó una millor testabilitat i menys efectes secundaris: un canvi en la validació o en el càlcul no hauria de posar en risc tota la seqüència de clics de la UI.

Modernitzar l’accés a dades: BDE substituir, FireDAC utilitzar de manera consistent

Si encara s’utilitza BDE o components de dades incoherents, el refactoring sovint és també una modernització del risc operatiu. BDE no és només antic, sinó sovint difícil d’operar: controladors, configuració, dependències de 32 bits i manca de mecanismes de seguretat moderns.

BDE-substitució amb connexió nativa (la biblioteca moderna d’accés a dades de Delphi) és en molts escenaris un estàndard raonable si es treballa de manera consistent: paràmetres de connexió unificats, límits clars de transacció, timeouts, pooling i un maneig net d’excepcions. Mesures típiques de refactoring en aquest àmbit:

  • Unificar la gestió de connexions: factoría/proveïdor central en lloc de „cada formulari té la seva connexió“.
  • Fer explícites les transaccions: Begin/Commit/Rollback com a part del cas d’ús, no ocultes a la UI.
  • Utilitzar consultes parametritzades de manera conseqüent per reduir riscos d’injecció SQL i problemes de caràcters especials.
  • Definir timeouts i reintents perquè bloquejos a la xarxa no condueixin a pantalles „congelades“.

Per a l’explotació TI és important que les noves estratègies de connexió estiguin coordinades amb l’operació de la base de dades (p. ex. connexions màximes, mida dels pools, gestió de deadlocks, finestres de manteniment per a canvis d’esquema).

Dependències entre unitats i «estats globals» com a causa principal d’efectes secundaris

Delphi-units amb grans seccions d’interfície, moltes entrades Uses i Singletons globals són acceleradors típics d’efectes secundaris. Un petit canvi en una unitat desencadena cadenes de rebuild o trenca seqüències d’inicialització ocultes.

Passos pragmàtics que funcionen en projectes legacy:

  • Establir direccions de dependència: p. ex. UI → Serveis d’aplicació → Domini/Lògica → Accés a dades → Infraestructura.
  • Centralitzar la inicialització: una seqüència d’arrencada clara en lloc d’utilitzar la inicialització de unitats com a control ocult.
  • Reduir variables globals: mantenir l’estat en objectes, aclarir la durada de vida i la propietat.

Això contribueix a la estabilitat: si l’arrencada és determinista, les fallades després d’actualitzacions o canvis de configuració són més manejables.

Threading i sincronització: estabilitat abans que «optimització de rendiment»

Moltes aplicacions legacy esdevenen concurrents amb el temps: imports en segon pla, polling, comunicació amb dispositius, processament paral·lel. Sense regles clares apareixen deadlocks, penjaments de la UI o race conditions (conflictes d’accés per execució simultània).

Per a l’operació i el suport això és un problema, perquè sovint genera errors «no reproduïbles». El refactoring hauria d’apuntar aquí a estàndards:

  • Responsabilitat clara per a Threads/Tasks i apagada definida (per evitar que les actualitzacions/aturada es bloquegin).
  • Logging per Worker amb una Korrelations-ID, per poder seguir els fluxos.
  • Minimitzar la sincronització i encapsular estrictament els accessos a la UI (regla del UI-Thread).

Si voleu aprofundir-hi, és convenient col·locar un enllaç intern a un article sobre patrons robustos amb TThread i Synchronize, perquè el tema sovint és el coll d’ampolla per a l’estabilitat en el refactoring de sistemes legats.

Objectiu arquitectònic: Layering com a eina, no com a dogma

Un objectiu pràctic per a moltes Delphi-solucions existents és una estructura clara per capes (sovint entesa com a „3 capes“): presentació (UI), lògica d’aplicació (Use Cases/Services) i accés a dades (Repositories/DAO). La perspectiva operativa és important: el layering facilita proves, actualitzacions i l’anàlisi posterior per desacoblar interfícies.

Avantatges concrets per a les empreses:

  • Afegir interfícies (p. ex. REST-API), sense que calgui copiar la lògica de la UI.
  • Modernització parcial: el canvi de base de dades o la migració a BDE-Ablosung mit nativer Anbindung es pot concentrar en una sola capa.
  • Manteniment: els errors es poden acotar més ràpid perquè les responsabilitats al codi són més clares.

Una visió objectiu realista té en compte que els sistemes legats rarament esdevenen „purs“. El crític és que la direcció sigui correcta i que els canvis nous no desfacin l’estructura.

Estratègia de proves per al Delphi-refactoring: Com congelar el comportament abans de reestructurar

Fer refactoring sense proves és un risc en sistemes crítics per al negoci. Alhora, una automatització completa de proves sovint no és realista a curt termini. La idea central és, per tant: provar de manera selectiva on el risc i la pressió de canvi són elevats.

Golden Master i regressió: pràctic per a sistemes legats

Un „Golden Master“ és una referència del comportament actual: s’enregistren entrades i sortides esperades per detectar desviacions després de canvis. Això és útil per a informes, càlculs, exportacions, canals d’importació o respostes d’interfícies.

Important per a l’operació: les proves Golden-Master redueixen el risc que els efectes secundaris apareguin només després del rollout — i faciliten decisions ràpides de hotfix perquè la desviació és mesurable de forma concreta.

Proves d’integració al voltant de la base de dades i les interfícies

Molt sovint els errors no es generen en la lògica de negoci pura, sinó als límits del sistema: transaccions, encoding (p. ex. Unicode), marques de temps, separadors decimals, permisos, interferències de xarxa. Les proves d’integració haurien de cobrir com a mínim els punts següents:

  • Comportament de transacció en cas d’errors (rollback, actualitzacions parcials, bloquejos).
  • Codificació en import/export (CSV, XML, JSON), especialment amb caràcters especials.
  • Perfils de rendiment per a volums de dades típics, per detectar degradacions progressives.

Els casos de prova manuals continuen sent necessaris — però estructurats

On falta automatització (encara), els plans de prova manuals estructurats vinculats a les releases són útils. Des de la perspectiva d’administració és rellevant que els casos de prova també abordin aspectes operatius: ruta d’instal·lació/actualització, permisos, configuració, registre/monitoratge, impressora/PDF, rutes de xarxa.

Dades i migració: el refactoring sovint es decideix segons l’esquema

En els sistemes Delphi les estructures de la base de dades han crescut al llarg d’anys. El refactoring sovint topa amb taules «històriques», camps duplicats o columnes sobrecarregades funcionalment. El punt crític: els canvis d’esquema afecten l’operació, la còpia de seguretat i restauració, la replicació, els informes i les interfícies.

Fer planificables els canvis d’esquema

Un enfoc provat és utilitzar migracions de base de dades clarament versionades: cada canvi d’esquema es documenta com a pas reproduïble, inclosa una estratègia de rollback. Encara que les migracions s’executin inicialment de manera manual, la disciplina és decisiva: res de «ho canviem ràpid a producció».

Per garantir la seguretat del lliurament cal definir:

  • Necessitat de temps d’inactivitat: migració en línia possible o finestra de manteniment necessària?
  • Estratègia de reversió: compatibilitat de dades en cas de rollback, còpies de seguretat abans de la migració, pla de reinici.
  • Fase de compatibilitat: l’aplicació pot operar durant un període de transició amb l’esquema antic i el nou (p. ex. columnes addicionals, vistes).

No subestimeu la qualitat de les dades i la seva neteja

Un refactoring sovint posa al descobert problemes de dades que abans «navegaven amb el corrent»: valors invàlids, inconsistències, claus externes inexistents. Aquí és important decidir des del punt de vista funcional què és correcte. Des del punt de vista tècnic, l’aplicació hauria de validar de manera més estricta en el futur i registrar els errors de forma rastrejable en comptes de corregir-los silenciosament.

Incorporar interfícies sense desestabilitzar el sistema legacy

Molt sovint les empreses refactoritzen els sistemes Delphi existents perquè nous requisits forcen integracions: portals, BI, processos mòbils, connexions amb socis. L’error més habitual és alimentar les interfícies directament des de la lògica de la UI o «en algun lloc del codi». És preferible ubicar les interfícies en una capa de serveis consolidada que es creï durant el refactoring.

Quan s’afegeix una API REST (Representational State Transfer, API web habitual via HTTP/JSON), des del punt de vista operatiu i de seguretat són especialment importants:

  • AuthN/AuthZ: separar clarament autenticació i autorització; p. ex. tokens, SAML 2.0 en l’àmbit d’un SSO corporatiu, models de rol clars.
  • Rate Limits i Timeouts: perquè les crides externes no bloquegin el backend.
  • Versionament: definir versions d’API per no trencar els clients amb cada canvi.
  • Observability: logs estructurats, IDs de correlació, mètriques (taxes d’errors, latències).

Un enllaç intern a un article que aprofundeixi en l’afecció d’una API REST per a software existent encaixaria bé aquí, perquè les interfícies en projectes de modernització rarament són un «Add-on», sinó un producte operatiu propi.

Seguretat i compliance: el refactoring com a oportunitat per tancar llacunes de seguretat

Legacy sovint significa que les suposicions de seguretat són més antigues que l’actual paisatge d’amenaces. Durant el refactoring cal, com a mínim, comprovar si el sistema necessita ajustos en els següents punts:

  • Credencials i secrets: no posar contrasenyes en fitxers INI ni en el codi; emmagatzematge segur i rotació.
  • Xifrat del transport: TLS per a les interfícies, gestió adequada de certificats.
  • Principi de mínims privilegis: usuaris de base de dades i permisos de fitxers tan reduïts com sigui possible; rols separats per lectura/escriptura/administració.
  • Auditierbarkeit: canvis rastrejables en dades crítiques (Qui? Què? Quan?), sense convertir les dades de registre en un problema de protecció de dades.
  • Per a la direcció d’IT aquest és un benefici empresarial central: el refactorització no només redueix els costos de manteniment, sinó que pot disminuir els riscos de seguretat i d’auditoria si s’implementa de manera estructurada.

    Release- und Betriebsprozess: Ohne saubere Pipeline wird Refactoring teuer

    Molts projectes legacy Delphi pateixen menys pel codi i més pel procés: les build difereixen segons la workstation, els releases són manuals i els errors no es poden rastrejar netament. Per això el refactorització hauria d’estabilitzar també el procés de lliurament.

    Build-Reproduzierbarkeit und Konfigurationsmanagement

    Des del punt de vista de l’administració i de les auditories és important que un release sigui reproducible: mateixes fonts, mateixes versions de compilador/llibreries, mateixes dependències. Això inclou configuracions clarament separades per a desenvolupament, proves i producció (p. ex. punts finals de la base de dades, nivell de registre, feature flags).

    Logging, Monitoring und Supportfähigkeit

    «Ha passat alguna cosa» no és suficient en explotació. El refactorització és una bona oportunitat per establir un registre unificat: entrades de registre estructurades, codis d’error inequívocs, context (usuari, tenant, ordre, interfície) i una separació clara entre errors tècnics i validacions funcionals.

    Per a processos amb operació 24/7 són addicionalment recomanables:

    • Health Checks (p. ex. connexió a la base de dades, acumulació a la cua, consum de memòria),
    • Alarmierung segons la gravetat,
    • Runbooks per a la reinicialització i per a incidències típiques.

    Ein praxistauglicher Refactoring-Fahrplan in 6 Schritten

    Per evitar que el refactorització es perdi en l’operativa diària, ajuda un full de ruta clar, compatible amb els cicles de llançament. Un procediment provat:

    1. Risikound Änderungslandkarte erstellen (Module, Schnittstellen, Daten, Betrieb).
    2. Schutznetz spannen: estàndard de registre, primeres proves de regressió/Golden-Master per a rutes crítiques.
    3. Architekturtrennlinien einziehen: capa de servei i encapsulament d’accés a dades com a “nova normalitat” per als canvis.
    4. Hotspots refactoren: els mòduls que es canvien amb freqüència i provoquen fallades (utilitzar estadístiques d’errors i historial de canvis).
    5. Datenzugriff konsolidieren: FireDAC/transaccions/temps d’espera unificats, mesurar el rendiment, comprovar deadlocks.
    6. Modernisierungspfade öffnen: interfícies (REST), qüestions de plataforma (Unicode/64-Bit), modernització progressiva de la UI on sigui raonable.

    El nucli és l’ordre: primer transparència i garanties, després mesures estructurals i finalment reformes més grans. Així la solució es manté entregable i operativament estable.

    Wann Refactoring nicht reicht: Signale für eine größere Modernisierung

    Hi ha situacions en què la simple refactorització no resol el coll d’ampolla. Senyals típics:

    • Technologische Sackgassen: controladors de base de dades ja no suportats, components no parchejables, dependències estrictes de 32 bits.
    • Architektur passt nicht mehr: per exemple, l’aplicació ha de funcionar com un entorn de serveis, però tot està centrat en la UI.
    • Skalierung und Verfügbarkeit: requisits de multitenència, alta disponibilitat o accés remot que només es poden satisfer amb canvis estructurals.
    • Sicherheitsanforderungen: autenticació/SSO, auditoria, xifrat que no es poden incorporar sense una reforma més àmplia.

    Fins i tot així, el refactoring sovint és un component raonable: crea ordre per desacoblar parts de manera selectiva, en lloc de substituir tot el sistema d’una sola vegada.

    Conclusió: Refactoring com a responsabilitat tècnica durant l’explotació

    Refactorar el codi legacy en Delphi és sobretot una qüestió de priorització, gestió de riscos i proximitat operativa. Si comenceu amb una avaluació fiable de l’estat, assegureu els punts crítics, consolideu l’accés a dades i les línies de separació d’arquitectura i orienteu les proves i el registre (logging) cap als camins crítics, el „netejament“ esdevé un projecte de modernització controlable. El resultat no és només codi més llegible, sinó un sistema que es pot operar de forma més fiable, modificar amb més seguretat i integrar amb més facilitat.

    Si voleu estabilitzar o modernitzar de manera estructurada la vostra solució existent Delphi, estarem encantats d’aclarir conjuntament la situació inicial, els riscos i un camí realista de refactoring:

    En l’àmbit tècnic, també juguen un paper important la Delphi Modernisierung i el Delphi Refactoring quan cal que les integracions, els fluxos de dades i el desenvolupament continu interaccionin de manera neta.

    Parlar d’un projecte o d’un pla de modernització amb Net-Base.

    Pas següent

    Quan d'un tema se'ndevé un projecte real, s'han de considerar aviat i de manera conjunta l'arquitectura, els actius existents i l'operació.

    No només donem suport en qüestions puntuals, sinó també quan, a partir de fragments de codi font, temes de sistemes heredats o idees de portal, ha de sorgir un projecte empresarial sòlid.

    • L'estat actual, la visió objectiu i els riscos tècnics s'avaluen conjuntament.
    • REST, accés a dades, portals i desplegament no es posposaran com a efectes retardats.
    • Veu aviat quin camí és viable des del punt de vista econòmic i operatiu.

    Comparteix la publicació

    Comparteix aquesta publicació directament

    LinkedIn, X, XING, Facebook, WhatsApp i correu electrònic estan disponibles immediatament. Per Instagram preparem l'enllaç i un text curt immediatament.

    Correu electrònic

    Instagram s'obre en una pestanya nova. L'enllaç i el text curt es copien prèviament al porta-retalls.