2010-09-03 22 views
7

Estoy trabajando en un proyecto para reemplazar un sistema de administración de recursos (QuickTime Resource Manager en Mac y Windows) que ha quedado obsoleto y he estado usando el modelo actual que Qt usa para recuperar datos del archivo de recursos usando una clave de cadena .¿Por qué se usan identificadores de cadena para acceder a los datos de recursos?

Por ejemplo, puedo tener una imagen en mi archivo de recursos, "HungryBear.png" almacenada en mi archivo de recursos. Qt, y mi sistema propuesto, se obtienen de una manera representado por la psuedocode:

image = GetImageResource("BearPlugin/Images/HungryBear.png"); 

Está claro en ese punto lo que la imagen es, y donde se pueden encontrar.

En nuestro sistema actual, usamos números. El problema con los números es que uno tiene que buscar el archivo de recursos (puede haber muchos) para descubrir qué imagen (o recurso) es.

Un ejemplo de esto:

oldActiveResourceFile = GetActiveResourceFile(); // think of a stack of resource files 

SetActiveResourceFile("BearPlugin"); 

image = GetImageResource(1); 

// Perhaps other resources are retrieved and other functions called 
// Possibly introduce problems by calling functions that change "Active Resource File" 

SetActiveResourceFile(oldActiveResourceFile); 

El primer método es lo que he visto en los sistemas actuales que tienen acceso a los datos del archivo de recursos. Me han dicho que C# y Java lo usan, sé que lo hacen para pares clave-valor de cadena, etc.

Sin embargo, un colega mío ha expresado su preocupación sobre cambiar el sistema actual de uso de estos números ID para los identificadores de cadena que estoy proponiendo. Parece que hay muchos beneficios y solucionan muchos de los problemas que hemos tenido con el sistema actual. Quiero tener documentación de respaldo de que el sistema propuesto es mejor y deseable, así que mi pregunta es la siguiente:

¿Conoce alguna investigación o discusión que demuestre que usar un identificador de cadena (jerárquico) en el código es mejor que usar un número arbitrario?

NOTAS

  1. Pienso en el uso de un archivo zip (posiblemente sin comprimir) para contener los archivos de datos.
  2. Tenemos un entorno de plugin de aplicaciones. La aplicación y cada complemento pueden tener sus propios archivos de recursos. Los complementos pueden acceder a los datos de recursos en el archivo de recursos de la aplicación.
  3. Éstos son algunos de los requisitos que se han considerado y creo que cumplen:

    • desarrolladores de software será capaz de identificar de forma única los recursos.
    • Los desarrolladores de software podrán nombrar recursos con nombres significativos.
    • Los recursos deben estar asociados con las partes de la aplicación que los necesitan.
    • Los localizadores deben ser capaces de identificar fácilmente los archivos de recursos que han cambiado.
    • Los localizadores deben poder usar sus propias herramientas para modificar los archivos de recursos.
    • Se alertará a los clientes en caso de que la funcionalidad que están utilizando dependa de llamadas obsoletas.
+0

Qué idioma es el código? – Powerlord

+0

El código se escribirá en C++ para Mac OS X y Windows XP/Vista/7. Estaba planeando convertir los archivos de recursos en un archivo comprimido que contiene los datos que pueden ser: 1) archivos de imagen, 2) archivos de cadenas localizables, 3) archivos de texto de definición de diálogos, 4) archivos de sonido, 5) otros archivos de recursos . –

Respuesta

2

Los principales inconvenientes del uso de identificadores numéricos de recursos son la capacidad de descubrimiento (averiguar qué recurso es 1234) y mantener la singularidad de los ID a medida que agrega más a lo largo del tiempo en aplicaciones grandes.

El principal inconveniente de utilizar nombres de cadena para ID de recursos es que las cadenas ocupan más memoria en el tiempo de ejecución. El patrón .NET para recursos, por ejemplo, usa nombres de cadena, y esos nombres de cadena se etiquetan en el archivo ejecutable en tiempo de ejecución.

Los nombres de cadena son fáciles de mantener únicos y auto-documentados en aplicaciones grandes y años de revisiones (usando rutas jerárquicas como en su ejemplo), pero el beneficio es realmente solo para la conveniencia humana. Sería bueno si esas cadenas pudieran reducirse a ID enteros para el binario ejecutable final, ya que el grupo de recursos es inmutable en ese punto y la CPU realmente preferiría los ID enteros. .NET no funciona de esta manera, pero otras plataformas podrían hacerlo.

+0

En realidad, en nuestro caso, los recursos serán mutables durante la ejecución de la aplicación. Nuestros localizadores (externos a la empresa) podrán modificar los recursos, por ejemplo, en una ventana de diálogo, y podrán cerrar y volver a abrir la ventana de diálogo para ver sus cambios. –

+0

El recurso * contenido * es mutable por los traductores, pero los recursos * ID * no son mutables una vez que se han compilado en el exectuable. En un escenario de compilador de recursos, los nombres de las cadenas de los recursos aún se pueden mostrar a los traductores aunque las cadenas voluminosas se hayan reducido a enteros en tiempo de compilación mediante el proceso de compilación de exe. – dthorpe

+0

No estoy seguro de seguir. ¿Se crearía una suma de verificación en el código y el sistema de recursos que busca el recurso haría algo? para buscar el recurso? Crear sumas de comprobación mediante el análisis del archivo de recursos en el lanzamiento? –

0

Ese tipo de roturas de la separación del contenido del código.Un archivo res es más fácil de cambiar que los archivos con códigos N ​​que contienen referencias codificadas a las imágenes. Tal vez considere poner esas cadenas en un objeto de Configuraciones que obtiene [de] serialización durante la carga/descarga.

+0

El contenido ya está separado del código en los archivos de recursos. Estos archivos se pueden editar por separado antes o durante la ejecución del código. Lo que estoy buscando es cualquier material de apoyo que promueva identificadores de cadena sobre identificadores arbitrarios que referencien un archivo de recursos indexados. –

+0

Lamento haber malinterpretado el patrón "a/b/c.png" como un archivo en lugar de una referencia a un recurso. – Novikov

+0

No hay problema. Estoy usando el paradigma de ruta de archivo porque nuestros desarrolladores lo entenderán y, en realidad, es preciso (en relación con el archivo de recursos que lo contiene). Los archivos de recursos serán archivos comprimidos con los archivos de recursos integrados en ellos. –

0

Es simplemente mucho más práctico, los nombres pueden auto documentarse.

Resourcebundles se utilizan a menudo en los esfuerzos de internacionalización. Y hay herramientas que escanean los archivos fuente, cambian todas las cadenas a las llamadas a funciones para obtener un recurso con el mismo nombre y generar la asignación predeterminada.

En el código todavía puede leer lo que se está produciendo en el idioma predeterminado.

En el paquete de traducción asigna el idioma predeterminado a la lengua objetivo.

Esto facilita este proceso considerablemente.

+0

Eso es interesante. Puedo ver que es útil para la administración de recursos de cadenas y puede hacer que forme parte del sistema. Sin embargo, esta respuesta en realidad no me ayuda a respaldar mi propuesta de acceder a los recursos de abitrary utilizando un identificador de cadena significativo. –

+0

No olvide que a menudo se deben internacionalizar iconos, imágenes, clips de sonido, etc. Sería confuso usar múltiples sistemas de mapeo. –

+0

Gracias, no los he olvidado. Planeo acceder a ellos por el nombre. Los datos que están contenidos en ese referido al nombre serán localizables. –

1
76 87 123 84 

vs

OpenWithNumericExample 
OfferStringsInComparison 
CommentOnGreaterReadabilityOfLatter 
PointOutGreatDebuggingAdvantageOfLatter 
Cuestiones relacionadas