Переклад зовнішніх даних на мову, якою ви програмуєте


39

Я не впевнений, що робити з наступним:

Ми беремо дані із зовнішнього інструмента в межах власного інструменту. Ці дані написані голландською мовою. Ми пишемо наш код Java англійською мовою. Чи повинні ми тоді перекласти цю голландську на англійську чи зберегти її голландською? Наприклад, у нас є 2 відділи: Bouw (будівництво англійською мовою) та Onderhoud (технічне обслуговування англійською мовою).

То було б логічно створити:

public enum Department { BOUW, ONDERHOUD }

або:

public enum Department { CONSTRUCTION, MAINTENANCE }

або навіть:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling - кафедра голландською мовою)



3
Я думаю, що це не дублікат, оскільки я кажу про зовнішні дані, а не про власні дані програми, які названі англійською мовою.
Джелль

1
Якщо ви використовуєте неанглійські об'єкти даних або джерело взагалі, це допомагає скласти довідкову таблицю перекладу грубого англійського еквівалента для кожної функції та об'єкта даних. Це особливо актуально для імен функцій та об'єктів, які використовують кілька слів, що досить часто зустрічається в деяких мовах. Мені довелося виправляти помилки не рідною мовою, абсолютно не знаючи мови, але завдяки словнику перекладу для цієї програми це було тривіально. Зазвичай бібліотеки програмного перекладу включаються лише в проекти, які правильно локалізували їх програмне забезпечення.
kayleeFrye_onDeck

3
Чи використовує решта програми (крім стандартних бібліотек) англійські чи голландські ідентифікатори?
користувач253751

Наразі ми використовували лише англійську мову, але наразі Департаменти є єдиними жорстко кодованими даними користувачів, оскільки Департамент певного проекту відіграє велику роль у нашій програмі. Інші голландські значення зберігаються в нашій базі даних, тому вони не жорстко кодуються.
Jelle

Відповіді:


33

У цьому сценарії я б залишив значення перерахувань голландською мовою:

public enum Department { BOUW, ONDERHOUD }

Тому що логіка використання цих констант буде відповідати даних, що також є голландською . Наприклад, якщо вхід "bouw", код порівняння може виглядати так:

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

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

Тим не менш, ви можете просто прокоментувати код, якщо він допомагає іншим зрозуміти контекст даних:

public enum Department { 
    BOUW, /* build */
    ONDERHOUD /* maintenance */
}

3
@ Джелле Звичайно, якщо ви коли-небудь закінчите розширюватися на міжнародному рівні, ви все одно можете радіти логіці перекладу. YMMV на YAGNI.
Вілліхам Тотланд

6
Ви ні в якому разі не повинні порівнювати свої перерахунки з рядками. Що робити, якщо вам доведеться порівняти рядок з кількома словами зі значенням enum?
Jørgen Fogh

25
Я ніколи не порівнював би рядки, використовуючи .toUpper () та ==, особливо під час роботи з введенням користувача та локалізованими рядками. Прикладом цього є шкільна книга - турецький "я" характер.
Адріано Репетті

4
@ABoschman Коментарі в кінці рядка повсюдно відносяться до рядка, на якому вони перебувають. Я бачив цей тип коментарів для простого опису предметів у списку сотні разів…
StarWeaver

13
У нашому магазині ми робимо протилежне тому, що тут пропонується: назви enum / const є англійською мовою (або що передається англійською), а коментарі - "локалізовані". Що добре. Інакше ми мали б усі ці змагання з такими іменами PAAMAYIM_NEKUDOTAYIM.
sq33G

59

Англійська мова є причиною мовної мови / найнижчим загальним знаменником. Навіть якщо причина концептуально така слабка, як "Всі роблять це", це все ще досить важлива причина.

Іти проти звичайної практики означає, що ви повинні розуміти голландську мову, щоб зрозуміти структури даних у вашому програмному забезпеченні. З голландською мовою нічого поганого немає, але ймовірність того, що будь-який інженер, якому доведеться взаємодіяти з кодовою базою, говорить, що все-таки нижче, ніж для англійської.

Тому, якщо ви не є лише голландським магазином, і не плануєте розширюватися на міжнародному рівні ніколи , майже завжди є ідеєю зберегти свою кодову базу одномовною і використовувати найпопулярнішу мову кодування.

Примітка. Ця порада стосується лише програмного коду . Дані користувача, безумовно, не слід перекладати, а обробляти "як є". Навіть якщо у вас є клієнт «Гольдштейн», явно не слід зберігати їх назву як «золотий камінь».

Проблема в тому, що існує континуум термінів між "наданими користувачем, не торкайтеся" та "фрагментом коду, користуйтеся англійською мовою завжди". Імена клієнтів дуже близькі до першого кінця спектру, а змінні Java - до другого. Константи enumзначень трохи далі, особливо якщо вони позначають відомі, унікальні зовнішні сутності (наприклад, ваші відділи). Якщо кожен у вашій організації використовує голландські терміни для департаментів, ви не плануєте конфліктувати когось із кодовою базою, хто цього не робить, і набір існуючих відділів змінюється рідко, то, використовуючи прийняті назви відділу, можна зробити більше сенс для констант enum, ніж для локальних змінних. Я все одно не хотів би цього робити.


3
+1, використовуючи англійську мову в цьому випадку, ви отримуєте код "Читаність та повторність", який розкривається в цій відповіді. Хоча голландці певним чином їх ламають.
Михайло Чурбанов

4
@Jelle Чи має ім'я семантичне значення для коду? Якщо так, перекладіть - вам все одно потрібен переклад концепції. Якщо ні, то для чого вам enumце? Це може бути просто ознакою того, що ви намагаєтеся моделювати дані в коді, що може бути поганою ідеєю.
Луань

29
Я категорично не згоден з цією ідеєю загального перекладу конкретної доменної термінології. У деяких областях, наприклад, залізнична галузь, словники різних мов чи навіть територій настільки різняться, що будь-яка спроба перекласти навіть один термін настільки викривить значення, що ви заважаєте комусь зрозуміти це. Якщо ви абсолютно не впевнені, що домен програми дозволяє перекладати без втрат, не перекладайте термінологію домену .
Римоїд

6
Я також чув від свого керівника проекту, що в іншому проекті, розробники ми перекладаємо деякі доменні об’єкти з голландської на англійську, і пізніше в проекті стало незрозуміло, що означають ці об'єкти через ці спеціальні переклади.
Jelle

4
Прочитайте коментарі @Rhymoid та Jelle ще раз. Ніколи не робіть власних перекладів термінології домену! Якщо ви вирішили використовувати англійські терміни для юридичних осіб з іменем голландського, обов'язково використовуйте офіційний переклад, а не свій власний.
Гуран

15

Уникайте перекладу, де це можливо, тому що кожен переклад - це додаткові зусилля і може спричинити помилки.

Ключовий внесок «Дизайну, керованого доменом» в сучасній інженерії програмного забезпечення - це концепція всюдисущої мови , яка є єдиною мовою, що використовується всіма зацікавленими сторонами проекту. Згідно з 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, яке може бути приєднано до будь-якого відділу за допомогою конфігурації.


Це. Що відбувається, коли виліт розпадається або поєднується або утворюється новий? Цей код адаптується більш-менш автоматично; перетворити його на перерахунок означає, що вам потрібна нова збірка або вона вибухне.
jpmc26

1
Це було б рішенням, якби відділи не відігравали такої великої ролі в нашій програмі. У нас є багато if (project.getDepartment().equals(Department.XYZ))тверджень.
Jelle

@ Джелле, як щодо а project.isForDepartment("XYZ"), який, в свою чергу, використовує хешмап Даніеля (який вводиться в Project, або щось таке)
16:37

2
@ SáT, Це просто прохання про друкарські помилки, чесно ...
Jelle

@Jelle Так, але це може бути спіймано під час виконання. Тести також могли б спіймати їх у час компіляції. (Хоча я розумію, звідки ви родом, і я погоджуюся.)
16:55

3

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

/** The possible departments of a project, given in the Dutch language. */
public enum Department { BOUW, ONDERHOUD }

Радий, що ти знайшов задовільний підхід. Seems Однак, прийнята відповідь відрізняється від обраного Вами підходу. Подумайте про зміну прийнятої відповіді на одну з інших, яка відповідає вашому обраному підходу.
єпископ

Я змінив прийняту відповідь. Однак, враховуючи діапазон змін, я думаю, що це також особистий вибір, і я обрав такий підхід.
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 випадково кине людей сюди.

EDIT: Як зазначає 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, але чи є в конструкторі значення чи порядковий параметр, щоб мати можливість співставити його з описом? Я маю на увазі, вам все одно знадобиться масив всередині конструктора, щоб отримати правильний опис, правда?
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 рядки кожного разу, тоді як ваша збільшуватиметься на 1 рядок і не буде ламати посилання.
SparK

0

Очікується, що деякі інваріанти вашого коду будуть утримуватися. Один з таких інваріантів полягає в тому, що програма не буде поводитись інакше, коли ідентифікатор буде перейменований. Зокрема, у цьому випадку, коли у вас є enum та перейменовуєте будь-якого члена цього enum та оновлюєте всі його використання, ви не очікуєте, що ваш код почне працювати інакше.

Парсинг - це процес зчитування даних та отримання даних з них. Коли ви берете зовнішні дані, читаєте їх і створюєте екземпляри перерахунків, ви аналізуєте дані. Цей процес розбору є єдиною частиною вашої програми, відповідальною за підтримку зв'язку між поданням даних про те, як ви їх отримуєте, та формою та називанням членів ваших типів даних.

Таким чином, не має значення, які імена ви присвоюєте членам переліків. Те, що вони збігаються з рядками, використаними в даних, які ви читаєте, є випадковим.

Коли ви розробляєте свій код для моделювання домену, імена членів не повинні бути пов’язані з форматом серіалізації даних. Вони не повинні бути нідерландськими термінами, ні вони не повинні бути перекладами нідерландських термінів, але вони повинні бути те, що ви вирішите, найкраще відповідає доменній моделі.

Розбір, ніж переклад між форматом даних та вашою моделлю домену. Це останній вплив, який має мати формат даних на ваш код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.