Перевод внешних данных на язык программирования

39

Я не уверен, что делать со следующим:

Мы берем данные из внешнего инструмента в нашем собственном инструменте. Эти данные написаны на голландском языке. Мы пишем наш Java-код на английском языке. Должны ли мы затем перевести этот голландский на английский или оставить его на голландском? Например, у нас есть 2 отдела: Bouw (строительство на английском языке) и Onderhoud (обслуживание на английском языке).

Тогда было бы логично создать:

public enum Department { BOUW, ONDERHOUD }

или:

public enum Department { CONSTRUCTION, MAINTENANCE }

или даже:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling - это отдел на голландском языке)

Элле
источник
3
Возможный дубликат неанглийских соглашений об именах
gnat
3
Я думаю, это не дубликат, потому что я говорю о внешних данных, а не о наших собственных данных приложений, которые названы на английском языке.
Jelle
1
При использовании неанглийских объектов данных или источника в целом полезно иметь справочную таблицу перевода приблизительного английского эквивалента для каждой функции и объекта данных. Это особенно актуально для имен функций и объектов, которые используют несколько слов, что довольно часто встречается в некоторых языках. Мне приходилось исправлять ошибки не на моем родном языке, абсолютно не зная языка, но из-за наличия словаря перевода для этой программы это было тривиально. Обычно библиотеки программного перевода включены только в проекты, которые правильно локализовали свое программное обеспечение.
kayleeFrye_onDeck
3
Использует ли остальная часть вашей программы (кроме стандартных библиотек) английские или голландские идентификаторы?
user253751
На данный момент мы использовали только английский, но отделы в настоящее время являются единственными жестко закодированными пользовательскими данными, потому что отдел нашего проекта играет большую роль в нашем приложении. Другие голландские значения сохраняются в нашей базе данных, поэтому они не жестко закодированы.
Jelle

Ответы:

33

В этом сценарии я бы оставил значения enum на голландском:

public enum Department { BOUW, ONDERHOUD }

Потому что логика, использующая эти константы, будет сопоставляться с данными на голландском языке . Например, если ввод «bouw», код сравнения может выглядеть так:

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

Мне легче отлаживать, когда значения совпадают (даже если я не знаю, что означают значения). Перевод просто добавляет умственный обруч, который я, как разработчик, не должен перепрыгивать, чтобы доказать правильность.

Тем не менее, вы можете просто прокомментировать код, если он помогает другим понять контекст данных:

public enum Department { 
    BOUW, /* build */
    ONDERHOUD /* maintenance */
}
епископ
источник
3
@Jelle Конечно, если вы когда-нибудь расширились на международном уровне, вы все равно будете рады логике перевода. YMMV на ЯГНИ.
Виллихам Тотланд
6
Вы все равно не должны сравнивать свои перечисления со строками напрямую. Что если вам нужно сравнить строку с несколькими словами со значением перечисления?
Йорген Фог
25
Я бы никогда не сравнил строки, используя .toUpper () и ==, особенно при работе с пользовательским вводом и локализованными строками. Школьным примером этого является турецкий символ «я».
Адриано Репетти
4
@ABoschman Комментарии в конце строки повсеместно относятся к строке, в которой они находятся. Я видел этот тип комментариев для простых описаний элементов списка сотни раз…
StarWeaver
13
В нашем магазине мы делаем противоположное тому, что предлагается здесь: имена enum / const указаны на английском языке (или то, что подходит для английского языка), а комментарии «локализованы». И это хорошо. В противном случае у нас были бы все эти консты с такими именами PAAMAYIM_NEKUDOTAYIM.
sq33G
59

Английский является лингва франка / наименьший общий знаменатель по причине. Даже если причина концептуально так же слаба, как «Все так делают», это все же довольно важная причина.

Отказ от общепринятой практики означает, что вы должны понимать голландский язык, чтобы понять структуру данных в программном обеспечении. В нидерландском языке нет ничего плохого, но вероятность того, что любой конкретный инженер, которому придется взаимодействовать с базой кода, говорит, что он все еще ниже, чем в английском.

Поэтому, если вы не голландский только магазин, и не планируете расширять международно - либо , это почти всегда идея хорошо держать одноязычную кодовую базу, и используйте самый популярный язык кодирования.

Примечание. Этот совет относится только к коду программы . Пользовательские данные не должны определенно переводиться, а обрабатываться «как есть». Даже если у вас есть клиент «Goldstein», очевидно, что вы не должны хранить его имя как «золотой камень».

Беда в том, что между терминами «пользователь, не трогай» и «фрагмент кода, всегда используй английский язык» существует целый ряд терминов. Имена клиентов очень близки к первому концу спектра, а переменные Java - ко второму концу. Константы enumзначений находятся немного дальше, особенно если они обозначают известные, уникальные внешние объекты (например, ваши отделы). Если все в вашей организации используют голландские термины для отделов, вы не планируете ставить кого-то в негодность с кодовой базой, а набор существующих отделов меняется редко, тогда использование принятых названий отделов может сделать больше смысл для констант перечисления, чем для локальных переменных. Я все еще не сделал бы это, все же.

Килиан Фот
источник
3
+1, использование английского в этом случае дает вам код Readability and Reusability, которое раскрывается в этом ответе. Делая это, голландцы ломают их в некотором роде.
Михаил Чурбанов
4
@Jelle Имя имеет семантическое значение для кода? Если да, переведите его - вам все равно нужен перевод концепции. Если нет, почему у вас есть enumдля этого? Это может быть просто признаком того, что вы пытаетесь смоделировать данные в коде, что может быть плохой идеей.
Луаан
29
Я категорически не согласен с этой идеей общего перевода предметно-ориентированной терминологии. В некоторых областях, например, в железнодорожной отрасли, глоссарии разных языков или даже территорий отличаются настолько сильно, что любая попытка перевести хотя бы один термин искажает значение настолько сильно, что вы мешаете любому понять его. Если вы не уверены, что домен приложения позволяет переводить без потерь, не переводите терминологию домена .
Рифмоид
6
Я также слышал от моего руководителя проекта, что в другом проекте, разработчики, мы переводим некоторые доменные объекты с голландского на английский, и позже в проекте стало неясно, что эти объекты имели ввиду из-за этих пользовательских переводов.
Желе
4
Прочитайте комментарии @Rhymoid и Jelle еще раз. Никогда не делайте собственных переводов терминологии домена! Если вы решили использовать английские термины для голландских имен, обязательно используйте официальный перевод, а не свой собственный.
Гуран
15

По возможности избегайте перевода, потому что каждый перевод требует дополнительных усилий и может привести к ошибкам.

Ключевым вкладом «Domain Driven Design» в современную разработку программного обеспечения является концепция повсеместно распространенного языка , который является единственным языком, используемым всеми заинтересованными сторонами проекта. Согласно DDD, перевод не должен происходить внутри команды (которая включает экспертов по предметной области, даже если она представлена ​​только через прокси-документ спецификации), а только между командами (далее: Эрик Эванс, Эрик Эванс, в частности главы "Проект, управляемый доменом") о вездесущем языке и стратегическом дизайне).

То есть, если ваши бизнес-эксперты (или ваш документ спецификации) говорят на нидерландском языке, используйте их (нидерландскую) терминологию при выражении деловых проблем в исходном коде. Не нужно без необходимости переводить на английский, потому что это создает искусственное препятствие для общения между бизнес-экспертами и программистами, что требует времени и может (из-за неоднозначного или плохого перевода) вызвать ошибки.

Если, напротив, ваши бизнес-эксперты могут говорить о своем бизнесе как на английском, так и на голландском языках, вам повезло, что вы можете выбрать повсеместный язык проекта, и есть веские причины для предпочтения английского языка (например, «понятный на международном уровне и более вероятно, что будут использоваться стандартами »), но это не означает, что кодировщики должны переводить то, о чем говорят деловые люди. Вместо этого деловые люди должны переключать языки.

Наличие вездесущего языка особенно важно, если требования сложны и должны быть точно реализованы, если вы просто используете CRUD, язык, который вы используете внутри, имеет меньшее значение.

Личный анекдот: я был в проекте, где мы представили некоторые бизнес-сервисы как конечную точку SOAP. Бизнес был полностью указан на немецком языке и вряд ли будет использоваться повторно, как на английском, потому что речь шла о юридических вопросах, специфичных для конкретной юрисдикции. Тем не менее, некоторые архитекторы башни из слоновой кости предписали, чтобы интерфейс SOAP был английским, чтобы способствовать повторному использованию в будущем. Этот перевод произошел на месте и с небольшой координацией между разработчиками, но только с общим глоссарием, что привело к тому, что один и тот же бизнес-термин имел несколько имен в контракте на веб-службу, а некоторые бизнес-термины имели одинаковое имя в контракте на веб-службу. О, и, конечно, некоторые имена, которые используются по обе стороны от пропасти - но имеют разные значения!

Если вы все равно решите перевести, пожалуйста, стандартизируйте перевод в глоссарии, добавьте соответствие этому глоссарию в свое определение выполненного и проверьте его в своих обзорах. Не будь таким беспечным, как мы.

меритон - забастовка
источник
5
Бизнес-эксперты будут говорить по-английски. Знание английского языка среди образованных голландцев в рабочей силе составляет 100%.
MSalters
4
Говорить по-английски это одно. Возможность качественного перевода терминологии голландского домена на английский - это совсем другое.
Гуран
1
@MSalters: на каком уровне? В проекте, о котором я говорил, все могли говорить по-английски, но они нигде не владели языком так хорошо, как по-немецки. Например, был метод, getAdminRollкоторый проверял роль администратора ... (немецкое слово "Rolle", и они
пропустили
@Guran: На самом деле, обычно все наоборот: ваш эксперт по домену может испортить грамматику английского языка и столкнуться с проблемами при разговоре, но он будет знать терминологию своего домена на английском языке. Программисты могут быть большей проблемой: их область - программное обеспечение, что означает, что они знают этот словарь, но не обязательно деловой словарь.
MSalters
@meriton: На самом деле это не такая странная ошибка, учитывая, что «roll» - это суффикс английского языка, например , платежная ведомость , из французского ролла . В среднем, беглость английского языка в Нидерландах значительно выше, чем в Германии. Например, я бы еще не ожидал, что немецкие университеты перейдут на английский в качестве разговорного языка. А подать диссертацию на немецком языке по-прежнему считается нормальным, как мне кажется?
MSalters
9

Правильное решение заключается в том, чтобы вообще не кодировать отделы:

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

Или, если вам абсолютно необходим тип отдела:

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

Если вы обнаружите, что в своем коде нужно проверить определенные отделы, вам нужно более подробно спросить, что особенного в этом отделе, и согласиться с настройкой этого отдела как имеющего это свойство. Например, если в одном отделе еженедельная заработная плата, и это заботит код, то должно быть свойство WEEKLY_PAYROLL, которое может быть присоединено к любому отделу с помощью конфигурации.

DepressedDaniel
источник
Это. Что происходит, когда отправление разделяется или объединяется или формируется новый? Этот код будет адаптироваться более или менее автоматически; превращение его в перечисление означает, что вам нужна новая сборка, иначе она взорвется.
jpmc26
1
Это было бы решением, если бы отделы не играли такой большой роли в нашем приложении. У нас много if (project.getDepartment().equals(Department.XYZ))заявлений.
Jelle
@Jelle, как насчет a project.isForDepartment("XYZ"), который, в свою очередь, использует hashmap Даниэля (который внедряется в Project или что-то в этом роде)
SáT
2
@ SáT, Честно говоря, это просто опечатка ...
Jelle
@Jelle Да, но это можно поймать во время выполнения. Тесты тоже могут их поймать во время компиляции. (Хотя я понимаю, откуда ты, и я вроде как согласен.)
SAT
3

Для всех, кто интересуется: мы выбрали первый вариант, главным образом потому, что считаем, что вам не следует придумывать термины ради перевода. Однако, если когда-нибудь над проектом будет работать международный разработчик, мы добавили некоторую документацию, чтобы объяснить это:

/** The possible departments of a project, given in the Dutch language. */
public enum Department { BOUW, ONDERHOUD }
Элле
источник
Рад, что вы нашли удовлетворительный подход. 😀 Однако принятый ответ отличается от выбранного вами подхода. Пожалуйста, рассмотрите возможность изменения принятого ответа на другой, который соответствует выбранному вами подходу.
епископ
Я изменил принятый ответ. Однако, учитывая диапазон голосов, я думаю, что это также личный выбор, и я выбрал этот подход.
Jelle
2

Если вас беспокоит наличие строкового представления для отображения пользователя или чего-то еще, просто определите массив описаний внутри вашего перечисления и предоставьте метод.
Например: Department.BUILD.getDescription();будет выводить "BOUW"

public enum Department { 
    BUILD,
    MAINTENANCE;

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

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

Я знаю, что вы выбрали иначе, но на всякий случай вихрь Google бросает людей сюда случайно.

РЕДАКТИРОВАТЬ: Как отметил Pokechu22 вы можете использовать конструкторы enum и частные свойства, как это:

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

    private final String description;

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

    public String getDescription() {
        return description;
    }
}

который также достигнет этого эффекта.

искра
источник
1
Вам не нужен массив. В Java перечисления могут иметь (частные) конструкторы и поля.
Pokechu22
1
@ Pokechu22, но доступно ли значение или порядковый номер в конструкторе, чтобы можно было сопоставить его с описанием? Я имею в виду, вам все еще нужен массив внутри de constructor, чтобы получить правильное описание, верно?
SparK
1
Нет, вы можете сделать это так: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 Добавлено в ответ. Я также заметил, что в случае увеличения массива моя реализация может каждый раз ломаться и увеличиваться на 2 строки, а ваша увеличит одну строку и не будет прерывать ссылки.
SparK
0

Ожидается, что некоторые инварианты вашего кода будут храниться. Одним из таких инвариантов является то, что программа не будет вести себя иначе, когда идентификатор переименован. В частности, в этом случае, когда у вас есть перечисление, и вы переименовываете любого члена этого перечисления и обновляете все использования этого члена, вы не ожидаете, что ваш код начнет работать по-другому.

Синтаксический анализ - это процесс чтения данных и получения структур данных из них. Когда вы берете внешние данные, читаете их и создаете экземпляры вашего перечисления, вы анализируете данные. Этот процесс синтаксического анализа является единственной частью вашей программы, отвечающей за поддержание связи между представлением данных о том, как вы их получаете, а также формой и наименованием членов ваших типов данных.

Таким образом, не должно иметь значения, какие имена вы назначаете членам перечисления. То, что они совпадают со строками, используемыми в прочитанных вами данных, является случайным.

Когда вы разрабатываете свой код для моделирования домена, имена членов не должны быть связаны с форматом сериализации данных. Они не должны быть ни голландскими терминами, ни переводом голландских терминов, но они должны соответствовать тому, что вы решаете, лучше всего подходит для модели предметной области.

Синтаксический анализатор переводит между форматом данных и моделью вашего домена. Это последнее влияние, которое формат данных должен иметь на ваш код.

Мартейн
источник