La codificación dura (también hard-coding o hardcoding ) es la práctica de desarrollo de software que consiste en incrustar datos directamente en el código fuente de un programa u otro objeto ejecutable, en lugar de obtener los datos de fuentes externas o generarlos en tiempo de ejecución .
Los datos codificados normalmente solo se pueden modificar editando el código fuente y volviendo a compilar el ejecutable, aunque se pueden cambiar en la memoria o en el disco usando un depurador o un editor hexadecimal .
Los datos codificados son más adecuados para piezas de información inmutables, como constantes físicas , números de versión y elementos de texto estáticos.
Por otro lado, los datos codificados suavemente codifican información arbitraria a través de la entrada del usuario , archivos de texto , archivos INI , respuestas del servidor HTTP, archivos de configuración, macros de preprocesador, constantes externas, bases de datos, argumentos de línea de comandos y se determinan en tiempo de ejecución.
La codificación rígida requiere que el código fuente del programa se modifique cada vez que cambien los datos de entrada o el formato deseado, cuando podría ser más conveniente para el usuario final cambiar los detalles por algún medio externo al programa. [1]
A menudo se requiere codificación rígida, pero también puede considerarse un antipatrón . [2] Es posible que los programadores no tengan una solución de interfaz de usuario dinámica para el usuario final, pero aún así deben entregar la función o lanzar el programa. Esto suele ser temporal, pero resuelve, en un sentido a corto plazo, la presión para entregar el código. Más tarde, se realiza una codificación blanda para permitir que un usuario pase parámetros que le brinden al usuario final una forma de modificar los resultados o el desenlace.
El término "hard-coded" se utilizó inicialmente como analogía a los circuitos cableados, y tenía la intención de transmitir la inflexibilidad que resulta de su uso dentro del diseño e implementación de software. En el contexto de los entornos de desarrollo colaborativo extensibles en tiempo de ejecución, como los MUD , hardcoding también se refiere al desarrollo del motor central del sistema responsable de las tareas de bajo nivel y la ejecución de scripts , a diferencia de softcoding , que es el desarrollo de los scripts de alto nivel que el sistema interpreta en tiempo de ejecución , con valores de fuentes externas, como archivos de texto , archivos INI , macros de preprocesador , constantes externas, bases de datos , argumentos de línea de comandos , respuestas de servidor HTTP , archivos de configuración y entrada de usuario . En este caso, el término no es peyorativo y se refiere al desarrollo general, en lugar de a la incrustación específica de datos de salida.
La codificación rígida de credenciales es una forma popular de crear una puerta trasera . Las credenciales codificadas rígidamente no suelen ser visibles en los archivos de configuración ni en la salida de los comandos de enumeración de cuentas y los usuarios no pueden cambiarlas ni eludirlas fácilmente. Si se descubre, un usuario podría desactivar dicha puerta trasera modificando y reconstruyendo el programa a partir de su código fuente ( si el código fuente está disponible públicamente ), descompilando o aplicando ingeniería inversa al software , editando directamente el código binario del programa o instituyendo una comprobación de integridad (como firmas digitales, antimanipulación y antitrampas ) para evitar el acceso inesperado, pero dichas acciones suelen estar prohibidas por un acuerdo de licencia de usuario final .
Como medida de gestión de derechos digitales , los desarrolladores de software pueden codificar directamente un número de serie único en un programa. O es habitual codificar una clave pública , creando el DRM para el cual no es factible crear un keygen.
En el caso opuesto, un cracker de software puede codificar un número de serie válido en el programa o incluso impedir que el ejecutable lo solicite al usuario, permitiendo que se redistribuyan copias no autorizadas sin necesidad de introducir un número válido, compartiendo así la misma clave para cada copia, si se ha codificado una.
Si un programa de Windows está programado para asumir que siempre se instala en C:\Archivos de programa\Nombre de la aplicación y alguien intenta instalarlo en una unidad diferente por razones de espacio u organización, es posible que no se instale o no se ejecute después de la instalación. Es posible que este problema no se identifique en el proceso de prueba, ya que el usuario promedio instala en la unidad y el directorio predeterminados y es posible que las pruebas no incluyan la opción de cambiar el directorio de instalación. Sin embargo, es recomendable que los programadores y desarrolladores no arreglen la ruta de instalación de un programa, ya que la ruta de instalación predeterminada depende del sistema operativo, la versión del SO y las decisiones del administrador del sistema . Por ejemplo, muchas instalaciones de Microsoft Windows usan la unidad C: como su disco duro principal , pero esto no está garantizado.
Hubo un problema similar con los microprocesadores en las primeras computadoras, que iniciaban la ejecución en una dirección fija en la memoria.
Algunos programas " protegidos contra copia " buscan un archivo en particular en un disquete o unidad flash al iniciar el sistema para verificar que no se trate de copias no autorizadas. Si se reemplaza el equipo por uno más nuevo, que no tiene unidad de disquete, el programa que la requiere no se puede ejecutar porque no se puede insertar el disquete.
Este último ejemplo muestra por qué la codificación rígida puede resultar poco práctica incluso cuando en el momento parece que funcionaría perfectamente. En los años 1980 y 1990, la gran mayoría de los ordenadores personales estaban equipados con al menos una unidad de disquete, pero las unidades de disquete dejaron de utilizarse más tarde. Un programa codificado de esa manera hace 15 años podría tener problemas si no se actualizaba.
Algunos sistemas operativos Windows cuentan con las denominadas carpetas especiales , que organizan los archivos de forma lógica en el disco duro. Pueden surgir problemas relacionados con la codificación rígida:
Algunos programas de Windows codifican de forma fija la ruta del perfil en ubicaciones definidas por el desarrollador, como . Esta es la ruta para la gran mayoría de Windows 2000 o posterior, pero esto causaría un error si el perfil se almacena en una red o se reubica de alguna otra manera. La forma correcta de obtenerlo es llamar a la función o resolver la variable de entorno. Otra suposición que los desarrolladores suelen hacer es suponer que el perfil se encuentra en un disco duro local.C:\Documents and Settings\Username
GetUserProfileDirectory
%userprofile%
Algunos programas de Windows codifican la ruta My Documents
como ProfilePath\My Documents
. Estos programas funcionarían en máquinas que ejecutan la versión en inglés, pero en las versiones localizadasMy Documents
de Windows esta carpeta normalmente tiene un nombre diferente. Por ejemplo, en las versiones italianas la carpeta se llama Documenti . My Documents
También es posible que se haya reubicado mediante la redirección de carpetas en la Política de grupo en Windows 2000 o posterior. La forma correcta de obtenerla es llamar a la SHGetFolderPath
función.
Una referencia indirecta, como una variable dentro del programa llamada "NombreDeArchivo", podría expandirse accediendo a una ventana de diálogo "Buscar archivo", y no sería necesario cambiar el código del programa si se moviera el archivo.
La codificación rígida es especialmente problemática a la hora de preparar el software para su traducción a otros idiomas.
En muchos casos, un único valor codificado de forma rígida, como el tamaño de una matriz, puede aparecer varias veces en el código fuente de un programa. Este sería un número mágico . Esto puede provocar comúnmente un error en el programa si se modifican algunas de las apariencias del valor, pero no todas. Este tipo de error es difícil de encontrar y puede permanecer en el programa durante mucho tiempo. Puede producirse un problema similar si se utiliza el mismo valor codificado de forma rígida para más de un valor de parámetro, por ejemplo, una matriz de 6 elementos y una longitud mínima de cadena de entrada de 6. Un programador puede cambiar por error todas las instancias del valor (a menudo utilizando la función de búsqueda y reemplazo de un editor) sin comprobar el código para ver cómo se utiliza cada instancia. Ambas situaciones se evitan definiendo constantes , que asocian nombres con los valores, y utilizando los nombres de las constantes para cada apariencia dentro del código.
Un caso importante de codificación rígida es cuando las cadenas se colocan directamente en el archivo, lo que obliga a los traductores a editar el código fuente para traducir un programa. (Existe una herramienta llamada gettext
que permite dejar las cadenas en los archivos, pero permite a los traductores traducirlas sin cambiar el código fuente; efectivamente elimina la codificación rígida de las cadenas).
En competiciones de informática como la Olimpiada Internacional de Informática , los concursantes deben escribir un programa con un patrón de entrada-salida específico según los requisitos de las preguntas.
En los casos excepcionales en los que el número posible de entradas es lo suficientemente pequeño, un concursante podría considerar la posibilidad de utilizar un enfoque que asigne todas las entradas posibles a sus salidas correctas. Este programa se consideraría una solución codificada de forma rígida, en lugar de una algorítmica (aunque el programa codificado de forma rígida podría ser el resultado de un programa algorítmico).
Softcoding es un término de codificación informática que se refiere a la obtención de un valor o una función de algún recurso externo, como archivos de texto , archivos INI , macros de preprocesador , constantes externas, archivos de configuración , argumentos de línea de comandos , bases de datos, entradas de usuario o respuestas de servidor HTTP. Es lo opuesto a hardcoding , que se refiere a la codificación de valores y funciones en el código fuente.
Evitar la codificación rígida de valores que se modifican con frecuencia es una buena práctica de programación. Los usuarios del software deberían poder personalizarlo según sus necesidades, dentro de lo razonable, sin tener que editar el código fuente del programa. De manera similar, los programadores cuidadosos evitan los números mágicos en su código para mejorar su legibilidad y facilitar el mantenimiento. Estas prácticas generalmente no se conocen como codificación blanda .
El término se utiliza generalmente cuando el softcoding se convierte en un antipatrón . Abstraer demasiados valores y características puede introducir más complejidad y problemas de mantenimiento que los que se experimentarían al cambiar el código cuando fuera necesario. El softcoding, en este sentido, apareció en un artículo en The Daily WTF . [3]
En el extremo extremo, los programas con código blando desarrollan sus propios lenguajes de programación mal diseñados e implementados, y archivos de configuración que requieren habilidades de programación avanzadas para editarlos. Esto puede llevar a la producción de utilidades para ayudar a configurar el programa original, y estas utilidades a menudo terminan siendo "codificadas de manera blanda".
El límite entre una configurabilidad adecuada y una codificación blanda problemática cambia con el estilo y la naturaleza de un programa. Los programas de código cerrado deben ser muy configurables, ya que el usuario final no tiene acceso al código fuente para realizar cambios. El software interno y el software con distribución limitada pueden ser menos configurables, ya que la distribución de copias modificadas es más sencilla. Las aplicaciones web personalizadas suelen ser mejores con una configurabilidad limitada, ya que alterar los scripts rara vez es más difícil que alterar un archivo de configuración.
Para evitar la codificación blanda, considere el valor para el usuario final de cualquier flexibilidad adicional que proporcione y compárelo con la mayor complejidad y los costos de mantenimiento continuos relacionados que implica la configurabilidad adicional.
Existen varios patrones de diseño legítimos para lograr la flexibilidad que el softcoding intenta proporcionar. Una aplicación que requiera más flexibilidad de la que es apropiada para un archivo de configuración puede beneficiarse de la incorporación de un lenguaje de programación . En muchos casos, el diseño adecuado es un lenguaje específico del dominio integrado en un lenguaje de programación establecido. Otro enfoque es trasladar la mayor parte de la funcionalidad de una aplicación a una biblioteca, lo que proporciona una API para escribir aplicaciones relacionadas rápidamente.