Traduzindo dados externos para o idioma em que você está programando

39

Não tenho certeza do que fazer com o seguinte:

Nós coletamos dados de uma ferramenta externa dentro de nossa própria ferramenta. Estes dados são escritos em holandês. Estamos escrevendo nosso código Java em inglês. Devemos então traduzir esse holandês para o inglês ou mantê-lo em holandês? Por exemplo, temos 2 departamentos: Bouw (construção em inglês) e Onderhoud (manutenção em inglês).

Seria lógico criar:

public enum Department { BOUW, ONDERHOUD }

ou:

public enum Department { CONSTRUCTION, MAINTENANCE }

ou até:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling é Departamento em holandês)

Jelle
fonte
3
Possível duplicata de convenções de nomenclatura que não sejam em inglês
gnat 28/11
3
Acho que não é uma duplicata porque estou falando de dados externos e não de nossos próprios dados de aplicativos, que são nomeados em inglês.
Jelle
1
Se você usar objetos de dados que não sejam do inglês ou fonte em geral, é útil ter uma tabela de referência de tradução do equivalente aproximado do inglês para cada função e objeto de dados. Isso é especialmente relevante para nomes de funções e objetos que usam várias palavras, o que é bastante comum em alguns idiomas. Eu tive que corrigir bugs não na minha língua nativa com absolutamente nenhum conhecimento do idioma, mas devido a ter um dicionário de tradução para esse programa, foi trivial. Normalmente, as bibliotecas de tradução programática são incluídas apenas em projetos que localizam adequadamente seu software.
kayleeFrye_onDeck
3
O restante do seu programa (além das bibliotecas padrão) usa identificadores em inglês ou holandês?
user253751
Por enquanto, usamos apenas o inglês, mas atualmente os departamentos são os únicos dados codificados do usuário, porque o departamento de um determinado projeto desempenha um grande papel em nosso aplicativo. Outros valores holandeses são salvos em nosso banco de dados, portanto, não são codificados.
Jelle

Respostas:

33

Nesse cenário, eu deixaria os valores de enum em holandês:

public enum Department { BOUW, ONDERHOUD }

Porque a lógica usando essas constantes será compatível com os dados que também estão em holandês . Por exemplo, se a entrada for "bouw", o código de comparação pode se parecer com:

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

Acho mais fácil depurar quando os valores correspondem (mesmo que eu não saiba o que os valores significam). A tradução apenas adiciona um aro mental que eu, como desenvolvedor, não deveria ter que pular para provar a correção.

No entanto, você pode apenas comentar o código se isso ajudar outras pessoas a entender o contexto dos dados:

public enum Department { 
    BOUW, /* build */
    ONDERHOUD /* maintenance */
}
bispo
fonte
3
@ Jelle É claro que, se você acabar se expandindo internacionalmente, pode estar contente com a lógica da tradução. YMMV em YAGNI.
Williham Totland 28/11
6
Você não deve comparar suas enumerações com as seqüências diretamente de qualquer maneira. E se você tiver que comparar uma string com várias palavras com um valor enum?
precisa
25
Eu nunca compararia seqüências de caracteres usando .toUpper () e ==, especialmente ao trabalhar com seqüências de caracteres localizadas e de entrada do usuário. Um exemplo disso é o caráter turco "i".
Adriano Repetti
4
@ABoschman Os comentários no final da linha se referem universalmente à linha em que estão. Eu já vi esse tipo de comentário para descrições simples de itens da lista centenas de vezes ...
StarWeaver 29/11/16
13
Em nossa loja, fazemos o oposto do que é sugerido aqui: os nomes enum / const estão em inglês (ou o que passa em inglês) e os comentários são "localizados". Qual é bom. Caso contrário, teríamos todos esses consts com nomes como PAAMAYIM_NEKUDOTAYIM.
Sq33G
59

O inglês é uma língua franca / menor denominador comum por um motivo. Mesmo que o motivo seja conceitualmente tão fraco quanto "Todo mundo faz", esse ainda é um motivo bastante importante.

Ir contra a prática comum significa que você precisa entender holandês para entender as estruturas de dados do seu software. Não há nada errado com o holandês, mas a probabilidade de qualquer engenheiro que precisar interagir com a base de código falar ainda é menor do que a do inglês.

Portanto, se você é um Dutch somente fazer compras, e não planeja se expandir internacionalmente nunca , é quase sempre uma boa idéia para manter o seu monolingual base de código e usar a linguagem de codificação mais popular.

Nota: Este conselho se aplica apenas ao código do programa . Os dados do usuário definitivamente não devem ser traduzidos, mas processados ​​"como estão". Mesmo se você tiver um cliente "Goldstein", claramente você não deve armazenar o nome dele como "pedra dourada".

O problema é que há um continuum de termos entre "fornecido pelo usuário, não toque" e "fragmento de código, use o inglês o tempo todo". Os nomes dos clientes estão muito próximos do primeiro extremo do espectro, as variáveis ​​Java estão próximas do último final. As constantes para enumvalores estão um pouco mais distantes, principalmente se denotarem entidades externas exclusivas e conhecidas (como seus departamentos). Se todos na sua organização usarem os termos holandeses para os departamentos, você não planeja confrontar alguém com a base de código que não usa, e o conjunto de departamentos existentes muda raramente, e usar os nomes aceitos do departamento pode gerar mais sentido para constantes enum do que para variáveis ​​locais. Eu ainda não faria isso, no entanto.

Kilian Foth
fonte
3
+1, nesse caso, usar o inglês fornece o código de legibilidade e reutilização, que é divulgado nesta resposta. Ao fazê-lo holandês quebra-los de alguma forma.
Mikhail Churbanov 28/11
4
@Jelle O nome tem um significado semântico para o código? Se sim, traduza - você precisa de uma tradução do conceito de qualquer maneira. Se não, por que você tem um enumpara isso? Isso pode ser apenas um sinal de que você está tentando modelar dados em código, o que pode ser uma má ideia.
Luaan 28/11
29
Discordo totalmente dessa idéia de traduzir geralmente terminologia específica de domínio. Em alguns domínios, por exemplo, no setor ferroviário, os glossários de diferentes idiomas ou até territórios diferem tanto que qualquer tentativa de traduzir um único termo distorce tanto o significado que você impede que alguém o entenda. A menos que você tenha certeza absoluta de que o domínio do aplicativo permite a conversão sem perdas, não traduza a terminologia do domínio .
Rhymoid
6
Também ouvi do meu líder de projeto que, em outro projeto, desenvolvedores estamos traduzindo alguns objetos de domínio do holandês para o inglês, e ficou mais claro no final do projeto o que esses objetos significavam devido a essas traduções personalizadas.
Jelle
4
Leia os comentários de @Rhymoid e Jelle novamente. Nunca faça suas próprias traduções de terminologia de domínio! Se você decidir usar os termos em inglês para entidades de nome holandês, certifique-se de usar uma tradução oficial, não a sua.
Guran
15

Evite a tradução sempre que possível, porque toda tradução é um esforço adicional e pode apresentar bugs.

A principal contribuição do "Domain Driven Design" para a engenharia de software moderna é o conceito de uma linguagem onipresente , que é uma linguagem única usada por todos os interessados ​​em um projeto. De acordo com o DDD, a tradução não deve ocorrer dentro de uma equipe (que inclui especialistas em domínio, mesmo que presentes apenas por procuração de um documento de especificação), mas apenas entre equipes (leitura adicional: "Domain Driven Design", de Eric Evans, em particular os capítulos sobre linguagem ubíqua e design estratégico).

Ou seja, se seus especialistas em negócios (ou seu documento de especificação) falam holandês, use a terminologia (holandesa) ao expressar preocupações comerciais no código-fonte. Não traduza desnecessariamente para o inglês, pois isso cria um impedimento artificial para a comunicação entre especialistas em negócios e programadores, que leva tempo e pode (através de tradução ambígua ou incorreta) causar bugs.

Se, por outro lado, seus especialistas em negócios podem falar sobre os negócios deles em inglês e holandês, você tem a oportunidade de escolher o idioma onipresente do projeto e há razões válidas para preferir o inglês (como "internacionalmente compreensível e provavelmente mais usado pelos padrões "), mas isso não significa que os codificadores devem traduzir o que as pessoas de negócios estão falando. Em vez disso, os executivos devem mudar de idioma.

Ter uma linguagem onipresente é particularmente importante se os requisitos forem complexos e precisarem ser implementados com precisão, se você estiver apenas usando o CRUD, a linguagem usada internamente é menos importante.

História pessoal: participei de um projeto em que expusemos alguns serviços de negócios como um ponto de extremidade SOAP. O negócio foi totalmente especificado em alemão e dificilmente será reutilizado como em inglês, porque tratava de questões legais específicas de uma jurisdição específica. No entanto, alguns arquitetos de torres de marfim exigiram que a interface SOAP fosse em inglês para promover reutilização futura. Essa tradução ocorreu no hoc, e com pouca coordenação entre os desenvolvedores, ainda um glossário compartilhado, resultando no mesmo termo comercial tendo vários nomes no contrato de serviço da web e alguns termos comerciais tendo o mesmo nome no contrato de serviço da web. Ah, e é claro que alguns nomes foram usados ​​em ambos os lados da divisão - mas com significados diferentes!

Se você optar por traduzir de qualquer maneira, padronize a tradução em um glossário, adicione conformidade com esse glossário à sua definição de concluído e verifique-a em suas revisões. Não seja tão descuidado quanto nós.

meriton - em greve
fonte
5
Os especialistas em negócios falarão inglês. A proficiência em inglês entre os holandeses instruídos na força de trabalho é de 100%.
MSalters
4
Falar inglês é uma coisa. Ser capaz de fazer traduções de qualidade da terminologia de domínio holandês para o inglês é outra completamente diferente.
Guran
1
@MSalters: Proficiente em que nível? No projeto de que falei, todos foram capazes de falar inglês, mas não estavam em nenhum lugar tão proficientes quanto em alemão. Por exemplo, havia um método getAdminRollque verificava a função de administrador ... (a palavra alemã é "Rolle", e eles soltavam a letra errada :-)
meriton - em greve
@Guran: Na verdade, isso é geralmente o contrário: seu especialista em domínio pode prejudicar a gramática inglesa e ter problemas com conversas pequenas, mas eles sabem a terminologia do domínio em inglês. Os programadores podem ser o maior problema: seu domínio é software, o que significa que eles conhecem esse vocabulário, mas não necessariamente o vocabulário comercial.
MSalters
@meriton: Na verdade, não é um erro tão estranho, considerando que "roll" é um sufixo em inglês, por exemplo , folha de pagamento , do rolle francês . Em média, a fluência em inglês na Holanda é significativamente maior que na Alemanha. Por exemplo, eu ainda não esperava que as universidades alemãs mudassem para o inglês como língua falada. E enviar uma tese em alemão ainda é considerado normal, eu acho?
MSalters
9

A solução correta é não codificar os departamentos:

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

Ou, se você precisar absolutamente de um tipo de departamento:

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

Se você achar necessário testar departamentos específicos em seu código, precisará perguntar de maneira mais genérica o que há de especial nesse departamento e aceitar a configuração desse departamento como tendo essa propriedade. Por exemplo, se um departamento tiver uma folha de pagamento semanal, e é com isso que o código se importa, deve haver uma propriedade WEEKLY_PAYROLL que possa ser anexada a qualquer departamento pela configuração.

DepressedDaniel
fonte
Este. O que acontece quando uma partida é dividida ou combinada ou se forma uma nova? Este código se adaptará mais ou menos automaticamente; transformá-lo em enum significa que você precisa de uma nova compilação ou ela explodirá.
jpmc26
1
Isso seria uma solução se os departamentos não tivessem um papel tão importante em nosso aplicativo. Temos muitas if (project.getDepartment().equals(Department.XYZ))declarações.
Jelle
@Jelle como sobre uma project.isForDepartment("XYZ"), que por sua vez usa hashmap de Daniel (que é injetado no projeto, ou algo)
SAT
2
@ SAT, que está apenas pedindo erro de digitação de, honestamente ...
Jelle
@ Jelle Sim, mas pode ser capturado em tempo de execução. Os testes também podem pegá-los no tempo de compilação. (Embora eu entendo de onde você está vindo, e eu faço tipo de acordo.)
SAT
3

Para qualquer pessoa que esteja se perguntando: escolhemos a primeira opção, principalmente porque achamos que você não deve criar termos para traduzir. No entanto, se algum dia um desenvolvedor internacional estiver trabalhando no projeto, adicionamos alguma documentação para explicar isso:

/** The possible departments of a project, given in the Dutch language. */
public enum Department { BOUW, ONDERHOUD }
Jelle
fonte
Que bom que você encontrou uma abordagem satisfatória. 😀 A resposta aceita parece diferir da abordagem escolhida. Por favor, considere alterar a resposta aceita para uma das outras que corresponda à sua abordagem escolhida.
bispo
Eu mudei a resposta aceita. No entanto, dada a variedade de votos, acho que também é uma escolha pessoal e escolhi essa abordagem.
Jelle
2

Se você está preocupado em ter uma representação de string para mostrar ao usuário ou algo assim, basta definir uma matriz de descrições dentro de sua enumeração e expor um método.
Por exemplo: Department.BUILD.getDescription();exibirá "BOUW"

public enum Department { 
    BUILD,
    MAINTENANCE;

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

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

Eu sei que você escolheu o contrário, mas apenas no caso do vórtice do Google lançar pessoas aqui por acidente.

EDIT: Como observado por Pokechu22, você pode usar enum construtores e propriedades 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;
    }
}

o que também alcançará esse efeito.

Faísca
fonte
1
Você não precisa de uma matriz. Em java, enums podem ter construtores (privados) e campos.
precisa saber é o seguinte
1
@ Pokechu22, mas o valor ou o ordinal disponível no construtor pode ser compatível com a descrição? Quero dizer, você ainda precisaria de uma matriz dentro do construtor para obter a descrição correta, certo?
SparK
1
Não, você pode fazê-lo como este: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 Adicionado à resposta. Também notei que, se a matriz aumentar, minha implementação poderá ser interrompida e aumentada em 2 linhas a cada vez, enquanto a sua aumentará 1 linha e não quebrará as referências.
SparK
0

Certos invariantes do seu código são esperados. Um desses invariantes é que um programa não se comportará de maneira diferente quando um identificador for renomeado. Nesse caso em particular, quando você tem uma enumeração e renomeia qualquer membro dessa enumeração e atualiza todos os usos desse membro, não esperaria que seu código começasse a funcionar de maneira diferente.

A análise é o processo de leitura de dados e derivação de estruturas de dados. Quando você pega os dados externos, lê-os e cria instâncias da sua enumeração, está analisando os dados. Esse processo de análise é a única parte do seu programa responsável por manter a relação entre a representação de dados como você a recebe e a forma e a nomeação dos membros de seus tipos de dados.

Como tal, não deve importar quais nomes você atribui aos membros da enum. O fato de coincidirem com as strings usadas nos dados que você lê é coincidência.

Quando você cria seu código para modelar o domínio, os nomes dos membros não devem estar relacionados ao formato de serialização dos dados. Eles não devem ser os termos holandeses, nem devem ser traduções dos termos holandeses, mas devem ser o que você decide se encaixa melhor no modelo de domínio.

O analisador que traduz entre o formato dos dados e o modelo do seu domínio. Essa é a última influência que o formato de dados deve ter no seu código.

Martijn
fonte