2008-11-11 37 views

Respuesta

46

Wikipedia apunta al término Canonicalization.

Proceso para convertir datos que tienen más de una representación posible en una representación canónica "estándar". Esto se puede hacer para comparar diferentes representaciones de equivalencia, para contar el número de estructuras de datos distintas, para mejorar la eficiencia de varios algoritmos al eliminar cálculos repetidos, o para hacer posible imponer un orden de clasificación significativo.

El Unicode ejemplo hecho más sentido para mí:

codificaciones de longitud variable en el estándar Unicode, en particular, UTF-8, tienen más de una posible codificación de los caracteres más comunes. Esto hace que la validación de cadenas sea más complicada, ya que se deben considerar todas las posibles codificaciones de cada carácter de cadena. Una implementación de software que no tenga en cuenta todas las codificaciones de caracteres corre el riesgo de aceptar cadenas consideradas inválidas en el diseño de la aplicación, lo que podría causar errores o permitir ataques. La solución es permitir una sola codificación para cada personaje. La canonicalización es entonces el proceso de traducir cada carácter de cadena a su única codificación permitida. Una alternativa es que el software determine si una cadena se canonicaliza y luego la rechaza si no lo está. En este caso, en un contexto cliente/servidor, la canonización sería responsabilidad del cliente.

En resumen, una forma estándar de representación de datos. De esta forma, puede convertir a cualquier representación que pueda necesitar.

21

La palabra "canónico" es simplemente un sinónimo de "estándar" o "habitual". No tiene ningún significado específico de Java.

+3

canónico tiene un significado más rico que el estándar o habitual de la OMI. – squid

53

Creo que hay dos usos relacionados de canonical: formas e instancias.

A forma canónica significa que los valores de un tipo particular de recurso se pueden describir o representar de múltiples maneras, y una de esas formas se elige como la forma canónica preferida. (Ese formulario es canonizado, como los libros que lo hicieron en la Biblia, y las otras formas no). Un ejemplo clásico de una forma canónica son las rutas en un sistema de archivos jerárquico, donde se puede hacer referencia a un solo archivo en un número de formas:

myFile.txt         # in current working dir 
../conf/myFile.txt       # relative to the CWD 
/apps/tomcat/conf/myFile.txt     # absolute path using symbolic links 
/u1/local/apps/tomcat-5.5.1/conf/myFile.txt # absolute path with no symlinks 

La definición clásica de la representación canónica de ese archivo sería la última ruta. Con rutas locales o relativas, no puede identificar globalmente el recurso sin información contextual. Con rutas absolutas puede identificar el recurso, pero no puede decir si dos rutas se refieren a la misma entidad. Con dos o más rutas convertidas a sus formularios canónicos, puede hacer todo lo anterior, además de determinar si dos recursos son iguales o no, si eso es importante para su aplicación (resuelva el problema de alias).

Tenga en cuenta que la forma canónica de un recurso no es una calidad de esa forma en particular; puede haber múltiples formas canónicas posibles para un tipo dado, como las rutas de archivos (por ejemplo, lexicográficamente, en primer lugar, las rutas absolutas posibles). Se ha seleccionado un solo formulario como la forma canónica para un motivo de aplicación particular, o quizás arbitrariamente para que todos hablen el mismo idioma.

Forzar a los objetos en las casos canónicos es la misma idea básica, pero en lugar de determinar una "mejor" representación de un recurso, que determina arbitrariamente a una instancia de una clase de casos con el mismo "contenido" como el canónico referencia, luego convierte todas las referencias a objetos equivalentes para usar una instancia canónica.

Esto se puede utilizar como una técnica para optimizar el tiempo y el espacio. Si hay varias instancias de objetos equivalentes en una aplicación, al forzarlos a resolverlos como la única instancia canónica de un valor particular, puede eliminar todos los valores, excepto uno, ahorrando espacio y posiblemente tiempo, ya que ahora puede comparar aquellos valores con identidad de referencia (==) en oposición a la equivalencia de objeto (método equals()).

Un ejemplo clásico de optimización del rendimiento con instancias canónicas es el colapso de cadenas con el mismo contenido. Llamar al String.intern() en dos cadenas con la misma secuencia de caracteres garantiza devolver el mismo objeto Cadena canónico para ese texto. Si pasa todas las cadenas a través de ese canonicalizador, sabe que las cadenas equivalentes son en realidad referencias de objeto idénticas, es decir, alias

Los tipos enumerados en Java 5.0+ fuerzan a todas las instancias de un valor enum particular a usar la misma instancia canónica dentro de un VM, incluso si el valor se serializa y se deserializa. Es por eso que puede usar if (day == Days.SUNDAY) con impunidad en java si Days es un tipo de enumeración. Hacer esto para sus propias clases es ciertamente posible, pero se cuida. Lea Java efectivo por Josh Bloch para obtener detalles y consejos.

14

reducido a la forma más simple y más importante sin perder generalidad

0
significa

representación canónica ver el carácter en un estilo diferente por ejemplo, si escribo una letra A significa que otra persona puede escribir la letra A en un estilo diferente :)

Esto es de acuerdo con reconocimiento óptico de caracteres CAMPO

2

Otro buen ejemplo podría ser: usted tiene una clase que admite el uso de cartesianas (x, y, z), esféricas (r, theta, phi) y cilíndrica coordenadas (r, phi, z). Para establecer la igualdad (método igual), probablemente desee convertir todas las representaciones en una representación "canónica" de su elección, p. coordenadas esféricas. (O tal vez desearía hacer esto en general, es decir, usar una representación interna). No soy un experto, pero esto se me ocurrió como un buen ejemplo concreto.

4

Una forma fácil de recordarlo es la forma en que se usa "canónico" en los círculos teológicos, la verdad canónica es la verdad real, de modo que si dos personas la encuentran, han encontrado la misma verdad. Lo mismo con la instancia canónica. Si cree que ha encontrado dos de ellos (es decir, a.equals(b)), realmente solo tiene uno (es decir, a == b). Entonces la igualdad implica identidad en el caso del objeto canónico.

Ahora para la comparación.Ahora tiene la opción de usar a==boa.equals(b), ya que producirán la misma respuesta en el caso de una instancia canónica pero a == b es una comparación de la referencia (la JVM puede comparar dos números extremadamente rápido ya que son solo dos . patrones de 32 bits en comparación con a.equals(b) que es una llamada al método e implica un mayor gasto

21

un buen ejemplo para la comprensión "forma/representación canónica" es mirar la definición de tipo de datos de esquema XML de "booleano":

  • la "representación léxica" de boolean puede ser una de: {true, false, 1, 0} mientras que
  • la "representación canónica" sólo puede ser uno de {true, false}

Esto, en esencia, significa que

  • "true" y "1" conseguir correlaciona con la repr canónica. "true" y
  • "false" y "0" obtener asignada a la repr. Canoncial. "false"

ver the w3 XML schema datatype definition for boolean

0

una forma canónica significa una representación natural único del elemento

Cuestiones relacionadas