Harici verileri programladığınız dile çevirme


39

Aşağıdakilerle ne yapacağımdan emin değilim:

Kendi aracımızdaki verileri harici bir araçtan alıyoruz. Bu veri Hollandaca yazılmıştır. Java kodumuzu İngilizce olarak yazıyoruz. Bu Hollandalıyı İngilizceye mi çevirmeliyiz yoksa Hollandalı olarak mı tutacağız? Örneğin, 2 departmanımız var: Bouw (İngilizce olarak inşaat) ve Onderhoud (İngilizce olarak bakım).

Daha sonra oluşturmak için mantıklı olurdu:

public enum Department { BOUW, ONDERHOUD }

veya:

public enum Department { CONSTRUCTION, MAINTENANCE }

ya da:

public enum Afdeling { BOUW, ONDERHOUD }

(afdeling Hollandaca Bölümdür)



3
Sanırım bu bir kopya değil çünkü İngilizce olarak adlandırılan kendi uygulama verilerimizden değil dış verilerden bahsediyorum.
Jelle

1
Genel olarak İngilizce olmayan veri nesneleri veya kaynak kullanıyorsanız, her işlev ve veri nesnesi için kaba İngilizce eşdeğeri bir çeviri referans tablosuna sahip olmanıza yardımcı olur. Bu özellikle bazı dillerde oldukça yaygın olan birden fazla kelimeyi kullanan fonksiyon ve nesne isimleriyle ilgilidir. Anadilimde olmayan, dili kesinlikle bilmeyen bir hatayı düzeltmek zorunda kaldım, ancak o program için çeviri sözlüğüne sahip olması önemsizdi. Genellikle programlı çeviri kitaplıkları yalnızca yazılımlarını düzgün bir şekilde yerelleştiren projelere dahil edilir.
kayleeFrye_onDeck 28:16

3
Programınızın geri kalanı (standart kütüphaneler dışında) İngilizce veya Hollandaca tanımlayıcıları kullanıyor mu?
user253751

Şimdilik, yalnızca İngilizce'yi kullandık, ancak Bölümler şu anda kodlanmış tek kullanıcı verisidir, çünkü belirli bir projenin Bölümü uygulamamızda büyük bir rol oynamaktadır. Diğer Hollanda değerleri, veritabanımıza kaydedilir, bu nedenle kodlanmış değildir.
Jelle,

Yanıtlar:


33

Bu senaryoda, enum değerlerini Hollandaca olarak bırakırdım :

public enum Department { BOUW, ONDERHOUD }

Çünkü bu sabitleri kullanan mantık , aynı zamanda Hollandaca olan verilere göre olacaktır . Örneğin, giriş "bouw" ise, karşılaştırma kodu şöyle görünebilir:

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

Değerler eşleştiğinde hata ayıklamayı daha kolay buluyorum (değerlerin ne anlama geldiğini bilmesem bile). Çeviri sadece zihinsel bir çember ekler, ben bir geliştirici olarak, doğruluğunu kanıtlamak için atlamak zorunda kalmamalıyım.

Yine de, başkalarının verinin içeriğini anlamalarına yardımcı olması durumunda, kodu yorumlayabilirsiniz:

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

3
@ Jelle Elbette, eğer uluslararası olarak genişlemeye devam ederseniz, yine de çeviri mantığından memnun olabilirsiniz. YAGNI üzerinde YMMV.
Williham Totland, 28:16

6
Enums'lerinizi hiçbir zaman doğrudan dizelerle karşılaştırmamalısınız. Bir dizgiyi enum değeri olan birkaç kelimeyle karşılaştırmanız gerekirse?
Jørgen Fogh

25
Ben ediyorum şimdiye asla özellikle kullanıcı girişi ve lokalize dizeleri ile çalışırken, == .toUpper () ve kullanan dizeleri karşılaştırın. Buna okul-kitap örneği, Türkçe "ben" karakteridir.
Adriano Repetti

4
@ ABoschman Satır sonu sonu yorumları evrensel olarak üzerinde bulundukları satırı ifade eder. Bu yorum türünü yüzlerce kez liste öğelerinin basit açıklamaları için gördüm ...
StarWeaver

13
Mağazamızda, burada önerilenin tersini yapıyoruz: enum / const isimleri İngilizce (ya da İngilizce için ne yazıyor) ve yorumlar "yerelleştiriliyor". Hangisi iyi. Aksi takdirde, bütün bu izleri gibi isimlerle alırdık PAAMAYIM_NEKUDOTAYIM.
sq33G

60

İngilizce, bir sebeple lingua franca / en düşük ortak paydadır. Sebep kavramsal olarak "Herkes yapar" kadar zayıf olsa bile, bu hala oldukça önemli bir sebep.

Yaygın uygulamaya karşı çıkmak, yazılımdaki veri yapılarını anlamak için Hollandaca'yı anlamanız gerektiği anlamına gelir. Hollandaca'da yanlış olan bir şey yok, ancak kod temeli ile etkileşime girmesi gereken herhangi bir mühendisin İngilizce konuşması ihtimalinden daha düşük.

Bu nedenle, sürece bir Hollandalı salt alışveriş konum ve uluslararası genişlemeyi düşünmüyorsanız hiç , bu kod temeli tek dilli tutmak ve en popüler kodlama dilini kullanmak iyi bir fikirdir hemen her zaman var.

Not: Bu tavsiye yalnızca program kodu için geçerlidir . Kullanıcı verileri kesinlikle çevrilmemeli, "olduğu gibi" işlenmelidir. "Goldstein" müşteriniz olsa bile, ismini "golden stone" olarak kaydetmemelisiniz.

Sorun şu ki, "kullanıcı tarafından sağlanan, dokunma" ile "kod parçası, her zaman İngilizce'yi kullanma" arasında sürekli bir terim olması. Müşteri isimleri, spektrumun sonlarına yakın, Java değişkenleri ise sonlarına yakın. enumDeğerler için sabitler , özellikle iyi bilinen benzersiz dış varlıkları (bölümleriniz gibi) belirtirlerse biraz daha uzağa gider. Kuruluşunuzdaki herkes bölümler için Hollandaca terimleri kullanıyorsa, kimseyle karşılaşmayan kod üssü ile yüzleşmeyi planlamıyorsunuz ve mevcut bölümler kümesi nadiren değişiyorsa, o zaman bölümün kabul edilen adlarını kullanmak daha fazlasını yapabilir. Yerel değişkenlerden ziyade enum sabitlerini anlama. Yine de hala yapmazdım.


3
+1, bu durumda İngilizce kullanarak, size bu cevapta açıklanan Okunabilirlik ve Tekrar Kullanılabilirlik kodunu verir. Hollandalı yaparken, bir şekilde onları kırar.
Mikhail Churbanov

4
@Jelle İsmin kod için anlamsal bir önemi var mı? Eğer evet ise, tercüme edin - yine de kavramın çevirisine ihtiyacınız var. Değilse, neden enumbunun için var? Bu sadece koddaki verileri modellemeye çalıştığınızın bir işareti olabilir, bu kötü bir fikir olabilir.
Luaan

29
Genel olarak alana özgü terminolojiyi tercüme etme fikrine kesinlikle katılmıyorum. Bazı alanlarda, örneğin demiryolu endüstrisi, farklı dillerin ve hatta bölgelerin sözlükleri o kadar farklıdır ki, tek bir terimi bile çevirme denemesi, bir kimsenin onu anlamalarını engelleyeceğiniz anlamına gelir. Uygulama etki alanının kayıpsız çeviriye izin verdiğinden kesinlikle emin değilseniz, etki alanı terminolojisini çevirmeyin .
Rhymoid

6
Proje liderimden, başka bir projede, geliştiricilerin bazı etki alanı nesnelerini Hollandaca'dan İngilizceye çevirdiğimizi ve projenin bu özel çeviriler nedeniyle bu nesnelerin ne anlama geldiğini belirsiz hale getirdiğini duydum.
Jelle,

4
@ Rhymoid ve Jelle'nin yorumlarını tekrar okuyunuz. Asla kendi etki alanı terminolojisi çevirilerinizi yapmayın! Hollandaca adı geçen kuruluşlar için ingilizce terimleri kullanmaya karar verirseniz, kendiniz değil, resmi bir çeviri kullandığınızdan emin olun.
Guran

15

Mümkün olan her yerde çeviri yapmaktan kaçının, çünkü her çeviri ek bir çabadır ve hataları ortaya çıkarabilir.

"Domain Driven Design" ın modern yazılım mühendisliğine kilit katkısı, projenin tüm paydaşları tarafından kullanılan tek bir dil olan Ubiquitous Dil kavramıdır . DDD'ye göre, çeviri bir ekip içinde yapılmamalı (sadece bir şartname belgesinin vekili tarafından sunulsa bile etki alanı uzmanlarını da içermelidir), ancak yalnızca ekipler arasında (daha fazla okuma: Eric Evans tarafından "Domain Driven Design", özellikle de bölümler arasında yapılmalıdır) Ubiquitous Dil ve stratejik tasarım hakkında).

Diğer bir deyişle, işletme uzmanlarınız (veya şartname belgeniz) Hollandaca konuşabiliyorsa, işletme kaygılarını kaynak kodunda ifade ederken (Hollandaca) terminolojilerini kullanın. Gereksiz yere İngilizceye çevirmeyin, çünkü bunu yapmak iş uzmanları ile programcılar arasında iletişim için yapay bir engel oluşturur; bu da zaman alır ve (belirsiz veya kötü çeviri yoluyla) hatalara neden olabilir.

Buna karşılık, işletme uzmanlarınız işlerini hem İngilizce hem de Hollandaca konuşabiliyorlarsa, projenin her zamanki dilini seçebilmeniz için şanslı bir durumdasınız ve İngilizce'yi tercih etmek için geçerli nedenler varsa (örneğin "uluslararası olarak anlaşılabilir ve "standartlar tarafından kullanılması daha muhtemeldir"), ancak bunu yapmak, kodlayıcıların iş adamlarının neden bahsettiğini tercüme etmesi gerektiği anlamına gelmez. Bunun yerine iş adamları dil değiştirmeli.

Her yerde bir dile sahip olmak, gereksinimler karmaşıksa ve tam olarak uygulanması gerekiyorsa özellikle önemlidir, eğer sadece CRUD kullanıyorsanız, içsel olarak kullandığınız dil daha az önemlidir.

Kişisel anekdot: Bazı iş hizmetlerini SOAP bitiş noktası olarak gösterdiğimiz bir projedeydim. İş tamamen Almancaydı ve ingilizcede olduğu gibi yeniden kullanılması pek mümkün değildi, çünkü belirli bir yargı alanına özgü yasal meselelerle ilgiliydi. Bununla birlikte, bazı fildişi kule mimarları, SOAP arayüzünün gelecekte yeniden kullanımı teşvik etmek için İngilizce olmasını zorunlu kılmıştır. Bu çeviri geçici olarak gerçekleşti ve geliştiriciler arasında çok az koordinasyon vardı, yine de yalnızca ortak bir sözlük vardı; aynı işletme teriminde web servis sözleşmesinde birkaç isim vardı ve bazı ticari terimler web servis sözleşmesinde aynı isimdeydi. Oh, ve elbette bölünmenin iki tarafında da kullanılan bazı isimler - fakat farklı anlamlara sahip!

Yine de çevirmeyi seçerseniz, lütfen çeviriyi bir sözlükte standardize edin, yaptığınız tanımınıza o sözlüğe uygunluğunu ekleyin ve incelemelerinizde kontrol edin. Bizim kadar dikkatsiz olmayın.


5
İş uzmanları İngilizce konuşacaktır. İşgücünde eğitimli Hollandaca arasında İngilizce yeterlilik% 100'dür.
MSalters,

4
İngilizce konuşmak bir şeydir. Hollandaca etki alanı terminolojisinin ingilizce'ye kaliteli çevirileri yapabilmek oldukça başka bir şey.
Guran

1
@ MSalters: Hangi seviyede uzman? Bahsettiğim projede herkes İngilizce konuşabildi, ancak Almanca kadar yetkin değildi. Örneğin getAdminRoll, yönetici rolünü kontrol eden bir yöntem vardı ... (Almanca kelime "Rolle" ve yanlış mektubu
bıraktılar

@Guran: Aslında, bu genellikle başka bir yoldur: alan uzmanınız İngilizce dilbilgisini alt üst edebilir ve küçük konuşmalarla zorluk çekebilir, ancak alan terimlerini İngilizce olarak bilirler. Programcılar daha büyük bir problem olabilir: Etki alanları bir yazılımdır, yani bu kelime bilgisini bildikleri anlamına gelir , ancak iş kelimesini gerektirmez.
MSalters

@meriton: Yani "roll" İngilizce bir eki, örneğin olduğunu göz önünde bulundurarak, aslında böyle bir garip hata değil bordro Fransız gelen, rolle . Ortalama olarak, Hollanda'daki İngilizcenin akıcılığı Almanya'dan anlamlı derecede yüksektir. Mesela II, Alman üniversitelerinin konuşulan dil olarak İngilizceye geçmesini beklemiyordu. Ve bir tezin Almanca olarak sunulması hala normal kabul edilir, bence?
MSalters,

9

Doğru çözüm, bölümleri hiç zorlamamaktır:

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

Ya da kesinlikle bir bölüme ihtiyacınız varsa:

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

Kodunuzdaki belirli bölümlere karşı test etme ihtiyacı bulursanız, o bölüm hakkında neyin özel olduğunu daha genel olarak sormanız ve o bölümü o özelliğe sahip olarak yapılandırmayı kabul etmeniz gerekir. Örneğin, eğer bir departman haftalık bordroya sahipse ve kodun önemi bu ise, konfigürasyon ile herhangi bir departmana eklenebilecek bir WEEKLY_PAYROLL özelliği olmalıdır.


Bu. Bir ayrılma bölündüğünde veya birleştiğinde veya yeni bir tanesini oluşturduğunda ne olur? Bu kod aşağı yukarı otomatik olarak adapte olur; onu bir enuma dönüştürmek, yeni bir yapıya ihtiyaç duyduğunuz veya patlayacağı anlamına gelir.
jpmc26

1
Uygulamamızda departmanlar bu kadar büyük bir rol oynamasaydı bu bir çözüm olurdu. Bir sürü ifademiz var if (project.getDepartment().equals(Department.XYZ)).
Jelle,

@Jelle nasıl bir project.isForDepartment("XYZ")sırayla Daniel'in hashmap'ini kullanır (ki bu Proje'ye enjekte edilir veya başka bir şey)
SáT

2
@ SáT, bu sadece yazım hatası yapmak istiyor, dürüst olmak gerekirse ...
Jelle

@Jelle Evet, ancak çalışma zamanı yakalanabilir. Testler onları derleme zamanında da yakalayabilir. (Nereden geldiğini
anlasam da

3

Merak eden her insan için: ilk seçeneği tercih ettik, çünkü çeviri için şartlar oluşturmamanız gerektiğini düşünüyoruz. Bununla birlikte, bazen bir uluslararası geliştirici proje üzerinde çalışıyorsa, bunu açıklamak için bazı belgeler ekledik:

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

Tatmin edici bir yaklaşım bulmana sevindim. Accepted Kabul edilen cevap, seçtiğiniz yaklaşımdan farklı görünüyor. Lütfen kabul edilen cevabı seçtiğiniz yaklaşımla eşleşen diğerlerinden birine değiştirmeyi düşünün.
piskopos

Kabul edilen cevabı değiştirdim. Bununla birlikte, üst sürümlerde verilen aralık göz önüne alındığında, bunun kişisel bir tercih olduğunu düşünüyorum ve bu yaklaşımı seçtim.
Jelle

2

Kullanıcıyı veya başka bir şeyi göstermek için bir dize temsili olması konusunda endişeleniyorsanız, enum içinde bir açıklama dizisi tanımlayın ve bir yöntemi gösterin.
Örn: Department.BUILD.getDescription();"BOUW" çıktısını alacak

public enum Department { 
    BUILD,
    MAINTENANCE;

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

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

Aksini seçtiğini biliyorum, ama sadece google vorteks buradaki insanları kazara atarsa ​​diye.

EDIT: Pokechu22 tarafından belirtildiği gibi enum yapıcılarını ve bunun gibi özel özellikleri kullanabilirsiniz:

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

    private final String description;

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

    public String getDescription() {
        return description;
    }
}

hangi da bu etkiyi elde edecek.


1
Bir diziye ihtiyacınız yok. Java'da, enums (özel) yapıcılar ve alanlar olabilir.
Pokechu22,

1
@ Pokechu22, ancak yapıcı tarafından tanımla eşleştirilebilecek değer veya sıra mevcut mu? Demek istediğim, doğru açıklamayı elde etmek için hala yapıcı içinde bir diziye ihtiyacınız olacak, değil mi?
Serçe

1
Hayır, böyle yapabilirsiniz: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 Cevabına eklendi. Ayrıca, dizinin artması durumunda uygulamamın her seferinde 2 satır artabileceğini ve artacağını, sizinki de 1 satır artacağını ve referansları kırmayacağını fark ettim.
SparK

0

Kodunuzun bazı değişmezlerinin beklemesi bekleniyor. Bu değişmezlerden biri, bir tanımlayıcı yeniden adlandırıldığında bir programın farklı davranmamasıdır. Bu durumda özellikle, bir numaraya sahip olduğunuzda ve bu numaradan herhangi bir üyeyi yeniden adlandırdığınızda ve o üyenin tüm kullanımlarını güncellediğinizde, kodunuzun farklı şekilde çalışmaya başlamasını beklemeyeceksiniz.

Ayrıştırma, verileri okuma ve ondan veri yapılarını alma işlemidir. Dış verileri aldığınızda, okuyun ve numaralandırmanızın örneklerini oluştururken, verileri ayrıştırıyorsunuz. Bu ayrıştırma işlemi, programınızın, onu nasıl edindiğiniz ile veri temsili ile veri tiplerinizdeki üyelerin şekli ve isimleri arasındaki ilişkiyi sürdürmekten sorumlu olan tek kısmıdır.

Bu nedenle, enum üyelerine hangi isimleri verdiğiniz önemli olmamalıdır. Okuduğunuz verilerde kullanılan karakter dizileriyle çakışması, tesadüfidir.

Etki alanını modellemek için kodunuzu tasarlarken, üyelerin adları verilerin seri hale getirme biçimiyle ilişkilendirilmemelidir. Ne Hollandaca terimler olmalı ne de Hollandaca terimlerin çevirileri olmalı, ancak etki alanı modeline en uygun olana karar vermelisiniz.

Veri biçimi ve etki alanı modeliniz arasında çeviriden daha ayrıştırıcı. Bu, veri formatının kodunuz üzerindeki etkisinin sonuncusu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.