Constantes de las etiquetas XML con valores de codificación dura -- java campo con xml campo con comparative-review campo con constants camp codereview Relacionados El problema

XML tags constants vs hardcoded values


8
vote

problema

Español

Tengo que crear un cuerpo XML para una llamada de servicio web. Quiero usar:

  private void createProductBody(Product product, StringBuilder body) {     body.append(WSConstants.WS_PRODUCT_ID_START_TAG)             .append(product.getId())             .append(WSConstants.WS_PRODUCT_ID_END_TAG)             .append(WSConstants.WS_SIZE_TEXT_START_TAG)             .append(product.getSize())             .append(WSConstants.WS_SIZE_TEXT_END_TAG); }   

Pero algunos colegas afirman que esta escritura es difícil de leer y quiere que usemos esto:

  private void createProductBody(Product product, StringBuilder body) {     body.append("<ProductId>").append(product.getId()).append("</ProductId>")         .append("<Size>").append(product.getSize()).append("</Size>"); }   

¿Cuáles son los principales y los contras para usar valores de codificación dura?

Original en ingles

I have to create an XML body for a web service call. I want to use:

private void createProductBody(Product product, StringBuilder body) {     body.append(WSConstants.WS_PRODUCT_ID_START_TAG)             .append(product.getId())             .append(WSConstants.WS_PRODUCT_ID_END_TAG)             .append(WSConstants.WS_SIZE_TEXT_START_TAG)             .append(product.getSize())             .append(WSConstants.WS_SIZE_TEXT_END_TAG); } 

But some colleagues state that this writing is hard to read and they want us to use this:

private void createProductBody(Product product, StringBuilder body) {     body.append("<ProductId>").append(product.getId()).append("</ProductId>")         .append("<Size>").append(product.getSize()).append("</Size>"); } 

Which are the pro and cons for using hardcoded values?

           
     
     

Lista de respuestas

13
 
vote
vote
La mejor respuesta
 

están bien. Si bien "</Whatever>" es difícil de leer (ymmv), las constantes lo hacen aún peor.

Las constantes mágicas en un código son malas y, por lo general, deben extraerse como lo hizo. Pero si hay muchos de ellos y cada uno se usa solo una vez, es contraproducente.

La mejor solución sería algo así como

  new XmlBuilder(body)     .start("ProductId").append(product.getId()).end()     .start("Size").append(product.getSize()).end();   

o algunos de los millones de herramientas XML existentes. Si las constantes se usan varias veces, entonces algo así como

  new XmlBuilder(body)     .start(WSConstants.WS_PRODUCT_ID).append(product.getId()).end()     .start(WSConstants.WS_SIZE).append(product.getSize()).end();   

tiene más sentido. Luego, puede considerar usar las importaciones estáticas para mantenerlo más corto.

El 99887766655443310 es bastante trivial, en su mayoría delega al 99887766555443311 y recuerda las etiquetas abiertas con una pila. Según lo declarado por la AETHERIA, también debería escapar de los valores adjuntos cuando sea necesario.


para los amantes de la redundancia, algo así como

  return new Func<Dictionary<string, string>>[] {     MyObjectPropertyConstants.BeginTime,     MyObjectPropertyConstants.EndTime }.Select(f => AssembleMyObject(key, "@" + f.Name, f()).ToList(); 2  

puede ser más "cool". De todos modos, es más xml, como (simplemente no me preguntes qué es bueno).


NOTA LA INCONSTICIÓN DE "PRODUCTOR_ID" frente a "TAMAÑO_TEXT", donde los primeros significa "productID", mientras que este último significa "tamaño". Esto debería ser arreglado (como lo hice en mis fragmentos).

 

They're right. While "</Whatever>" is hard to read itself (YMMV), the constants make it even worse.

Magical constants in a code are bad and should usually be extracted as you did. But if there are many of them and each gets used just once, it's counterproductive.

The best solution would be something like

new XmlBuilder(body)     .start("ProductId").append(product.getId()).end()     .start("Size").append(product.getSize()).end(); 

or some of the million existing XML tools. If the constants get used multiple times, then something like

new XmlBuilder(body)     .start(WSConstants.WS_PRODUCT_ID).append(product.getId()).end()     .start(WSConstants.WS_SIZE).append(product.getSize()).end(); 

makes more sense. Then you may consider using static imports to keep it shorter.

The whole XmlBuilder is rather trivial, it mostly delegates to the StringBuilder and remembers the opened tags using a stack. As stated by aetheria, it should also escape the appended values when needed.


For redundancy lovers, something like

new XmlBuilder(body)     .start(WS_PRODUCT_ID).append(product.getId()).end(WS_PRODUCT_ID)     .start(WS_SIZE).append(product.getSize()).end(WS_SIZE); 

may be more "cool". Anyway, it's more XML-like (just don't ask me what's good for).


Note the inconsistency of "PRODUCT_ID" vs. "SIZE_TEXT", where the former means indeed "productId" while the latter means just "size". This should be fixed (like I did in my snippets).

 
 
 
 

Relacionados problema

3  Gestión de tipos de fallas  ( Managing fault types ) 
Tengo un FaultType enum Con más de 100 miembros: public enum FaultType { FaultType1, FaultType2, FaultType3, FaultType4, FaultType5...

3  Traducir cadenas de un atributo XML en las constantes correspondientes en mi módulo  ( Translate strings from an xml attribute into corresponding constants in my modul ) 
Tengo una comprensión no trivial en la lista en Python. Mi objetivo es tomar una lista de cadenas delimitada en blanco de un atributo XML, que puede no existi...

3  Índice de Mapeo a una cadena en C  ( Mapping index to a string in c ) 
Por favor, disculpe mi pregunta potencialmente noob-ish. No he tocado cadenas en C (o C en general) en un tiempo, y parece que recuerdo que hay diferentes man...

-5  Usando plantillas para constante y volátil [cerrado]  ( Using templates for constant and volatile ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

1  Encontrar el nombre de una constante dada utilizando la reflexión  ( Finding the name of a given constant using reflection ) 
El código a continuación proviene de #include <iostream> #include <string> #include <vector> using namespace std; int main() { long ind,j,test,kal; cin>>te...

3  Clase estática para constantes con referencia a los recursos de Java  ( Static class for constants with reference to java resources ) 
Quiero almacenar los colores que utilizo en el archivo colores.xml . Además de usarlos en un xml-layout , también quiero usar estos colores en mi código Jav...

4  Definiendo constantes en JavaScript  ( Defining constants in javascript ) 
Soy consciente de Javascript no tiene el concepto de variables constantes, que en idiomas tradicionales, generalmente definiría como estática / clase relacion...

7  Generando dinámicamente cadenas (u otras variables)  ( Dynamically generating strings or other variables ) 
Tengo un script de Python que está destinado a lanzar varios otros scripts de shell con la configuración y los parámetros apropiados. Construyo las rutas de a...

4  Función para crear URL en relación con una URL de base configurada  ( Function to create url relative to a configured base url ) 
He escrito esta función para crear una URL: function createUrl(urlPath) { const endpoint = url.parse(env.config.get('myEndpoint')); endpoint.pathna...

99  '100' es un número mágico  ( 100 is a magic number ) 
Bloqueado . Esta pregunta y sus respuestas son bloqueadas porque la pregunta es off-topic pero tiene importancia histórica. Actualmente no está a...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos