Formulación de un requisito sobre codificaciones de nombre de archivo

12

Estoy en el proceso de escribir una especificación de requisitos, y tengo el dilema de formular una parte de los requisitos.

Escenario: Descargamos archivos de un sitio web y los archivos descargados deben adjuntarse a un elemento en la herramienta CM que tenemos. Los archivos descargados contienen nombres que pueden ser ASCII, ISO-8859-1, japonés, etc.

En la frase a continuación, ¿cubre "no ASCII" todas las situaciones?

El nombre del archivo descargado puede contener caracteres no ASCII y el procesamiento de este no bloqueará la aplicación

KK99
fuente
¿De un sitio web o de muchos sitios web? ¿Ese sitio web realmente contiene un sistema de archivos gobbledegook?
200_success
77
así que si el nombre del archivo contiene ascii, la aplicación puede bloquearse;)
jk.
11
¿Sería pedante señalar que "japonés" no es una codificación?
Ixrec
@lxrec -> tienes razón. El japonés no es una codificación. Lo que quería decir eran caracteres japoneses pero no escribí completamente. gracias
KK99
@jk En algunas implementaciones, si el nombre del archivo no es ASCII, la aplicación se bloquea. historia real :-)
KK99

Respuestas:

30

El requisito, como se dijo, es confuso para mí.

La primera pregunta que tendría es: ¿cuántas codificaciones de caracteres deben ser compatibles? Las posibles interpretaciones incluyen:

  1. Cada codificación que se haya diseñado, incluidos los de un solo byte (por ejemplo, ISO-8859-15 ), multibyte (por ejemplo , Big5 , Shift-JIS , HZ ) y los raros / extraños (por ejemplo, UTF-7 , Punycode , EBCDIC ).
  2. Eso es obviamente extremo. ¿Qué tal solo el soporte mínimo, es decir ISO-8859-1?
  3. Solo ISO-8859-1 parece comadreja. ¿Qué tal simplemente apoyar las mejores prácticas modernas, a saber , Unicode como UTF-8 ?

Si no especifica a qué codificaciones se refiere, entonces cuando ocurre un error específico de codificación, usted y el implementador podrían tener una pelea y ambos tendrían razón. Esa es, por definición, la consecuencia de una especificación difusa.

Yendo más allá, ¿qué necesita hacer el software con el nombre del archivo, además de no fallar? Deberia…

  1. ¿Conservar el nombre de archivo en su codificación original, byte por byte?
  2. ¿Normalizar todo a Unicode? Si es así, ¿necesita detectar automáticamente la codificación de origen? ¿Por qué mecanismo?
  3. Almacene tanto el formulario Unicode como el original, en caso de que falle la normalización.

Una mejor versión de su requerimiento sería

El descargador debe admitir nombres de archivo en varias codificaciones, incluidas al menos ASCII, ISO-8859-1, ISO-8859-15, KOI8-R, UTF-8, Shift-JIS, EUC-JP, GB2312 y Big5. Si la respuesta del servidor web especifica una codificación, debe respetarse. (Si la codificación no está especificada, se puede suponer ISO-8859-1, o se puede hacer una mejor suposición.) Los nombres de archivo se normalizarán a una representación Unicode en el sistema de gestión de contenido.

Los ejemplos específicos de codificaciones requeridas son esenciales para idear criterios de aceptación. Las oraciones agregadas indican lo que el software necesita hacer, más allá de no fallar.

200_success
fuente
Mientras que NTFS almacena nombres de archivos en Unicode, la mayoría de los otros sistemas de archivos almacenan nombres de archivos como secuencias de bytes sin ninguna codificación especificada. Dado ese caso, ¿cómo podría saber qué codificación adivinar?
Gabe
@Gabe El servidor web, cuando sirve el archivo, puede indicar la codificación. Si no, también hay heurísticas de análisis de texto que pueden adivinar una codificación.
200_success
2
Recuerde, estamos hablando del nombre del archivo en sí, no del contenido del archivo. Lo más probable es que el servidor web no tenga forma de conocer la codificación del nombre de archivo, por lo que si afirma que el nombre de archivo está en una determinada codificación, probablemente esté mintiendo. Si intenta convertir UTF-8 a UTF-16 pero su nombre de archivo es realmente ISO-8859-1, es probable que se bloquee. Además, consulte blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx para ver un ejemplo de cuán malas son las heurísticas para adivinar codificaciones a partir de muestras de texto del tamaño de un nombre de archivo.
Gabe
@ Gabe Tenga en cuenta que sugerí ISO-8859-1 como predeterminado. Hay una razón para eso: evita muchos de los peligros que mencionas.
200_success
Me temo que UTF-8 no será suficiente: al menos en algunas versiones de Windows (¿sistemas de archivos FAT?) Obtendrá nombres de archivo en las codificaciones locales no Unicode, por ejemplo, win-1252 o win-1257; el navegador puede convertir los nombres de archivo a utf-8 al cargar, pero lo dudo.
Peteris
14

El requisito que ha escrito no tiene las características de un buen requisito . Específicamente, no es cohesivo, no es atómico y no es inequívoco. Debido a la falta de estas características, tampoco es fácilmente verificable.

Su requisito de estado inicial es:

El nombre del archivo descargado puede contener caracteres no ASCII y el procesamiento de este no bloqueará la aplicación

Recomendaría eliminar el "... y el procesamiento de esto no bloqueará la aplicación". Si tiene el requisito de que una pieza de software necesita hacer algo, creo que está bien suponer que debería hacerlo sin bloquear el software.

Esto transforma el requisito en:

El nombre del archivo descargado puede contener caracteres no ASCII

Ahora, tiene un requisito cohesivo y atómico. Sin embargo, no estoy seguro de que sea inequívoco. En su pregunta, menciona varios formatos diferentes. Hay algunas opciones

Algunos recomendarían un requisito separado y único para cada codificación de nombre de archivo que debe ser compatible. Esto respaldaría mejor los requisitos cohesivos, atómicos, trazables, inequívocos y verificables. También facilitaría la especificación de la importancia de cada requisito: quizás el soporte para algunas codificaciones sea más importante o se necesite antes.

Otros pueden recomendar una tabla de formatos compatibles y este requisito se vincularía a una tabla. Sería menos completo (tiene una oración textual y una tabla para mantener), pero estarían en el mismo documento o base de datos. Sin embargo, si fuera a realizar la vinculación en una herramienta de gestión de requisitos, podrían vincularse entre sí para que los cambios a uno resaltaran el requisito vinculado. También permitiría que el texto fluya a otros paquetes de software tal cual, pero con una tabla diferente para diferentes codificaciones.

Sin embargo, la forma en que documenta los requisitos depende de sus necesidades específicas.

Thomas Owens
fuente
4

Hay un par de problemas con su redacción que debilitan el requisito:

1) Debe expresar el requisito en términos positivos , en lugar de en términos de lo que no debe hacer . ¿Cómo se prueba para "no estrellarse"?

2) La frase "El nombre del archivo descargado puede contener ..." es vaga.

Una formulación alternativa sugerida (puramente subjetiva, por supuesto) podría ser:

La aplicación admitirá nombres de archivos descargados que contengan caracteres no ASCII.

(La palabra "soporte" sigue siendo un poco vaga y podría cambiarse para que sea más concreta si se toma junto con otros requisitos para su aplicación).

Kent A.
fuente
1
Auto-comentario: no ASCII tampoco es la mejor redacción, ya que no ASCII podría significar cualquier otra codificación. Un mejor requisito enumeraría las codificaciones permitidas, lo que haría que los casos de prueba resultantes sean más capaces de determinar que el software funciona según lo previsto. De lo contrario, probar una codificación que no sea ASCII podría satisfacer el requisito, pero es posible que no pruebe completamente el software.
Kent A.
2
Sería mejor indicar "la aplicación debe admitir nombres de archivos descargados que contengan caracteres Unicode" y quizás indicar la codificación específica que debe admitirse, por ejemplo, UTF-8.
1

El problema con la especificación tal como está escrita es que no dice qué debe hacer la aplicación con los nombres de archivo "interesantes". Encontré un programa que reemplazaría cualquier carácter de nombre de archivo con el que no entendía _, con el efecto de que cuando se le pidió que copiara un directorio que contenía dos caracteres cuyos nombres eran idénticos, excepto en los caracteres que la utilidad no entendió, el segundo archivo escrito en el directorio sobrescribiría el primero. Tal comportamiento calificaría como "no estrellarse", pero eso no debería implicar que sea aceptable en ausencia de una especificación explícita que lo diga.

Sugeriría que una buena especificación debería especificar de manera afirmativa lo que debería suceder, o bien, observar qué cursos de acción son aceptables, por ejemplo, "Si un nombre de archivo contiene caracteres no reconocidos, el sistema debe generar un nuevo GUID para la operación general y generar un nombre de archivo que combina ese GUID, un número de índice y cualquier parte del nombre de archivo original que pueda acomodarse fácilmente; debe producir una tabla que asigne los nombres de archivo antiguos y nuevos "o" Si un nombre de archivo contiene caracteres no reconocidos, el sistema puede formar un nuevo nombre concatenando los caracteres que reconoce; si dos nombres de archivo terminan siendo idénticos a través de dicha transformación, cualquiera de los dos puede ser declarado arbitrariamente como el "ganador" ".

Super gato
fuente