Übersetzen externer Daten in die Sprache, in der Sie programmieren

39

Ich bin nicht sicher, was ich mit Folgendem anfangen soll:

Wir nehmen Daten von einem externen Tool innerhalb unseres eigenen Tools. Diese Daten sind in niederländischer Sprache verfasst. Wir schreiben unseren Java-Code in Englisch. Sollten wir dieses Niederländisch dann ins Englische übersetzen oder es Niederländisch behalten? Zum Beispiel haben wir zwei Abteilungen: Bouw (Konstruktion in Englisch) und Onderhoud (Wartung in Englisch).

Wäre es dann logisch anzulegen:

public enum Department { BOUW, ONDERHOUD }

oder:

public enum Department { CONSTRUCTION, MAINTENANCE }

oder auch:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling is Department auf Niederländisch)

Jelle
quelle
3
Mögliches Duplikat Non-English Naming Conventions
gnat
3
Ich denke, es ist kein Duplikat, da es sich um externe Daten handelt und nicht um unsere eigenen Anwendungsdaten, die auf Englisch benannt sind.
Jelle
1
Wenn Sie nicht-englische Datenobjekte oder Quellen im Allgemeinen verwenden, ist es hilfreich, für jede Funktion und jedes Datenobjekt eine Referenztabelle für die Übersetzung des ungefähren englischen Äquivalents zu haben. Dies ist besonders relevant für Funktions- und Objektnamen, die mehrere Wörter verwenden, was in einigen Sprachen häufig vorkommt. Ich musste Fehler beheben, die sich nicht in meiner Muttersprache befanden, aber da ich ein Übersetzungswörterbuch für dieses Programm hatte, war es trivial. In der Regel sind programmatische Übersetzungsbibliotheken nur in Projekten enthalten, deren Software ordnungsgemäß lokalisiert wurde.
kayleeFrye_onDeck
3
Verwendet der Rest Ihres Programms (abgesehen von Standardbibliotheken) englische oder niederländische Bezeichner?
user253751
Bisher haben wir nur Englisch verwendet, aber die Abteilungen sind derzeit die einzigen fest codierten Benutzerdaten, da die Abteilung eines bestimmten Projekts eine große Rolle in unserer Anwendung spielt. Andere niederländische Werte werden in unserer Datenbank gespeichert, sodass sie nicht fest codiert sind.
Jelle

Antworten:

33

In diesem Szenario würde ich die Enum- Werte auf Niederländisch belassen :

public enum Department { BOUW, ONDERHOUD }

Weil die Logik, die diese Konstanten verwendet, mit Daten übereinstimmt , die auch auf Niederländisch vorliegen . Wenn die Eingabe beispielsweise "bouw" lautet, sieht der Vergleichscode möglicherweise folgendermaßen aus:

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

Ich finde es einfacher zu debuggen, wenn die Werte übereinstimmen (auch wenn ich nicht weiß, was die Werte bedeuten). Die Übersetzung fügt nur einen mentalen Rahmen hinzu, durch den ich als Entwickler nicht springen muss, um die Richtigkeit zu beweisen.

Sie können den Code jedoch nur kommentieren, wenn er anderen hilft, den Kontext der Daten zu verstehen:

public enum Department { 
    BOUW, /* build */
    ONDERHOUD /* maintenance */
}
Bischof
quelle
3
@Jelle Wenn Sie einmal international expandieren, ist die Übersetzungslogik vielleicht trotzdem eine gute Idee. YMMV auf YAGNI.
Williham Totland
6
Sie sollten Ihre Aufzählungen sowieso nicht direkt mit Strings vergleichen. Was ist, wenn Sie eine Zeichenfolge mit mehreren Wörtern mit einem Aufzählungswert vergleichen müssen?
Jørgen Fogh
25
Ich würde niemals Zeichenfolgen mit .toUpper () und == vergleichen, insbesondere wenn ich mit Benutzereingaben und lokalisierten Zeichenfolgen arbeite. Ein Schulbuchbeispiel dafür ist das türkische "i" -Zeichen.
Adriano Repetti
4
@ABoschman Zeilenende-Kommentare beziehen sich allgemein auf die Zeile, in der sie sich befinden. Ich habe diesen Kommentartyp hunderte Male für einfache Beschreibungen von Listenelementen gesehen…
StarWeaver
13
In unserem Shop machen wir das Gegenteil von dem, was hier vorgeschlagen wird: Die Namen der Aufzählungen / Konstanten sind in Englisch (oder was für Englisch gilt), und die Kommentare sind "lokalisiert". Was gut ist. Sonst hätten wir all diese consts mit Namen wie PAAMAYIM_NEKUDOTAYIM.
sq33G
60

Englisch ist aus einem bestimmten Grund eine Verkehrssprache / der kleinste gemeinsame Nenner. Auch wenn der Grund konzeptionell so schwach ist wie "Jeder tut es", ist das immer noch ein ziemlich wichtiger Grund.

Gegen die gängige Praxis zu verstoßen bedeutet, dass Sie Niederländisch verstehen müssen, um die Datenstrukturen in Ihrer Software zu verstehen. Es ist nichts Falsches an Holländisch, aber die Wahrscheinlichkeit, dass ein Ingenieur, der mit der Codebasis interagieren muss, es spricht, ist immer noch geringer als die für Englisch.

Deshalb , wenn Sie ein Dutch-only Shop sind, und nicht planen , international expandieren immer , es ist fast immer eine gute Idee , um Ihre Codebasis einsprachigen zu halten, und verwenden Sie die beliebtestene Codierung Sprache.

Hinweis: Dieser Hinweis gilt nur für Programmcode . Benutzerdaten sollten definitiv nicht übersetzt, sondern unverändert verarbeitet werden. Selbst wenn Sie einen Kunden "Goldstein" haben, sollten Sie dessen Namen eindeutig nicht als "Goldstein" speichern.

Das Problem ist, dass es ein Kontinuum von Begriffen zwischen "Vom Benutzer bereitgestellt, nicht berühren" und "Codefragment, immer Englisch verwenden" gibt. Kundennamen befinden sich ganz in der Nähe des früheren Endes des Spektrums, Java-Variablen ganz in der Nähe des späteren Endes. Konstanten für enumWerte sind etwas weiter weg, vor allem , wenn sie bekannte, einzigartige externe Entitäten bezeichnen (wie Ihre Abteilungen). Wenn jeder in Ihrer Organisation die niederländischen Begriffe für die Abteilungen verwendet, planen Sie nicht, jemanden mit der Codebasis zu konfrontieren, der dies nicht tut, und der Satz der vorhandenen Abteilungen ändert sich selten. Die Verwendung der akzeptierten Namen der Abteilung kann mehr bewirken Sinn für Enum-Konstanten als für lokale Variablen. Ich würde es trotzdem nicht tun.

Kilian Foth
quelle
3
+1, wenn Sie in diesem Fall Englisch verwenden, erhalten Sie Code-Lesbarkeit und Wiederverwendbarkeit, die in dieser Antwort offenbart werden. Während Dutch es schafft, werden sie auf irgendeine Weise zerbrochen.
Mikhail Churbanov
4
@ Jelle Hat der Name eine semantische Bedeutung für den Code? Wenn ja, übersetzen Sie es - Sie benötigen trotzdem eine Übersetzung des Konzepts. Wenn nicht, warum hast du eine enumdafür? Das könnte nur ein Zeichen dafür sein, dass Sie versuchen, Daten in Code zu modellieren, was möglicherweise eine schlechte Idee ist.
Luaan
29
Ich stimme dieser Idee, domänenspezifische Terminologie generell zu übersetzen, überhaupt nicht zu. In einigen Bereichen, zum Beispiel in der Eisenbahnindustrie, unterscheiden sich die Glossare verschiedener Sprachen oder sogar Gebiete so sehr, dass jeder Versuch, auch nur einen einzigen Begriff zu übersetzen, die Bedeutung so stark verzerrt, dass Sie verhindern, dass ihn jemand versteht. Übersetzen Sie keine Domänenterminologie, es sei denn, Sie sind absolut sicher, dass die Anwendungsdomäne eine verlustfreie Übersetzung ermöglicht .
Rhymoid
6
Ich hörte auch von meinem Projektleiter, dass in einem anderen Projekt Entwickler einige Domänenobjekte von Niederländisch nach Englisch übersetzen. Später im Projekt wurde unklar, was diese Objekte aufgrund dieser benutzerdefinierten Übersetzungen bedeuteten.
Jelle
4
Lesen Sie die Kommentare von @ Rhymoid und Jelle noch einmal. Machen Sie niemals Ihre eigenen Übersetzungen der Domain-Terminologie! Wenn Sie sich für die Verwendung von englischen Begriffen für niederländischsprachige Unternehmen entscheiden, stellen Sie sicher, dass Sie eine offizielle Übersetzung verwenden, nicht Ihre eigene.
Guran
15

Vermeiden Sie nach Möglichkeit Übersetzungen, da jede Übersetzung zusätzlichen Aufwand bedeutet und Fehler verursachen kann.

Der Hauptbeitrag von "Domain Driven Design" zur modernen Softwareentwicklung ist das Konzept einer Ubiquitous Language , einer einzigen Sprache, die von allen Beteiligten eines Projekts verwendet wird. Laut DDD sollte die Übersetzung nicht innerhalb eines Teams (zu dem Domain-Experten gehören, auch wenn diese nur durch einen Vertreter eines Spezifikationsdokuments anwesend sind) erfolgen, sondern nur zwischen Teams (weiterlesen: "Domain Driven Design" von Eric Evans, insbesondere die Kapitel) über Ubiquitous Language und strategisches Design).

Das heißt, wenn Ihre Geschäftsexperten (oder Ihr Spezifikationsdokument) Niederländisch sprechen, verwenden Sie deren (niederländische) Terminologie, wenn Sie geschäftliche Bedenken im Quellcode äußern. Übersetzen Sie nicht unnötigerweise ins Englische, da dies ein künstliches Hindernis für die Kommunikation zwischen Geschäftsexperten und Programmierern darstellt, das Zeit in Anspruch nimmt und (durch mehrdeutige oder schlechte Übersetzungen) Fehler verursachen kann.

Wenn Ihre Geschäftsexperten dagegen sowohl auf Englisch als auch auf Niederländisch über ihr Geschäft sprechen können, sind Sie in der glücklichen Lage, die allgegenwärtige Sprache des Projekts zu wählen, und es gibt triftige Gründe, Englisch zu bevorzugen (wie "international verständlich und") eher von Standards verwendet werden "), aber dies bedeutet nicht, dass Programmierer übersetzen sollten, wovon die Geschäftsleute sprechen. Stattdessen sollten die Geschäftsleute die Sprache wechseln.

Eine allgegenwärtige Sprache ist besonders wichtig, wenn die Anforderungen komplex sind und präzise umgesetzt werden müssen. Wenn Sie nur CRUD ausführen, ist die Sprache, die Sie intern verwenden, weniger wichtig.

Persönliche Anekdote: Ich war in einem Projekt, in dem wir einige Geschäftsdienste als SOAP-Endpunkt bekannt gemacht haben. Das Unternehmen wurde vollständig in deutscher Sprache angegeben und es ist unwahrscheinlich, dass es wie in englischer Sprache wiederverwendet wird, da es sich um rechtliche Angelegenheiten handelte, die für eine bestimmte Gerichtsbarkeit spezifisch sind. Einige Architekten des Elfenbeinturms forderten jedoch, dass die SOAP-Schnittstelle englisch sein sollte, um die zukünftige Wiederverwendung zu fördern. Diese Übersetzung erfolgte bei hoc und mit geringer Koordination zwischen den Entwicklern, jedoch allein mit einem gemeinsamen Glossar, was dazu führte, dass derselbe Geschäftsbegriff mehrere Namen im Webservicevertrag und einige Geschäftsbegriffe denselben Namen im Webservicevertrag aufwiesen. Oh, und natürlich wurden einige Namen auf beiden Seiten der Kluft verwendet - aber mit unterschiedlichen Bedeutungen!

Wenn Sie sich dennoch für eine Übersetzung entscheiden, standardisieren Sie die Übersetzung in einem Glossar, fügen Sie der Definition von "erledigt" die Übereinstimmung mit diesem Glossar hinzu und überprüfen Sie sie in Ihren Überprüfungen. Sei nicht so sorglos wie wir.

Meriton - im Streik
quelle
5
Die Geschäftsexperten sprechen Englisch. Englischkenntnisse unter den gebildeten Niederländern in der Belegschaft sind 100%.
MSalters
4
Englisch sprechen ist eine Sache. Die Möglichkeit, qualitativ hochwertige Übersetzungen der niederländischen Domain-Terminologie ins Englische zu erstellen, ist etwas ganz anderes.
Guran
1
@MSalters: Auf welchem ​​Niveau kompetent? Bei dem Projekt, über das ich gesprochen habe, konnten alle Englisch sprechen, aber sie waren nirgends so gut wie auf Deutsch. Zum Beispiel gab es eine Methode getAdminRoll, die die Administratorrolle überprüfte ... (das deutsche Wort ist "Rolle", und sie haben den falschen Buchstaben fallen gelassen :-)
meriton - am 29.11.16
@Guran: Eigentlich ist das normalerweise umgekehrt: Ihr Domain-Experte verpfuscht möglicherweise die englische Grammatik und hat Probleme mit Smalltalk, aber er kennt seine Domain-Terminologie in Englisch. Die Programmierer könnten das größere Problem sein: Ihre Domäne ist Software, was bedeutet, dass sie dieses Vokabular kennen, aber nicht unbedingt das Geschäftsvokabular.
MSalters
@meriton: Das ist eigentlich nicht so ein seltsamer Fehler, wenn man bedenkt , dass „roll“ ist ein englische Suffix, zB Gehaltsabrechnung , aus Französisch Rolle . Die Englischkenntnisse in den Niederlanden sind im Durchschnitt deutlich höher als in Deutschland. Zum Beispiel würde ich noch nicht erwarten, dass deutsche Universitäten auf Englisch als gesprochene Sprache umstellen. Und das Einreichen einer Arbeit in deutscher Sprache gilt nach wie vor als normal, finde ich?
MSalters
9

Die richtige Lösung besteht darin, die Abteilungen überhaupt nicht hart zu codieren:

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

Oder, wenn Sie unbedingt einen Abteilungstyp benötigen:

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

Wenn Sie feststellen, dass bestimmte Abteilungen in Ihrem Code getestet werden müssen, müssen Sie allgemeiner nach den Besonderheiten dieser Abteilung fragen und akzeptieren, dass diese Abteilung als solche mit dieser Eigenschaft konfiguriert wird. Wenn beispielsweise eine Abteilung wöchentlich abgerechnet wird und der Code sich darum kümmert, sollte es eine WEEKLY_PAYROLL-Eigenschaft geben, die durch die Konfiguration an jede Abteilung angehängt werden kann.

DepressedDaniel
quelle
Diese. Was passiert, wenn ein Abflug aufgeteilt oder kombiniert wird oder sich ein neuer bildet? Dieser Code wird mehr oder weniger automatisch angepasst. Wenn Sie daraus eine Aufzählung machen, benötigen Sie einen neuen Build, da er sonst explodiert.
jpmc26
1
Dies wäre eine Lösung, wenn die Abteilungen in unserer Anwendung keine so große Rolle spielen würden. Wir haben viele if (project.getDepartment().equals(Department.XYZ))Aussagen.
Jelle
@ Jelle wie wäre es mit einer project.isForDepartment("XYZ"), die wiederum Daniels Hashmap verwendet (die in Project oder so etwas eingespritzt wird)
SáT
2
@ SáT, das fragt nur nach Tippfehlern, ehrlich ...
Jelle
@Jelle Ja, aber es kann zur Laufzeit abgefangen werden. Tests könnten sie auch in der Kompilierungszeit erfassen. (Obwohl ich verstehe, woher Sie kommen, und ich bin damit einverstanden.)
SáT
3

Für alle, die sich fragen: Wir haben uns für die erste Option entschieden, vor allem, weil wir der Meinung sind, dass Sie sich für das Übersetzen keine Begriffe ausdenken sollten. Wenn jedoch irgendwann ein internationaler Entwickler an dem Projekt arbeitet, haben wir eine Dokumentation hinzugefügt, um dies zu erläutern:

/** The possible departments of a project, given in the Dutch language. */
public enum Department { BOUW, ONDERHOUD }
Jelle
quelle
Ich bin froh, dass Sie einen zufriedenstellenden Ansatz gefunden haben. 😀 Die akzeptierte Antwort scheint sich jedoch von Ihrem gewählten Ansatz zu unterscheiden. Bitte ziehen Sie in Betracht, die akzeptierte Antwort auf eine der anderen zu ändern, die Ihrem gewählten Ansatz entspricht.
Bischof
Ich habe die akzeptierte Antwort geändert. In Anbetracht der Bandbreite der positiven Stimmen, denke ich, ist dies auch eine persönliche Entscheidung, und ich habe mich für diesen Ansatz entschieden.
Jelle
2

Wenn Sie Bedenken haben, dass dem Benutzer eine Zeichenfolgendarstellung angezeigt wird, definieren Sie einfach ein Beschreibungsarray in Ihrer Enumeration und machen Sie eine Methode verfügbar.
ZB: Department.BUILD.getDescription();wird "BOUW" ausgeben

public enum Department { 
    BUILD,
    MAINTENANCE;

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

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

Ich weiß, dass Sie sich für etwas anderes entschieden haben, aber nur für den Fall, dass der Google-Strudel versehentlich Menschen hierher wirft.

BEARBEITEN: Wie von Pokechu22 bemerkt , können Sie Enum-Konstruktoren und private Eigenschaften wie diese verwenden:

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

    private final String description;

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

    public String getDescription() {
        return description;
    }
}

was auch diesen Effekt erzielen wird.

Funke
quelle
1
Sie brauchen kein Array. In Java können Enums (private) Konstruktoren und Felder haben.
Pokechu22
1
@ Pokechu22, aber ist der Wert oder die Ordnungszahl beim Konstruktor verfügbar, um mit der Beschreibung übereinstimmen zu können? Ich meine, Sie würden immer noch ein Array innerhalb des Konstruktors benötigen, um die richtige Beschreibung zu erhalten, oder?
SparK
1
Nein, Sie können es so machen: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 Zur Antwort hinzugefügt. Ich habe auch festgestellt, dass meine Implementierung bei einer Vergrößerung des Arrays jedes Mal um 2 Zeilen unterbrochen und vergrößert wird, während Ihre Implementierung 1 Zeile vergrößert und Referenzen nicht zerstört.
SparK
0

Es wird erwartet, dass bestimmte Invarianten Ihres Codes gültig sind. Eine dieser Invarianten ist, dass sich ein Programm beim Umbenennen eines Bezeichners nicht anders verhält. Insbesondere in diesem Fall würden Sie nicht erwarten, dass Ihr Code anders funktioniert, wenn Sie eine Aufzählung haben und ein Mitglied dieser Aufzählung umbenennen und alle Verwendungen dieses Mitglieds aktualisieren.

Beim Parsen werden Daten gelesen und daraus Datenstrukturen abgeleitet. Wenn Sie die externen Daten erfassen, lesen und Instanzen Ihrer Aufzählung erstellen, analysieren Sie die Daten. Dieser Parsing-Prozess ist der einzige Teil Ihres Programms, der für die Aufrechterhaltung der Beziehung zwischen der Datendarstellung, wie Sie sie erhalten, und der Form und Benennung der Mitglieder Ihrer Datentypen verantwortlich ist.

Daher sollte es keine Rolle spielen, welche Namen Sie den Mitgliedern der Aufzählung zuweisen. Dass sie zufällig mit Zeichenfolgen übereinstimmen, die in den von Ihnen gelesenen Daten verwendet werden, ist ein Zufall.

Wenn Sie Ihren Code zum Modellieren der Domäne entwerfen, sollten die Namen der Mitglieder nicht mit dem Serialisierungsformat der Daten zusammenhängen. Es sollten weder die niederländischen Begriffe noch Übersetzungen der niederländischen Begriffe sein, aber es sollte das sein, was Sie für das Domain-Modell am besten finden.

Der Parser übersetzt dann zwischen dem Datenformat und Ihrem Domain-Modell. Dies ist der letzte Einfluss, den das Datenformat auf Ihren Code haben sollte.

Martijn
quelle