Uygulamamızın veri modeline erişmek için XPath'ı kullanmamızı sağlayan Jaxen (Java için bir XPath kütüphanesi) için bir adaptör uyguluyoruz.
Bu, (Jaxen'den bize geçen) dizgileri veri modelimizin öğelerine eşleyen sınıflar uygulayarak yapılır. Toplamda 1000'den fazla dizi karşılaştırmasıyla 100'e yakın sınıfa ihtiyacımız olacağını tahmin ediyoruz.
Bence bunu yapmanın en iyi yolunun, / stringleri doğrudan koda yazılan ifadelerle ifade etmek - her dizeyi sabit olarak tanımlamak yerine, basit olduğunu düşünüyorum. Örneğin:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
Ancak her zaman dize değerlerini doğrudan koda gömmememiz, bunun yerine dize sabitleri oluşturmamız gerektiği öğretildi. Bunun gibi bir şey olurdu:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
Bu durumda bence bu kötü bir fikir. Sabit, getNode()
yöntemde yalnızca bir kez kullanılacaktır . Dizeleri doğrudan kullanmak, sabitleri kullanmak kadar okunması ve anlaşılması kolaydır ve bize en az bin satırlık bir kod yazmamızı sağlar.
Tek bir kullanım için dize sabitlerini tanımlamanın bir nedeni var mı? Veya doğrudan dizeleri kullanmak kabul edilebilir mi?
PS. Herkes bunun yerine enums kullanmasını önermeden önce prototip yaptık ancak enum dönüşümü, basit dize karşılaştırmasından 15 kat daha yavaş olduğu için dikkate alınmadı.
Sonuç: Aşağıdaki cevaplar bu sorunun kapsamını sadece string sabitlerinin ötesine genişletti, bu yüzden iki sonucum var:
- Bu senaryoda dizeleri doğrudan kullanmak yerine dizeleri kullanmak muhtemelen uygundur, ancak
- Dizeleri kullanmaktan kaçınmanın yolları vardır, ki bunlar daha iyi olabilir.
Bu yüzden dizeleri tamamen önleyen sarma tekniğini deneyeceğim. Ne yazık ki henüz string 7'yi kullanamadığımız için string switch deyimini kullanamıyoruz. Sonuçta, sanırım, bizim için en iyi cevap, her tekniği denemek ve performansını değerlendirmektir. Gerçek şu ki, eğer bir teknik açıkça daha hızlıysa, güzelliği veya konvansiyona bağlılığından bağımsız olarak muhtemelen seçeceğiz.
switch
etiket olarak kullanılmasını sağlar . if
Basamaklar yerine bir anahtar kullanın .