Dịch dữ liệu ngoài sang ngôn ngữ bạn đang lập trình


39

Tôi không biết phải làm gì với những điều sau đây:

Chúng tôi lấy dữ liệu từ một công cụ bên ngoài trong công cụ của chúng tôi. Dữ liệu này được viết bằng tiếng Hà Lan. Chúng tôi đang viết mã Java bằng tiếng Anh. Sau đó chúng ta nên dịch tiếng Hà Lan này sang tiếng Anh hay giữ tiếng Hà Lan? Ví dụ: chúng tôi có 2 phòng ban: Bouw (Xây dựng bằng tiếng Anh) & Onderhoud (Bảo trì bằng tiếng Anh).

Sau đó, nó sẽ hợp lý để tạo ra:

public enum Department { BOUW, ONDERHOUD }

hoặc là:

public enum Department { CONSTRUCTION, MAINTENANCE }

hoặc thậm chí:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling là Sở tại Hà Lan)


3
Bản sao có thể có của các Công ước đặt tên không phải tiếng Anh
gnat

3
Tôi đoán đó không phải là một bản sao vì tôi đang nói về dữ liệu ngoài và không phải dữ liệu ứng dụng của chúng ta, được đặt tên bằng tiếng Anh.
Jelle

1
Nếu sử dụng các đối tượng hoặc nguồn dữ liệu không phải tiếng Anh nói chung, sẽ giúp có một bảng tham chiếu dịch tương đương với tiếng Anh thô cho từng đối tượng chức năng và dữ liệu. Điều này đặc biệt phù hợp với tên hàm và đối tượng sử dụng nhiều từ, khá phổ biến trong một số ngôn ngữ. Tôi đã phải sửa các lỗi không phải bằng ngôn ngữ mẹ đẻ của mình mà hoàn toàn không có kiến ​​thức về ngôn ngữ, nhưng do có một từ điển dịch cho chương trình đó, nó thật tầm thường. Thông thường các thư viện dịch thuật lập trình chỉ được bao gồm trong các dự án được bản địa hóa phần mềm của họ.
kayleeFrye_onDeck

3
Phần còn lại của chương trình của bạn (ngoài các thư viện tiêu chuẩn) có sử dụng định danh tiếng Anh hoặc tiếng Hà Lan không?
dùng253751

Hiện tại, chúng tôi chỉ sử dụng tiếng Anh, nhưng các Phòng ban hiện chỉ là dữ liệu người dùng được mã hóa cứng, bởi vì Bộ của một dự án nhất định đóng vai trò lớn trong ứng dụng của chúng tôi. Các giá trị khác của Hà Lan được lưu trong cơ sở dữ liệu của chúng tôi, vì vậy chúng không bị mã hóa cứng.
Jelle

Câu trả lời:


33

Trong kịch bản này, tôi sẽ để các giá trị enum bằng tiếng Hà Lan:

public enum Department { BOUW, ONDERHOUD }

Bởi vì logic sử dụng các hằng số này sẽ khớp với dữ liệu cũng bằng tiếng Hà Lan . Ví dụ: nếu đầu vào là "bouw", mã so sánh có thể trông như sau:

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

Tôi thấy việc gỡ lỗi dễ dàng hơn khi các giá trị khớp với nhau (ngay cả khi tôi không biết ý nghĩa của các giá trị). Dịch chỉ cần thêm một tinh thần tôi, với tư cách là một nhà phát triển, không cần phải nhảy qua để chứng minh sự đúng đắn.

Tuy nhiên, bạn chỉ có thể nhận xét mã nếu nó giúp người khác hiểu ngữ cảnh của dữ liệu:

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

3
@Jelle Tất nhiên, nếu cuối cùng bạn mở rộng ra quốc tế, dù sao bạn cũng có thể vui mừng với logic dịch thuật. YMMV trên YAGNI.
Williham Totland

6
Dù sao thì bạn cũng không nên so sánh enum của mình với chuỗi. Điều gì nếu bạn phải so sánh một chuỗi với một vài từ với một giá trị enum?
Jørgen Fogh

25
Tôi sẽ không bao giờ so sánh các chuỗi bằng cách sử dụng .toUpper () và ==, đặc biệt là khi làm việc với các chuỗi đầu vào và đầu vào của người dùng. Ví dụ về sách học ở đây là ký tự "i" của Thổ Nhĩ Kỳ.
Adriano Repetti

4
@ABoschman Kết thúc dòng bình luận phổ biến đề cập đến dòng họ đang bật. Tôi đã thấy loại nhận xét này cho các mô tả đơn giản về các mục danh sách hàng trăm lần,
StarWeaver

13
Trong cửa hàng của chúng tôi, chúng tôi làm ngược lại với những gì được đề xuất ở đây: tên enum / const bằng tiếng Anh (hoặc những gì được chuyển cho tiếng Anh) và các ý kiến ​​được "bản địa hóa". Cái nào tốt. Nếu không, chúng ta sẽ có tất cả các hằng số này với tên như PAAMAYIM_NEKUDOTAYIM.
sq33G

59

Tiếng Anh là một ngôn ngữ chung / mẫu số chung thấp nhất vì một lý do. Ngay cả khi lý do yếu về mặt khái niệm là "Mọi người đều làm như vậy", đó vẫn là một lý do khá quan trọng.

Đi ngược lại thực tiễn phổ biến có nghĩa là bạn phải hiểu tiếng Hà Lan để hiểu được cấu trúc dữ liệu trong phần mềm. Không có gì sai với tiếng Hà Lan, nhưng xác suất mà bất kỳ kỹ sư nào sẽ phải tương tác với cơ sở mã nói rằng nó vẫn thấp hơn so với tiếng Anh.

Do đó, trừ khi bạn là cửa hàng duy nhất ở Hà Lan và không có kế hoạch mở rộng ra quốc tế bao giờ , thì hầu như luôn luôn là một ý tưởng tốt để duy trì cơ sở mã hóa của bạn và sử dụng ngôn ngữ mã hóa phổ biến nhất.

Lưu ý: Lời khuyên này chỉ áp dụng cho mã chương trình . Dữ liệu người dùng chắc chắn không nên được dịch, nhưng được xử lý "nguyên trạng". Ngay cả khi bạn có một khách hàng "Goldstein", rõ ràng bạn không nên lưu trữ tên của họ là "viên đá vàng".

Vấn đề là có sự liên tục của các thuật ngữ giữa "do người dùng cung cấp, không chạm vào" và "đoạn mã, sử dụng tiếng Anh mọi lúc". Tên khách hàng ở rất gần đầu trước của phổ, các biến Java ở gần đầu sau. Các hằng số cho enumcác giá trị ở xa hơn một chút, đặc biệt nếu chúng biểu thị các thực thể bên ngoài nổi tiếng, duy nhất (như các phòng ban của bạn). Nếu mọi người trong tổ chức của bạn sử dụng thuật ngữ tiếng Hà Lan cho các phòng ban, bạn không có kế hoạch đối đầu với bất kỳ ai có cơ sở mã không, và bộ các phòng ban hiện tại thay đổi hiếm khi, sau đó sử dụng tên được chấp nhận của bộ phận có thể tạo ra nhiều hơn ý nghĩa cho hằng số enum hơn cho các biến cục bộ. Tôi vẫn sẽ không làm điều đó, mặc dù.


3
+1, sử dụng tiếng Anh trong trường hợp đó cung cấp cho bạn mã Khả năng đọc và tái sử dụng, được tiết lộ trong câu trả lời này. Trong khi làm cho nó Hà Lan phá vỡ chúng theo một cách nào đó.
Mikhail Churbanov

4
@Jelle Tên có ý nghĩa ngữ nghĩa đối với mã không? Nếu có, hãy dịch nó - dù sao bạn cũng cần một bản dịch của khái niệm này. Nếu không, tại sao bạn có một enumcho nó? Đó có thể chỉ là một dấu hiệu cho thấy bạn đang cố gắng mô hình hóa dữ liệu theo mã, đây có thể là một ý tưởng tồi.
Luaan

29
Tôi hoàn toàn không đồng ý với ý kiến ​​này về việc dịch thuật ngữ cụ thể theo tên miền. Trong một số lĩnh vực, ví dụ như ngành đường sắt, các thuật ngữ của các ngôn ngữ hoặc thậm chí các lãnh thổ khác nhau khác nhau đến mức bất kỳ nỗ lực dịch nào dù chỉ một thuật ngữ sẽ làm mất đi ý nghĩa đến mức bạn ngăn cản mọi người hiểu nó. Trừ khi bạn hoàn toàn chắc chắn rằng miền ứng dụng cho phép dịch thuật không mất dữ liệu, đừng dịch thuật ngữ tên miền .
Rhymoid

6
Tôi cũng được nghe từ người lãnh đạo dự án của tôi rằng trong một dự án khác, các nhà phát triển đang dịch một số đối tượng miền từ tiếng Hà Lan sang tiếng Anh và sau đó trong dự án không rõ những dự án này có nghĩa là gì vì những bản dịch tùy chỉnh này.
Jelle

4
Đọc các bình luận của @Rhymoid và Jelle một lần nữa. Không bao giờ thực hiện các bản dịch của riêng bạn về thuật ngữ tên miền! Nếu bạn quyết định sử dụng thuật ngữ tiếng Anh cho các thực thể có tên tiếng Hà Lan, hãy đảm bảo sử dụng bản dịch chính thức, không phải bản dịch của bạn.
Guran

15

Tránh dịch nếu có thể, bởi vì mọi bản dịch là nỗ lực bổ sung và có thể giới thiệu các lỗi.

Đóng góp quan trọng của "Thiết kế hướng miền" cho công nghệ phần mềm hiện đại là khái niệm Ngôn ngữ phổ biến , là ngôn ngữ duy nhất được sử dụng bởi tất cả các bên liên quan của dự án. Theo DDD, dịch thuật không nên xảy ra trong một nhóm (bao gồm các chuyên gia tên miền, ngay cả khi chỉ xuất hiện bằng proxy của tài liệu đặc tả), mà chỉ giữa các nhóm (đọc thêm: "Thiết kế hướng tên miền" của Eric Evans, đặc biệt là các chương về ngôn ngữ Ubiquitous và thiết kế chiến lược).

Đó là, nếu các chuyên gia kinh doanh của bạn (hoặc tài liệu đặc tả của bạn) nói tiếng Hà Lan, hãy sử dụng thuật ngữ (tiếng Hà Lan) của họ khi thể hiện mối quan tâm kinh doanh trong mã nguồn. Không cần dịch sang tiếng Anh, bởi vì làm như vậy sẽ tạo ra một trở ngại nhân tạo cho việc giao tiếp giữa các chuyên gia kinh doanh và lập trình viên, điều này làm mất thời gian và có thể (thông qua bản dịch mơ hồ hoặc xấu) gây ra lỗi.

Ngược lại, nếu các chuyên gia kinh doanh của bạn có thể nói về doanh nghiệp của họ bằng cả tiếng Anh và tiếng Hà Lan, thì bạn đang ở trong tình huống may mắn có thể chọn ngôn ngữ phổ biến của dự án và có những lý do hợp lệ để thích tiếng Anh (như "có thể hiểu được quốc tế và nhiều khả năng được sử dụng bởi các tiêu chuẩn "), nhưng làm như vậy không có nghĩa là các lập trình viên nên dịch những gì người kinh doanh đang nói đến. Thay vào đó, những người kinh doanh nên chuyển đổi ngôn ngữ.

Có một ngôn ngữ phổ biến là đặc biệt quan trọng nếu các yêu cầu phức tạp và phải được thực hiện chính xác, nếu bạn chỉ thực hiện CRUD thì ngôn ngữ bạn sử dụng ít quan trọng hơn.

Giai thoại cá nhân: Tôi đã ở trong một dự án nơi chúng tôi tiếp xúc với một số dịch vụ kinh doanh như một điểm cuối SOAP. Việc kinh doanh hoàn toàn được quy định bằng tiếng Đức và không có khả năng được sử dụng lại như tiếng Anh, bởi vì đó là về các vấn đề pháp lý cụ thể đối với một khu vực pháp lý cụ thể. Tuy nhiên, một số kiến ​​trúc sư tháp ngà đã yêu cầu giao diện SOAP là tiếng Anh để thúc đẩy việc tái sử dụng trong tương lai. Bản dịch này xảy ra tại hoc và có rất ít sự phối hợp giữa các nhà phát triển, nhưng một mình một thuật ngữ chung, dẫn đến cùng một thuật ngữ kinh doanh có một số tên trong hợp đồng dịch vụ web và một số điều khoản kinh doanh có cùng tên trong hợp đồng dịch vụ web. Ồ, và tất nhiên một số tên được sử dụng ở hai bên của sự phân chia - nhưng với ý nghĩa khác nhau!

Nếu bạn chọn dịch bằng mọi cách, vui lòng chuẩn hóa bản dịch trong bảng chú giải thuật ngữ, thêm tuân thủ bảng chú giải đó vào định nghĩa hoàn thành của bạn và kiểm tra nó trong phần đánh giá của bạn. Đừng bất cẩn như chúng ta đã từng.


5
Các chuyên gia kinh doanh sẽ nói tiếng Anh. Trình độ tiếng Anh trong số những người Hà Lan có học thức trong lực lượng lao động là 100%.
MSalters

4
Nói tiếng Anh là một chuyện. Có thể thực hiện các bản dịch chất lượng của thuật ngữ tên miền Hà Lan sang tiếng Anh là một điều hoàn toàn khác.
Guran

1
@MSalters: Thành thạo ở cấp độ nào? Trong dự án tôi đã nói, mọi người đều có thể nói tiếng Anh, nhưng họ không thành thạo như tiếng Đức. Chẳng hạn, có một phương pháp getAdminRollkiểm tra vai trò quản trị viên ... (từ tiếng Đức là "Rolle" và họ đã bỏ chữ cái sai :-)
meriton - đình công vào

@Guran: Trên thực tế, đó thường là cách khác: chuyên gia tên miền của bạn có thể hiểu được ngữ pháp tiếng Anh và có những thách thức với cuộc nói chuyện nhỏ, nhưng họ sẽ biết thuật ngữ tên miền bằng tiếng Anh. Các lập trình viên có thể là vấn đề lớn hơn: miền của họ là phần mềm, có nghĩa là họ biết từ vựng đó , nhưng không nhất thiết phải là từ vựng kinh doanh.
MSalters

@meriton: Đó thực sự không phải là một lỗi kỳ lạ, vì coi "roll" là một hậu tố tiếng Anh, ví dụ như bảng lương , từ rolle Pháp . Trung bình, tiếng Anh lưu loát ở Hà Lan cao hơn đáng kể so với ở Đức. Ví dụ, II sẽ không mong đợi các trường đại học Đức chuyển sang tiếng Anh như ngôn ngữ nói. Và nộp luận án bằng tiếng Đức vẫn được coi là bình thường, tôi nghĩ sao?
MSalters

9

Giải pháp chính xác là không mã hóa các bộ phận:

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

Hoặc, nếu bạn thực sự cần một loại phòng ban:

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

Nếu bạn thấy cần phải kiểm tra các bộ phận cụ thể trong mã của mình, bạn phải hỏi một cách khái quát hơn về bộ phận đó có gì đặc biệt và chấp nhận định cấu hình bộ phận đó có thuộc tính đó. Ví dụ: nếu một bộ phận có bảng lương hàng tuần và đó là những gì mã quan tâm, thì nên có một thuộc tính WEEKLY_PAYROLL có thể được gắn vào bất kỳ bộ phận nào theo cấu hình.


Điều này. Điều gì xảy ra khi một lần khởi hành bị chia tách hoặc kết hợp hoặc một hình thức mới? Mã này sẽ tự động thích ứng ít nhiều; biến nó thành một enum có nghĩa là bạn cần một bản dựng mới hoặc nó sẽ phát nổ.
jpmc26

1
Đây sẽ là một giải pháp nếu các phòng ban không đóng một vai trò lớn như vậy trong ứng dụng của chúng tôi. Chúng tôi có rất nhiều if (project.getDepartment().equals(Department.XYZ))báo cáo.
Jelle

@Jelle làm thế nào về một project.isForDepartment("XYZ"), lần lượt sử dụng hashmap của Daniel (được đưa vào Project, hoặc một cái gì đó)
SáT

2
@ SáT, đó chỉ là yêu cầu của typo, thật lòng ...
Jelle

@Jelle Có, nhưng nó có thể bị bắt thời gian chạy. Các thử nghiệm có thể bắt chúng trong thời gian biên dịch quá. (Mặc dù tôi hiểu bạn đến từ đâu và tôi đồng ý.)
SáT

3

Đối với bất kỳ ai thắc mắc: chúng tôi đã chọn tùy chọn đầu tiên, chủ yếu là vì chúng tôi nghĩ rằng bạn không nên tạo ra các điều khoản vì mục đích dịch thuật. Tuy nhiên, nếu đôi khi, một nhà phát triển quốc tế sẽ làm việc với dự án, chúng tôi đã thêm một số tài liệu để giải thích như vậy:

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

Vui mừng bạn tìm thấy một cách tiếp cận thỏa đáng. Tuy nhiên, câu trả lời được chấp nhận dường như khác với cách tiếp cận bạn đã chọn. Vui lòng xem xét thay đổi câu trả lời được chấp nhận cho một trong những câu trả lời phù hợp với phương pháp bạn đã chọn.
giám mục

Tôi đã thay đổi câu trả lời được chấp nhận. Tuy nhiên, với phạm vi nâng cấp, tôi nghĩ đó cũng là một lựa chọn cá nhân và tôi đã chọn phương pháp này.
Jelle

2

Nếu bạn lo lắng về việc có một biểu diễn chuỗi để hiển thị cho người dùng hoặc thứ gì đó, chỉ cần xác định một mảng mô tả bên trong enum của bạn và hiển thị một phương thức.
Ví dụ: Department.BUILD.getDescription();sẽ xuất "BOUW"

public enum Department { 
    BUILD,
    MAINTENANCE;

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

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

Tôi biết bạn đã chọn cách khác, nhưng chỉ trong trường hợp cơn lốc google ném người ở đây một cách tình cờ.

EDIT: Theo ghi nhận của Pokechu22, bạn có thể sử dụng các hàm tạo enum và các thuộc tính riêng tư như thế này:

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

    private final String description;

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

    public String getDescription() {
        return description;
    }
}

Điều đó cũng sẽ đạt được hiệu quả đó.


1
Bạn không cần một mảng. Trong java, enums có thể có các hàm tạo (riêng) và các trường.
Pokechu22

1
@ Pokechu22, nhưng giá trị hoặc thứ tự có sẵn tại nhà xây dựng để có thể khớp nó với mô tả? Ý tôi là, bạn vẫn sẽ cần một mảng bên trong de constructor để có được mô tả đúng, phải không?
SparK

1
Không, bạn có thể làm như thế này: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 Đã thêm vào câu trả lời. Tôi cũng nhận thấy trong trường hợp mảng tăng, việc triển khai của tôi có thể bị phá vỡ và tăng thêm 2 dòng mỗi lần, trong khi mảng của bạn sẽ tăng 1 dòng và sẽ không phá vỡ các tham chiếu.
SparK

0

Một số bất biến của mã của bạn được dự kiến ​​sẽ giữ. Một trong những bất biến đó là chương trình sẽ không hoạt động khác khi định danh được đổi tên. Trong trường hợp này, đặc biệt, khi bạn có enum và đổi tên bất kỳ thành viên nào của enum đó và cập nhật tất cả các cách sử dụng của thành viên đó, bạn sẽ không mong đợi mã của mình bắt đầu hoạt động khác đi.

Phân tích cú pháp là quá trình đọc dữ liệu và lấy dữ liệu từ nó. Khi bạn lấy dữ liệu ngoài, đọc nó và tạo các thể hiện của enum, bạn đang phân tích dữ liệu. Quá trình phân tích cú pháp đó là phần duy nhất trong chương trình của bạn chịu trách nhiệm duy trì mối quan hệ giữa biểu diễn dữ liệu về cách bạn nhận được nó, hình dạng và cách đặt tên của các thành viên của kiểu dữ liệu của bạn.

Như vậy, việc bạn gán tên cho các thành viên của enum là không quan trọng. Rằng chúng xảy ra trùng khớp với các chuỗi được sử dụng trong dữ liệu bạn đọc là trùng hợp ngẫu nhiên.

Khi bạn thiết kế mã của mình để mô hình hóa tên miền, tên của các thành viên không nên liên quan đến định dạng tuần tự hóa của dữ liệu. Chúng không phải là các thuật ngữ tiếng Hà Lan, cũng không nên là các bản dịch của các thuật ngữ tiếng Hà Lan, nhưng chúng phải là những gì bạn quyết định phù hợp nhất với mô hình miền.

Trình phân tích cú pháp hơn dịch giữa định dạng dữ liệu và mô hình miền của bạn. Đó là ảnh hưởng cuối cùng của định dạng dữ liệu đối với mã của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.