Articulo de referencia

Codificación fija

La codificación fija es una 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...

La codificación fija es una 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 de forma fija normalmente solo se pueden modificar editando el código fuente y recompilando el ejecutable, aunque se pueden cambiar en la memoria o en el disco utilizando un depurador o un editor hexadecimal .

Los datos codificados de forma fija son los más adecuados para información que no cambia, como constantes físicas , números de versión y elementos de texto estáticos.

Por otro lado, los datos codificados de forma flexible 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 del preprocesador, constantes externas, bases de datos, argumentos de la línea de comandos , y se determinan en tiempo de ejecución.

Descripción general

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 ]

La codificación rígida suele ser necesaria, 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 aun así deben entregar la funcionalidad o lanzar el programa. Esto suele ser temporal, pero alivia, a corto plazo, la presión por entregar el código. Posteriormente, se realiza la codificación flexible para permitir que el usuario pase parámetros que le den al usuario final una forma de modificar los resultados.

El término "hard-coding" se utilizó inicialmente como analogía del cableado de circuitos y pretendía transmitir la inflexibilidad que resulta de su uso en el diseño e implementación de software. En el contexto de entornos de desarrollo colaborativos extensibles en tiempo de ejecución, como los MUD , hard-coding también se refiere al desarrollo del motor principal del sistema responsable de las tareas de bajo nivel y la ejecución de scripts , a diferencia de soft-coding , que consiste en desarrollar 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 servidores HTTP , archivos de configuración y entrada de usuario . En este caso, el término no es peyorativo y se refiere al desarrollo en general, en lugar de específicamente a la incrustación de datos de salida.

Puertas traseras

La codificación fija de credenciales es una forma común de crear una puerta trasera . Estas credenciales 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 deshabilitar dicha puerta trasera modificando y recompilando el programa a partir de su código fuente ( si este está disponible públicamente ), descompilando o aplicando ingeniería inversa al software , editando directamente el código binario del programa o implementando una verificación de integridad (como firmas digitales, protección contra manipulaciones y sistemas antitrampas ) para evitar el acceso inesperado; sin embargo, estas acciones suelen estar prohibidas por el acuerdo de licencia de usuario final .

Gestión de derechos digitales

Como medida de gestión de derechos digitales (DRM), los desarrolladores de software pueden incluir un número de serie único directamente en el programa. También es común incluir una clave pública , creando así un DRM para el cual resulta inviable generar un generador de claves.

En el caso contrario, un pirata informático puede codificar un número de serie válido en el programa o incluso impedir que el ejecutable se lo solicite al usuario, lo que permite redistribuir copias no autorizadas sin necesidad de introducir un número válido, compartiendo así la misma clave para cada copia, si esta ha sido codificada.

Ruta de instalación corregida

Si un programa de Windows está programado para instalarse siempre en C:\Archivos de programa\Nombre de la aplicación y alguien intenta instalarlo en una unidad diferente por motivos de espacio u organización, es posible que falle la instalación o la ejecución. Este problema podría no detectarse durante las pruebas, ya que el usuario promedio instala en la unidad y el directorio predeterminados, y las pruebas podrían no incluir la opción de cambiar el directorio de instalación. Sin embargo, es recomendable que los programadores y desarrolladores no fijen la ruta de instalación de un programa, ya que la ruta de instalación predeterminada depende del sistema operativo, la versión del sistema operativo y las decisiones del administrador del sistema . Por ejemplo, muchas instalaciones de Microsoft Windows utilizan la unidad C: como disco duro principal , pero esto no está garantizado.

En los primeros ordenadores, existía un problema similar con los microprocesadores , que iniciaban la ejecución en una dirección fija de la memoria.

Disco de arranque

Algunos programas protegidos contra copia buscan un archivo específico en un disquete o unidad flash al iniciarse para verificar que no sean copias no autorizadas. Si se reemplaza la computadora por una más moderna que no tiene unidad de disquete, el programa que la requiere ahora no se puede ejecutar, ya que no se puede insertar el disquete.

Este último ejemplo demuestra por qué la codificación fija puede resultar poco práctica, incluso cuando en su momento parece que funcionaría a la perfección. En las décadas de 1980 y 1990, la gran mayoría de los ordenadores personales contaban con al menos una disquetera, pero estas unidades cayeron en desuso. Un programa codificado de esa manera hace 15 años podría presentar problemas si no se actualiza.

Carpetas especiales

Algunos sistemas operativos Windows tienen las llamadas carpetas especiales que organizan los archivos de forma lógica en el disco duro. Pueden surgir problemas relacionados con la codificación fija:

Ruta del perfil

Algunos programas de Windows codifican la ruta del perfil en ubicaciones definidas por el desarrollador, como . Esta es la ruta para la gran mayoría de Windows 2000 o superior , pero causaría un error si el perfil está almacenado en una red o se reubica de 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 que el perfil está ubicado en un disco duro local.C:\Documents and Settings\UsernameGetUserProfileDirectory%userprofile%

Ruta de la carpeta Mis documentos

Algunos programas de Windows codifican la ruta a My Documentscomo ProfilePath\My Documents. Estos programas funcionarían en máquinas que ejecutan la versión en inglés, pero en versiones localizadas de Windows esta carpeta normalmente tiene un nombre diferente. Por ejemplo, en las versiones italianas la carpeta se llama Documenti . también puede haberse reubicado usando la redirección de carpetas en la directiva de grupo en Windows 2000 o posterior. La forma correcta de obtenerlo es llamar a la función.My DocumentsMy DocumentsSHGetFolderPath

Solución

Una referencia indirecta, como una variable dentro del programa llamada "FileName", podría expandirse accediendo a una ventana de diálogo "buscar archivo", y no sería necesario modificar el código del programa si el archivo se moviera.

La codificación rígida resulta especialmente problemática a la hora de preparar el software para su traducción a otros idiomas.

En muchos casos, un único valor fijo, como el tamaño de un array, puede aparecer varias veces en el código fuente de un programa. Esto se conoce como un número mágico . Si se modifican algunas de las apariciones del valor, pero no todas, esto puede provocar un error en el programa. Dicho error es difícil de encontrar y puede permanecer en el programa durante mucho tiempo. Un problema similar puede ocurrir si se utiliza el mismo valor fijo para más de un parámetro, por ejemplo, un array 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 buscar y reemplazar del editor) sin revisar el código para ver cómo se utiliza cada instancia. Ambas situaciones se evitan definiendo constantes , que asocian nombres a los valores, y utilizando los nombres de las constantes para cada aparición en el código.

Un ejemplo importante de codificación rígida se da cuando las cadenas se insertan directamente en el archivo, lo que obliga a los traductores a editar el código fuente para traducir un programa. (Existe una herramienta gettextque permite dejar las cadenas en los archivos, pero que facilita a los traductores la traducción sin modificar el código fuente; en la práctica, elimina la codificación rígida de las cadenas).

competiciones de informática

En competiciones informáticas como la Olimpiada Internacional de Informática , los participantes deben escribir un programa con un patrón específico de entrada-salida según los requisitos de las preguntas.

En casos excepcionales donde el número de entradas posibles es suficientemente pequeño, un concursante podría considerar usar un método que asigne todas las entradas posibles a sus salidas correctas. Este programa se consideraría una solución codificada, a diferencia de una algorítmica (aunque el programa codificado podría ser el resultado de un programa algorítmico).

Codificación suave

La codificación flexible es un término de programación que se refiere a la obtención de un valor o función a partir 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, entrada de usuario o respuestas de servidores HTTP. Es lo opuesto a la codificación rígida, que se refiere a la codificación de valores y funciones en el código fuente.

Práctica de programación

Evitar la codificación fija 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. Del mismo modo, 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 denominan codificación flexible .

El término se usa generalmente cuando la codificación flexible 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 modificar el código cuando sea necesario. La codificación flexible, en este sentido, fue mencionada en un artículo de The Daily WTF . [ 3 ]

Problemas potenciales

En el extremo opuesto, los programas con código flexible desarrollan sus propios lenguajes de scripting mal diseñados e implementados, y archivos de configuración que requieren conocimientos avanzados de programación para su edición. Esto puede dar lugar a la creación de utilidades para facilitar la configuración del programa original, y estas utilidades a menudo terminan siendo también código flexible.

La línea que separa la configurabilidad adecuada de la codificación problemática varía según el estilo y la naturaleza del programa. Los programas de código cerrado deben ser altamente configurables , ya que el usuario final no tiene acceso al código fuente para realizar cambios. El software interno y el de distribución limitada pueden ser menos configurables, puesto que distribuir copias modificadas es más sencillo. Las aplicaciones web personalizadas suelen funcionar mejor con una configurabilidad limitada, ya que modificar los scripts rara vez es más difícil que modificar un archivo de configuración.

Para evitar la codificación blanda, considere el valor que aporta al usuario final cualquier flexibilidad adicional que usted proporcione y compárelo con la mayor complejidad y los costes de mantenimiento continuos relacionados que implica la configurabilidad añadida.

Lograr flexibilidad

Existen varios patrones de diseño válidos para lograr la flexibilidad que busca la codificación flexible. Una aplicación que requiere mayor flexibilidad que la que ofrece un archivo de configuración puede beneficiarse de la incorporación de un lenguaje de scripting . En muchos casos, el diseño adecuado consiste en un lenguaje específico de dominio integrado en un lenguaje de scripting ya establecido. Otro enfoque es trasladar la mayor parte de la funcionalidad de una aplicación a una biblioteca, proporcionando una API para aplicaciones de escritura de forma rápida.

Véase también

Referencias

  1. Elfriede Dustin (2002). Pruebas de software efectivas: 50 maneras específicas de mejorar sus pruebas . Addison-Wesley Professional. págs.  188–. ISBN 978-0-201-79429-8.
  2. Tanya Janca (14 de octubre de 2020). Alice y Bob aprenden seguridad de aplicaciones . Wiley. págs. 15–. ISBN  978-1-119-68740-5.
  3. Codificación flexible de The Daily WTF