Kimlik olarak Etki Alanı Nesneleri bazı karmaşık / ince sorunlar yaratır:
Seri hale / Seri kaldırma
Nesneleri anahtar olarak saklarsanız, nesne grafiğini serileştirmek son derece karmaşık hale gelir. stackoverflow
Özyineleme nedeniyle JSON veya XML'ye saf bir serileştirme yaparken hata alırsınız . Daha sonra, nesne örneğini serileştirmek ve özyineleme oluşturmak yerine, gerçek nesneleri kendi kimliklerini kullanmak için dönüştüren özel bir serileştirici yazmanız gerekir.
Nesneleri tür güvenliği için geçirin, ancak yalnızca kimlikleri saklayın, ardından çağrıldığında ilgili varlığı tembel yükleyen bir erişimci yönteminiz olabilir. İkinci düzey önbellekleme sonraki çağrılarla ilgilenir.
İnce referans sızıntıları:
Etki alanı nesnelerini, sizin gibi yapıcılarda kullanırsanız, etkin olarak kullanılmayan nesneler için belleğin geri kazanılmasına izin vermek çok zor olacak dairesel başvurular oluşturacaksınız.
İdeal Durum:
Opak kimlikleri vs int / long:
A id
, neyi tanımladığı hakkında hiçbir bilgi taşımayan tamamen opak bir tanımlayıcı olmalıdır. Ancak, sistemde geçerli bir tanımlayıcı olduğunu doğrulamalıdır.
Ham türler bunu kırıyor:
int
, long
Ve String
RDBMS sisteme tanımlayıcılar için en yaygın olarak kullanılan ham türleridir. Onlarca yıl öncesine dayanan uzun bir pratik nedenler tarihi vardır ve hepsi space
ya tasarruf time
ya da tasarruf ya da her ikisine de uyan tavizlerdir .
Sıralı kimlikler en kötü suçlulardır:
Sıralı bir kimlik kullandığınızda, geçici olarak semantik bilgileri kimlik olarak varsayılan olarak paketlersiniz. Kullanılana kadar kötü değil . İnsanlar kimliğin anlamsal kalitesini sıralayan veya filtreleyen iş mantığı yazmaya başladığında, gelecekteki koruyucular için bir acı dünyası kuruyorlar.
String
Alanlar sorunludur, çünkü saf tasarımcılar içeriğe, genellikle geçici anlambilimde de bilgi toplarlar.
Bunlar çünkü, hem de dağıtılmış veri sistemi oluşturmak mümkün değildir yapmak 12437379123
olduğunu değil benzersiz global. Dağıtılmış bir sistemdeki başka bir düğümün aynı numaraya sahip bir kayıt oluşturma şansı, bir sistemde yeterli veri elde ettiğinizde neredeyse garanti edilir.
Sonra hackler etrafında çalışmaya başlar ve her şey buharda bir karmaşaya dönüşür.
Devasa dağıtılmış sistemleri ( kümeleri ) göz ardı etmek, verileri diğer sistemlerle de paylaşmaya çalıştığınızda tam bir kabus haline gelir. Özellikle diğer sistem kontrolünüz altında değilse.
Aynı problemle, kimliğinizi global olarak nasıl benzersiz hale getireceğinizle sonuçlanırsınız.
UUID bir nedenle oluşturuldu ve standartlaştırıldı:
UUID
kullandığınız şekle bağlı olarak yukarıda listelenen tüm sorunlardan muzdarip olabilir Version
.
Version 1
benzersiz bir kimlik oluşturmak için bir MAC adresi ve zamanı kullanır. Bu kötüdür, çünkü konum ve zaman hakkında anlamsal bilgi taşır. Bu kendi başına bir sorun değildir, saf geliştiriciler iş mantığı için bu bilgilere güvenmeye başlarlar. Bu ayrıca herhangi bir saldırı girişiminde kullanılabilecek bilgileri de sızdırıyor.
Version 2
bir kullanıcı UID
ya da GID
domian kullanır ya UID
da GUI
zamanın yerine veri sızıntısı ve bu bilgilerin iş mantığında kullanılması riski Version 1
kadar kötüdür Version 1
.
Version 3
benzerdir, ancak MAC adresini ve zamanı kesinlikle semantik anlamı olan bir şeyden oluşan bir MD5
karma ile değiştirir byte[]
. Endişelenecek veri kaçağı yoktur, byte[]
kurtarılamaz UUID
. Bu, belirli bir şekilde UUID
örnek formu ve dış anahtar belirleyici bir şekilde oluşturmanın iyi bir yolunu sunar .
Version 4
sadece iyi bir çözüm olan rastgele sayılara dayanır, kesinlikle semantik bilgi içermez, ancak deterministik olarak yeniden oluşturulamaz.
Version 5
gibi Version 4
ama sha1
yerine kullanır md5
.
Etki Alanı Anahtarları ve İşlem Veri Anahtarları
Etki alanı nesne kimlikleri için tercihim, teknik nedenlerden dolayı kullanmak Version 5
veya Version 3
kısıtlanmış Version 5
olması.
Version 3
birçok makineye yayılmış işlem verileri için mükemmeldir.
Alan tarafından kısıtlanmadıkça bir UUID kullanın:
Benzersiz, garantili bir veritabanından veri dökümü ve farklı etki alanı verilerine atıfta bulunan yinelenen kimlikler hakkında endişelenmeniz gerekmediği başka bir veritabanına yeniden yükleme.
Version 3,4,5
tamamen opak ve bu şekilde olmalı.
A ile birincil anahtar olarak tek bir sütuna sahip UUID
olabilirsiniz ve daha sonra doğal bir bileşik birincil anahtarın ne olacağı için bileşik benzersiz dizinlere sahip olabilirsiniz.
Depolama alanı da olmak zorunda değildirCHAR(36)
. UUID
Hala endekslenebilir olduğu sürece belirli bir veritabanı için yerel bir bayt / bit / sayı alanında saklayabilirsiniz .
miras
Ham türleriniz varsa ve bunları değiştiremiyorsanız, yine de kodunuzda soyutlayabilirsiniz.
Bir kullanma Version 3/5
arasında UUID
sende geçebilir Class.getName()
+ String.valueOf(int)
bir şekilde byte[]
ve yeniden oluşturulabilir ve deterministik bir opak referans anahtarı var.