Sistemin java bölümünün dışındaki referans numaralandırmalara dizeler veya int kullanmak daha mı iyi?


11

İşlerimde Java'da enumların kullanımı hakkında bir tartışma yapıyorduk.

Bir iş arkadaşı, sunucu tarafında enums kullanırken, gerektiğinde ona başvurmak için dize kullanmamız gerektiğini (örneğin, JS'den sunucuya veri gönderirken veya veritabanında depolarken), bunun çok daha net olduğunu savunuyordu. geliştirici için ve aynı zamanda yazım hataları durumunda hızlı başarısız olacağını savunuyor.

Bu durumlarda enumları tanımlamak için her zaman tamsayılar kullandım, çünkü değişmez tanımlayıcılar olurdu ve vaka ve yazım hatası sorunları olmayacaktı (bir geliştirici 1 yerine 2 değerini kullanma hatasını yapmış olsa bile, hızlı başarısız olmaz).

Bu argümanlar hakkında çok analitik olmak için, dize kullanmanın daha iyi olduğunu söyleyebilirim, ancak bu konuda garip bir his alıyorum (sanki iyi bir yaklaşım değilmiş gibi).

Bu tartışmayla ilgili bana yol gösterebilecek en iyi uygulamalar var mı?

Düzenleme: Mümkün olduğunda, enum'un kendisini kullanırız, böylece tüm Java kodumuz Enum'u kullanır. "Bir numaralamaya başvuru" ile kastediyorum: JavaScript'ten sunucuya veri alışverişi yaparken veya veritabanında veri depolarken numaradaki değere başvurmak


1
Sizin için "numaralamaya referans" nedir? Kaynak kodda normal kullanım? Bir veri tabanında depolamak için seri hale getirme? Kullanıcı belgelerinde kullanılacak ifade? Teknik belgelerde kullanılacak ifade? Cevap hepsi için oldukça farklı olacak.
Kilian Foth

Soruyu düzenledim ve umarım şimdi daha açıktır: "bir numaralamaya referans" ile JavaScript'ten Sunucuya veri alışverişi yaparken veya başka bir şekilde veritabanında bir değer depolarken veya veritabanında bir değer depolarken değeri referans almak demek
JSBach

Javascript API kesinlikle dizeleri kullanmak istiyorum. DB'de her ikisinin de avantajları vardır. Bazı veritabanlarında enum desteği vardır.
CodesInChaos

Yanıtlar:


15

İyi soru. Java'da enum kullanımı öncelikle doğası gereği kategorik olan bilgileri işlemek içindir. Klasik örnek, bir kartın sahip olabileceği dört tür elbiseyi işlemek için enum kullanıyor. Bir tamsayı kullanmanın tüm performans avantajını sağlar ve programınızda da açıktır.

Java dışında neden bir tamsayı kullanmaya devam etmeyesiniz? Belki de Java dışında numaralandırma türleriniz yoktur, ancak bu tamsayı performans amacıyla kullanmaya devam edemeyeceğiniz anlamına gelmez, değil mi? Evet, bu tamamen doğru, ancak yeni bir enum değeri eklediğinizde ne olacağını düşünün. Sonuna eklemezseniz, yeni değerden sonraki tüm diğer numaralandırma değerleri bir artırılır. Numarayı sadece belirleyeceğiz, böylece değişmeyecek ya da her zaman sonuna ekleyeceğiz. İş arkadaşlarınızın her zaman doğru şekilde yapacağından emin misiniz? Meh? Muhtemelen? İnşallah? Belki de% 100 değilsin. Bir saniye aklınızda bulundurun.

Patronunuz, son güncellemeden sonra yazılımınızı kullanan istemcide karışıklık olduğunu söylüyor. Şimdi tüm X varlıklarına gerçekten Z atanmış olsalar bile enum değeri Y olarak atanmış gibi davranıyorlar. Depoyu kontrol ettiniz ve evet, birisi yeni bir enum değeri ekledi ve sizden istedikleri gibi kurallarınıza uymadı. Artık gerçekten, 3 olması gerekirken veritabanı üzerinde o 4 yazılır ekledi komplikasyon var hariç gerçekten güncelleme öncesinde girilmiş olması kayıtlar vardır zaten 4'e 4. Ne enum değeri ilişkindir? Y değil mi? Hatırlayamıyorsun. Doğrulamak için programı kontrol etmeniz gerekir. Basitçe söylemek gerekirse, bu bir karmaşa.

Bunun yerine, veritabanınız "HEARTS", "DIAMONDS", "SPADES", "CLUBS" yazdıysa, alan açısından çok az şey kaybettiniz ve çok kazandınız. Küçük bir performans hitinden bahsettiğimiz doğru, ancak gerçekten bir fark yaratmak için veritabanına erişmemelisiniz. Alan gelince, bunu sistem yöneticilerine bırakın (sizin. Sorununuz değil.).

Değişiklik yapması kolay basit bir program yaptıysanız, uzun vadede kendinize bir iyilik yaptınız, bana güvenin. Bu yönü benim düşünceme göre farklı değil.


2
İyi puan, ama birileri enum varlıkları birinin adını (değiştirmeye karar vermesi durumunda unutuyorsun HEARTSiçin Hearttekrar falan sizin örnekte) ve aniden her sonları.
Scott Whitlock

1
@ScottWhitlock Bunu hesaba katarsanız değil, tamamen yeniden adlandırmaya karar verebilirler. Yanlışlıkla veritabanını ve projeyi de silebilirler, ancak burada olası her olayı açıklayamayız.
Neil

5
@Neil - doğru ama burada oranları oynamaya çalışıyoruz. Java enums ile aşina değilim, ama değerleri program dışında (örneğin bir veritabanında) dışında olması gerekiyorsa (örneğin Hearts = 1, Diamonds = 2, vb.) Açıkça sayılar için değerleri ayarlamak . Bir enum kullanmanın varsayılan yolu olmadığından, daha sonraki bir editör duraklaması vermelidir. Ayrıca bunların başka nerede kullanıldığını belirten bir yorum kullanışlı.
Scott Whitlock

1
@ScottWhitlock Bu tür problemlerden kaçınmak için kesinlikle daha iyi bir yol var. Bunu yaptığınızı varsayalım, yine de veritabanında 1, 2, 3, 4 görüyorsunuz veya bazı dosyalarda serileştirilmiş. Her bakımdan bakım açısından ideal değildir.
Neil

2
Eğer ekleyebilirsem, enum dize olarak serileştirilirse ve birisi enumun adını değiştirirse, serileştirme sırasında hata ayrıştırma sırasında olacaktır. Enum int ise ve biri tanımı değiştirirse, hata işlem sırasında daha da aşağıya doğru ilerler ve bu da teşhis edilmesi daha zor olur. CC @ScottWhitlock.
Endy Tjahjono

1

Neil'in cevabına katılıyorum, ama sadece bir ek:

Java enumlarında Nesneler vardır, böylece alanları ve yöntemleri olabilir. Böylece her bir numaraya manuel olarak belirtilen bir değer verebilirsiniz ve bunu dış iş için referans alırken, bunun yerine bu değeri kullanın.

Enum örneğinin adını ekleyerek / kaldırarak / yeniden sıralayarak ve değiştirerek hayatta kalacaktır. Ancak, birçok araçta bulunan otomajik kullanmak yerine, numaralandırma alanları için serileştirme / serileştirme mantığı yazmanız gerekecektir. (Kolay, ama ek çalışma).

Ve bu değerleri manuel olarak benzersiz tutmalısınız (ancak C stili numaralandırmalarda da aynıdır) ve bunu kontrol etmek için test yazabilirsiniz.


Evet, bu yola girdik, ancak hazırda bekletme modunu kullanıyoruz ve veritabanına / veritabanından değeri ayrıştırmak için bazı ekstra kod eklemek zorunda kaldık ve bu biraz garip görünüyordu, bu yüzden .STRING ilişkisini kullanmaya karar verdik ve numaralandırma adıyla gidin.
JSBach
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.