İddialar gerçeklikten kurtulamıyor
Genellikle iddialar gerçek verilerle temastan kurtulamaz. Hangi verilere ve hangilerinin kapsam dışı olduğuna karar vermek için yazılım mühendisliği sürecinin bir parçasıdır.
Devirli aile grafikleri
Aile "ağaçlar" ile ilgili olarak (aslında döngüler de dahil olmak üzere tam şişmiş grafikler), güzel bir fıkra vardır:
Yetişkin bir kızı olan bir dulla evlendim. Bizi sık sık ziyaret eden babam üvey kızıma aşık oldu ve onunla evlendi. Sonuç olarak, babam oğlum, kızım da annem oldu. Bir süre sonra, eşime babamın kardeşi olan bir oğul ve amcam verdim. Babamın karısının (aynı zamanda kızım ve annem olan) bir oğlu oldu. Sonuç olarak, aynı kişide bir erkek kardeşim ve bir torunum var. Eşim şimdi anneannem, çünkü o annemin annesi. Ben de eşimin kocasıyım ve aynı zamanda eşimin üvey torunuyum. Başka bir deyişle, ben kendi dedem.
Suretler veya "bulanık babalık" dikkate alındığında işler daha da garipleşir .
Bununla nasıl başa çıkılır?
Döngüleri kapsam dışı olarak tanımlayın
Yazılımınızın bu tür nadir durumlarla ilgilenmemesi gerektiğine karar verebilirsiniz. Böyle bir durum meydana gelirse, kullanıcı farklı bir ürün kullanmalıdır. Bu, daha yaygın vakalarla uğraşmayı çok daha sağlam hale getirir, çünkü daha fazla iddia ve daha basit bir veri modeli tutabilirsiniz.
Bu durumda, yazılımınıza bazı iyi alma ve verme özellikleri ekleyin, böylece kullanıcı gerektiğinde farklı bir ürüne kolayca geçiş yapabilir.
Manuel ilişkilere izin ver
Kullanıcının manuel ilişkiler eklemesine izin verebilirsiniz. Bu ilişkiler "birinci sınıf vatandaşlar" değildir, yani yazılım onları olduğu gibi alır, kontrol etmez ve ana veri modelinde ele almaz.
Kullanıcı daha sonra nadir vakaları elle halledebilir. Veri modeliniz hala oldukça basit kalacak ve iddialarınız devam edecektir.
Manuel ilişkilere dikkat edin. Onları tamamen yapılandırılabilir hale getirme ve böylece tamamen yapılandırılabilir bir veri modeli oluşturma cazibesi vardır. Bu işe yaramaz: Yazılımınız ölçeklenmez, garip hatalar alırsınız ve son olarak kullanıcı arayüzü kullanılamaz hale gelir. Bu anti-patern "yumuşak kodlama" olarak adlandırılır ve "Günlük WTF" bunun örnekleri ile doludur.
Veri modelinizi daha esnek hale getirin, iddiaları atlayın, değişmezleri test edin
Son çözüm, veri modelinizi daha esnek hale getirmektir. Neredeyse tüm iddiaları atlamanız ve veri modelinizi tam gelişmiş bir grafiğe dayandırmanız gerekir. Yukarıdaki örnekte gösterildiği gibi, kendi büyükbabanız olmak kolayca mümkündür, böylece döngüler bile yapabilirsiniz.
Bu durumda, yazılımınızı kapsamlı bir şekilde test etmelisiniz. Neredeyse tüm iddiaları atlamanız gerekiyordu, bu yüzden ek hatalar için iyi bir şans var.
Olağandışı test senaryolarını kontrol etmek için bir test veri üreteci kullanın. Haskell , Erlang veya C için hızlı kontrol kütüphaneleri vardır . Java / Scala için ScalaCheck ve Nyaya vardır . Bir test fikri, rastgele bir popülasyonu simüle etmek, rastgele karışmasına izin vermek, ardından yazılımınızın önce içe aktarıp ardından sonucu dışa aktarması olacaktır. Beklenti, çıkıştaki tüm bağlantıların da giriş ve çıkış ayetinde olması olacaktır.
Bir mülkün aynı kaldığı duruma bir değişmez denir. Bu durumda değişmez, simüle edilen popülasyondaki bireyler arasındaki "romantik ilişkiler" kümesidir. Mümkün olduğunca çok değişmez bulmaya çalışın ve bunları rastgele oluşturulmuş verilerle test edin. Değişmezler işlevsel olabilir, örneğin:
- daha "romantik ilişkiler" ekleseniz bile bir amca bir amca kalır
- her çocuğun bir ebeveyni vardır
- iki kuşaktan oluşan bir nüfusta en az bir büyük ebeveyn var
Veya teknik olabilirler:
- Yazılımınız 10 milyar üyeye kadar bir grafikte çökmeyecek (kaç bağlantı olursa olsun)
- Yazılımınız O (düğüm sayısı) ve O (kenar sayısı ^ 2) ile ölçeklendirilir
- Yazılımınız 10 milyar üyeye kadar her aile grafiğini kaydedip yeniden yükleyebilir
Simüle edilmiş testleri uygulayarak, çok sayıda garip köşe kutusu bulacaksınız. Onları düzeltmek çok zaman alacaktır. Ayrıca çok fazla optimizasyon kaybedeceksiniz, yazılımınız çok daha yavaş çalışacaktır. Buna değer olup olmadığına ve bunun yazılımınızın kapsamında olup olmadığına karar vermelisiniz.