Traducción de datos externos al lenguaje en el que está programando

39

No estoy seguro de qué hacer con lo siguiente:

Tomamos datos de una herramienta externa dentro de nuestra propia herramienta. Estos datos están escritos en holandés. Estamos escribiendo nuestro código Java en inglés. ¿Deberíamos traducir este holandés al inglés o mantenerlo holandés? Por ejemplo, tenemos 2 departamentos: Bouw (Construcción en inglés) y Onderhoud (Mantenimiento en inglés).

¿Sería lógico crear:

public enum Department { BOUW, ONDERHOUD }

o:

public enum Department { CONSTRUCTION, MAINTENANCE }

o incluso:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling es departamento en holandés)

Jelle
fuente
3
Supongo que no es un duplicado porque estoy hablando de datos externos y no de los datos de nuestra propia aplicación, que se nombra en inglés.
Jelle
1
Si utiliza objetos de datos que no están en inglés o fuente en general, es útil tener una tabla de referencia de traducción del equivalente aproximado en inglés para cada función y objeto de datos. Esto es especialmente relevante para los nombres de funciones y objetos que usan varias palabras, lo cual es bastante común en algunos idiomas. He tenido que corregir errores que no están en mi lengua materna sin ningún conocimiento del idioma, pero debido a que tenía un diccionario de traducción para ese programa, fue trivial. Por lo general, las bibliotecas de traducción programática solo se incluyen en proyectos que localizan adecuadamente su software.
kayleeFrye_onDeck
3
¿El resto de su programa (aparte de las bibliotecas estándar) utiliza identificadores en inglés u holandés?
user253751
Por ahora, hemos usado solo inglés, pero los departamentos son actualmente los únicos datos de usuario codificados, porque el departamento de un determinado proyecto juega un papel importante en nuestra aplicación. Otros valores holandeses se guardan en nuestra base de datos, por lo que no están codificados.
Jelle

Respuestas:

33

En este escenario, dejaría los valores de enumeración en holandés:

public enum Department { BOUW, ONDERHOUD }

Porque la lógica que usa estas constantes coincidirá con los datos que también están en holandés . Por ejemplo, si la entrada es "bouw", el código de comparación podría verse así:

if (Department.BOUW == input.toUpper())

Me resulta más fácil depurar cuando los valores coinciden (incluso si no sé lo que significan los valores). La traducción solo agrega un aro mental que, como desarrollador, no debería tener que saltar para probar la corrección.

Sin embargo, puede comentar el código si ayuda a otros a comprender el contexto de los datos:

public enum Department { 
    BOUW, /* build */
    ONDERHOUD /* maintenance */
}
obispo
fuente
3
@Jelle Por supuesto, si alguna vez terminas expandiéndote internacionalmente, podrías estar contento con la lógica de traducción de todos modos. YMMV en YAGNI.
Williham Totland el
66
De todos modos, no debería comparar sus enumeraciones con cadenas directamente. ¿Qué sucede si tiene que comparar una cadena con varias palabras con un valor de enumeración?
Jørgen Fogh
25
Yo nunca comparar cadenas utilizando .toUpper () == y, sobre todo cuando se trabaja con facilidad de entrada y cadenas localizadas. Un ejemplo de libro escolar es el carácter turco "i".
Adriano Repetti
44
@ABoschman Los comentarios de fin de línea se refieren universalmente a la línea en la que se encuentran. He visto este tipo de comentario para descripciones simples de elementos de la lista cientos de veces ...
StarWeaver
13
En nuestra tienda, hacemos lo contrario de lo que se sugiere aquí: los nombres enum / const están en inglés (o lo que se entiende por inglés), y los comentarios están "localizados". Lo que es bueno. De lo contrario, tendríamos todos estos concursos con nombres como PAAMAYIM_NEKUDOTAYIM.
sq33G
59

El inglés es una lengua franca / mínimo común denominador por una razón. Incluso si la razón es conceptualmente tan débil como "Todos lo hacen", sigue siendo una razón bastante importante.

Ir en contra de la práctica común significa que tienes que entender el holandés para entender las estructuras de datos en tu software. No hay nada malo con el holandés, pero la probabilidad de que cualquier ingeniero que tenga que interactuar con la base de código lo hable es aún menor que eso para el inglés.

Por lo tanto, a menos que seas un holandés única tienda, y no tiene intención de expandirse internacionalmente vez , es casi siempre una buena idea para mantener su base de código monolingüe, y utilizar el lenguaje de codificación más popular.

Nota: Este consejo se aplica solo al código del programa . Los datos del usuario definitivamente no deben traducirse, sino procesarse "tal cual". Incluso si tiene un cliente "Goldstein", claramente no debe almacenar su nombre como "piedra dorada".

El problema es que hay un continuo de términos entre "proporcionado por el usuario, no tocar" y "fragmento de código, use inglés en todo momento". Los nombres de los clientes están muy cerca del extremo anterior del espectro, las variables de Java cerca del último extremo. Las constantes para los enumvalores están un poco más lejos, particularmente si denotan entidades externas únicas y conocidas (como sus departamentos). Si todos en su organización usan los términos holandeses para los departamentos, no planea confrontar a nadie con la base de código que no lo hace, y el conjunto de departamentos existentes cambia raramente, entonces usar los nombres aceptados del departamento puede hacer más sentido para constantes enum que para variables locales. Sin embargo, todavía no lo haría.

Kilian Foth
fuente
3
+1, el uso del inglés en ese caso le brinda la legibilidad y reutilización del código, que se describe en esta respuesta. Al hacerlo holandés los rompe de alguna manera.
Mikhail Churbanov
44
@Jelle ¿El nombre tiene un significado semántico para el código? En caso afirmativo, traduzca, de todos modos necesita una traducción del concepto. Si no, ¿por qué tienes un enumpara ello? Eso podría ser solo una señal de que está tratando de modelar datos en código, lo que puede ser una mala idea.
Luaan
29
Estoy totalmente en desacuerdo con esta idea de traducir generalmente la terminología específica del dominio. En algunos dominios, por ejemplo, la industria ferroviaria, los glosarios de diferentes idiomas o incluso territorios difieren tanto que cualquier intento de traducir incluso un solo término deformará tanto el significado que evitará que alguien lo entienda. A menos que esté absolutamente seguro de que el dominio de la aplicación permite la traducción sin pérdidas, no traduzca la terminología del dominio .
Rhymoid el
66
También escuché de mi líder de proyecto que en otro proyecto, los desarrolladores estamos traduciendo algunos objetos de dominio del holandés al inglés, y más tarde en el proyecto no quedó claro qué significaban estos objetos debido a estas traducciones personalizadas.
Jelle
44
Lea los comentarios de @Rhymoid y Jelle nuevamente. ¡Nunca haga sus propias traducciones de terminología de dominio! Si decide usar términos en inglés para entidades con nombres holandeses, asegúrese de usar una traducción oficial, no la suya.
Guran
15

Evite la traducción cuando sea posible, porque cada traducción es un esfuerzo adicional y puede introducir errores.

La contribución clave del "diseño impulsado por dominio" a la ingeniería de software moderna es el concepto de un lenguaje ubicuo , que es un lenguaje único utilizado por todos los interesados ​​en un proyecto. De acuerdo con DDD, la traducción no debe ocurrir dentro de un equipo (que incluye expertos en dominios, incluso si está presente solo por proxy de un documento de especificación), sino solo entre equipos (lectura adicional: "Diseño impulsado por dominio" por Eric Evans, en particular los capítulos sobre lenguaje ubicuo y diseño estratégico).

Es decir, si sus expertos comerciales (o su documento de especificación) hablan holandés, use su terminología (holandesa) cuando exprese inquietudes comerciales en el código fuente. No traduzca innecesariamente al inglés, ya que hacerlo crea un impedimento artificial para la comunicación entre expertos en negocios y programadores, lo que lleva tiempo y puede (a través de una traducción ambigua o mala) causar errores.

Si, por el contrario, sus expertos en negocios pueden hablar sobre sus negocios tanto en inglés como en holandés, se encuentra en la afortunada situación de poder elegir el idioma omnipresente del proyecto, y hay razones válidas para preferir el inglés (como "comprensible internacionalmente y es más probable que lo usen los estándares "), pero hacerlo no significa que los codificadores deban traducir lo que hablan los empresarios. En cambio, los empresarios deberían cambiar de idioma.

Tener un lenguaje ubicuo es particularmente importante si los requisitos son complejos y deben implementarse con precisión, si solo estás haciendo CRUD, el lenguaje que utilizas internamente es menos importante.

Anécdota personal: estaba en un proyecto donde expusimos algunos servicios comerciales como un punto final SOAP. El negocio se especificó por completo en alemán, y es poco probable que se reutilice como en inglés, porque se trataba de asuntos legales específicos de una jurisdicción en particular. Sin embargo, algunos arquitectos de la torre de marfil ordenaron que la interfaz SOAP sea en inglés para promover la reutilización futura. Esta traducción se produjo de manera puntual y con poca coordinación entre los desarrolladores, pero solo un glosario compartido, lo que dio como resultado que el mismo término comercial tuviera varios nombres en el contrato de servicio web y algunos términos comerciales que tuvieran el mismo nombre en el contrato de servicio web. Ah, y por supuesto, algunos nombres se usaron a ambos lados de la división, ¡pero con diferentes significados!

Si elige traducir de todos modos, estandarice la traducción en un glosario, agregue el cumplimiento de ese glosario a su definición de hecho y verifíquelo en sus comentarios. No seas tan descuidado como lo hemos sido nosotros.

meriton - en huelga
fuente
55
Los expertos en negocios hablarán inglés. El dominio del inglés entre los holandeses educados en la fuerza laboral es del 100%.
MSalters
44
Hablar inglés es una cosa. Ser capaz de hacer traducciones de calidad de la terminología de dominio holandés al inglés es otra cosa.
Guran
1
@MSalters: ¿Competente a qué nivel? En el proyecto del que hablé, todos podían hablar inglés, pero no eran tan competentes como en alemán. Por ejemplo, había un método getAdminRollque verificaba el rol de administrador ... (la palabra alemana es "Rolle", y dejaron caer la letra equivocada :-)
meriton - en huelga el
@Guran: En realidad, eso suele ser al revés: su experto en dominios puede estropear la gramática inglesa y tener dificultades con las pequeñas charlas, pero conocerán la terminología de su dominio en inglés. Los programadores pueden ser el problema más grande: su dominio es el software, lo que significa que conocen ese vocabulario, pero no necesariamente el vocabulario comercial.
MSalters
@meriton: Eso no es en realidad un error tan raro, teniendo en cuenta que "rodar" es un sufijo Inglés, por ejemplo, la nómina , del francés Rolle . En promedio, la fluidez en inglés en los Países Bajos es significativamente mayor que en Alemania. Por ejemplo, yo todavía no esperaría que las universidades alemanas cambien al inglés como idioma hablado. ¿Y presentar una tesis en alemán todavía se considera normal, creo?
MSalters
9

La solución correcta es no codificar los departamentos en absoluto:

ArrayList<String> departments = (... load them from a configuration file ...)

O, si realmente necesita un tipo de departamento:

class Department { String name; Department(String name) { this.name = name; } ... }
HashMap<String, Department> = (... generate from configuration file ...)

Si encuentra la necesidad de probar con departamentos específicos en su código, debe preguntar más genéricamente qué tiene de especial ese departamento y aceptar configurar ese departamento como que tiene esa propiedad. Por ejemplo, si un departamento tiene una nómina semanal, y eso es lo que le importa al código, debe haber una propiedad WEEKLY_PAYROLL que la configuración pueda adjuntar a cualquier departamento.

Daniel deprimido
fuente
Esta. ¿Qué sucede cuando una partida se divide o combina o se forma una nueva? Este código se adaptará más o menos automáticamente; convertirlo en una enumeración significa que necesita una nueva compilación o explotará.
jpmc26
1
Esta sería una solución si los departamentos no desempeñaran un papel tan importante en nuestra aplicación. Tenemos muchas if (project.getDepartment().equals(Department.XYZ))declaraciones.
Jelle
@Jelle, ¿qué tal un project.isForDepartment("XYZ"), que a su vez usa el hashmap de Daniel (que se inyecta en el Proyecto, o algo así)
SáT
2
@ SáT, eso es solo pedir errores tipográficos, sinceramente ...
Jelle
@Jelle Sí, pero se puede ver en tiempo de ejecución. Las pruebas también podrían atraparlos en tiempo de compilación. (Aunque entiendo de dónde vienes, y estoy de acuerdo.)
SáT
3

Para cualquier persona que se pregunte: hemos elegido la primera opción, principalmente porque creemos que no debe inventar términos por el simple hecho de traducir. Sin embargo, si en algún momento un desarrollador internacional estaría trabajando en el proyecto, hemos agregado documentación para explicarlo:

/** The possible departments of a project, given in the Dutch language. */
public enum Department { BOUW, ONDERHOUD }
Jelle
fuente
Me alegra que hayas encontrado un enfoque satisfactorio. 😀 Sin embargo, la respuesta aceptada parece diferir de su enfoque elegido. Considere cambiar la respuesta aceptada a una de las otras que coincida con su enfoque elegido.
obispo
Cambié la respuesta aceptada. Sin embargo, dado el rango de votos a favor, creo que también es una elección personal, y elegí este enfoque.
Jelle
2

Si le preocupa tener una representación de cadena para mostrar al usuario o algo, simplemente defina una matriz de descripciones dentro de su enumeración y exponga un método.
Por ejemplo: Department.BUILD.getDescription();generará "BOUW"

public enum Department { 
    BUILD,
    MAINTENANCE;

    private String[] descriptions = new String[] {
        "BOUW",
        "ONDERHOUD"
    };

    public String getDescription() {
        return descriptions[ordinal()];
    }
}

Sé que elegiste lo contrario, pero en caso de que el vórtice de Google arroje a la gente aquí por accidente.

EDITAR: Como lo señaló Pokechu22 , puede usar constructores enum y propiedades privadas como esta:

public enum Department {
    BUILD("BOUW"),
    MAINTENANCE("ONDERHOUD");

    private final String description;

    private Department(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

que también logrará ese efecto.

Chispa
fuente
1
No necesitas una matriz. En java, las enumeraciones pueden tener constructores (privados) y campos.
Pokechu22
1
@ Pokechu22, pero ¿está el valor u ordinal disponible en el constructor para poder coincidir con la descripción? Quiero decir, aún necesitarías una matriz dentro del constructor para obtener la descripción correcta, ¿verdad?
SparK
1
No, puedes hacerlo así:public enum Department { BUILD("BOUW"), MAINTENANCE("ONDERHOUD"); private final String description; private Department(String description) { this.description = description; } public String getDescription() { return description; } }
Pokechu22
@ Pokechu22 Añadido a la respuesta. También noté que en caso de que la matriz aumente, mi implementación podría romperse y aumentar en 2 líneas cada vez, mientras que la suya aumentará 1 línea y no romperá las referencias.
SparK
0

Se espera que ciertos invariantes de su código se mantengan. Uno de esos invariantes es que un programa no se comportará de manera diferente cuando se cambie el nombre de un identificador. En este caso en particular, cuando tiene una enumeración, y cambia el nombre de cualquier miembro de esa enumeración, y actualiza todos los usos de ese miembro, no esperaría que su código comience a funcionar de manera diferente.

El análisis es el proceso de leer datos y derivar estructuras de datos a partir de ellos. Cuando toma los datos externos, los lee y crea instancias de su enumeración, está analizando los datos. Ese proceso de análisis es la única parte de su programa responsable de mantener la relación entre la representación de datos de cómo la recibe y la forma y el nombre de los miembros de sus tipos de datos.

Como tal, no debería importar qué nombres asignes a los miembros de la enumeración. Que coincidan con las cadenas utilizadas en los datos que lee es una coincidencia.

Cuando diseña su código para modelar el dominio, los nombres de los miembros no deben estar relacionados con el formato de serialización de los datos. No deberían ser los términos holandeses, ni deberían ser traducciones de los términos holandeses, pero deberían ser lo que usted decida que se ajusta mejor al modelo de dominio.

El analizador que se traduce entre el formato de datos y su modelo de dominio. Esa es la última influencia que el formato de datos debería tener en su código.

Martijn
fuente