Şimdi daha az anlayışlı, beklenti dolu bir örnek daha alalım. Burada bir numara var ve bir hata için öncelikler kümesi.
Veritabanında hangi değeri saklıyorsunuz?
Yani, depolamak olabilir 'C'
, 'H'
, 'M'
ve 'L'
veritabanındaki. Veya 'HIGH'
benzeri. Bu stringly yazılan veri sorunu var . Orada geçerli bir değerler bilinen kümesi vardır ve eğer değildir veritabanında bu kümeyi depolamak, onunla çalışmak zor olabilir.
Neden verileri kodda saklıyorsunuz?
Kodda List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
bu etkiyi veya başka bir şey var . Bu, bu verilerin çeşitli biçimlerini uygun formata sahip olduğunuz anlamına gelir (tüm büyük harfleri veritabanına ekliyorsunuz, ancak bunu görüntülüyorsunuz Critical
). Kodunuz artık yerelleştirmek için de zor. Fikrin veritabanı temsilini kodda depolanan bir dizeye bağladınız.
Bu listeye erişmek için ihtiyacınız olan her yerde, kod çoğaltmaya ya da bir sürü sabit olan bir sınıfa ihtiyacınız olacaktır. Hiçbiri iyi seçenek değil. Ayrıca , bu verileri kullanabilecek başka uygulamalar da olduğunu unutmamak gerekir (diğer dillerde yazılmış olabilir - Java web uygulamasında kullanılan Crystal Reports raporlama sistemi ve içine Perl toplu iş besleme verileri vardır). Raporlama motorunun geçerli veri listesini bilmesi gerekir ( 'LOW'
öncelikli olarak işaretlenmiş hiçbir şey olmazsa ne olur ve bunun rapor için geçerli bir öncelik olduğunu bilmeniz gerekir?) Ve toplu işin ne geçerli olduğu hakkında bilgi sahibi olur. değerler
Varsayalım, sen belki "Biz tek dil dükkanıysanız - her şey Java ile yazılmış" demek ve bu bilgileri içeren tek .jar var - ama şimdi sizin demektir uygulamalar sıkıca birbirlerine bağlanır ve bu .jar içeren veri. Her değişiklik olduğunda raporlama bölümünü ve toplu güncelleme bölümünü web uygulamasıyla birlikte serbest bırakmanız gerekir - ve bu sürümün tüm parçalar için sorunsuz bir şekilde uygulanacağını umarsınız .
Patronunuz başka bir öncelik istediğinde ne olur?
Patronun bugün geldi. Yeni bir öncelik var - CEO
. Şimdi tüm kodu gidip değiştirmek ve yeniden derlemek ve yeniden konuşlandırmak zorundasınız .
'Tabloda enum' yaklaşımıyla, enum listesini yeni bir önceliğe sahip olacak şekilde güncellersiniz. Listeyi alan tüm kod veritabanından onu çeker.
Veriler nadiren tek başına durur
Önceliklerle, veriler iş akışları hakkında bilgi içerebilecek veya bu önceliği ya da neyi ayarlayabilecek başka tablolara girer .
Bir miktar soruda belirtildiği gibi cinsiyete geri dönme: Cinsiyet, kullanılan zamirlerle bir bağlantıya sahiptir: he/his/him
ve she/hers/her
... ve bunu kodun kendisine zorla kodlamaktan kaçınmak istersiniz. Ve sonra patronunuz geliyor ve eklemenizin 'OTHER'
cinsiyete sahip olduğunu eklemeniz gerekiyor (basit tutmak için) ve bu cinsle ilişki kurmanız gerekiyor they/their/them
... ve patronunuz Facebook'un sahip olduğunu ve ... evet, evet.
Kendinizi bir enum tablosu yerine dizge biçiminde yazılan bir veri bitiyle sınırlandırarak, şimdi verilerle diğer bitler arasındaki ilişkiyi korumak için bu dizgiyi başka bir grup tabloda çoğaltmanız gerekir.
Peki ya diğer veri depoları?
Bunu nerede sakladığınız önemli değil, aynı ilke var.
priorities.prop
Öncelikler listesine sahip bir dosyanız olabilir . Bu listeyi bir özellik dosyasından okudunuz.
Bir girişi olan bir belge deposu veritabanına ( CouchDB gibi ) sahip olabilirsiniz enums
(ve ardından JavaScript'te bir doğrulama işlevi yazabilirsiniz ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
Biraz şema içeren bir XML dosyanız olabilir:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
Temel fikir aynı. Veri deposunun kendisi, geçerli değerler listesinin saklanması ve uygulanması gereken yerdir. Buraya yerleştirerek, kod ve veriler hakkında düşünmek daha kolaydır. Her seferinde neye sahipseniz savunma olarak endişelenmenize gerek yok (büyük harf mi, küçük mü? Neden chritical
bu sütunda bir tür var ? Vb ...) çünkü veri deposundan ne aldığınızı biliyorsunuz Veri deposunun tam olarak ne göndermeni beklediğini - ve geçerli bir liste için veri deposunu sorgulayabilirsiniz.
Götürmek
Geçerli değerler kümesi kod değil veridir . Sen do için çaba gerekir KURU kod - ama çoğaltılması sorunu da kopyasını olmasıdır verileri ziyade veri olarak yerini saygı ve bir veritabanında depolayarak daha kodda.
Daha kolay veri deposuna karşı birden fazla uygulama yazma yapar ve sıkıca verinin kendisine bağlandığı her şeyi dağıtmak gerekir örneklerini zorunluluğunu ortadan kaldırır - nedeniyle henüz verilere kodunuzu çiftleşmiş.
CEO
Öncelik eklendiğinde uygulamanın tamamını tekrar test etmeniz gerekmediğinden test uygulamalarını kolaylaştırır - çünkü önceliğin gerçek değerini önemseyen bir kodunuz yoktur.
Kod ve verileri birbirinden bağımsız olarak aktarabilmek, bakım yaparken hataları bulmayı ve düzeltmeyi kolaylaştırır.