Temel olarak hangisinin en kötü veya en iyi durumunuz olabileceğini ve bunlara sahip OLMADAN ÖNCE sahip olabileceğiniz diğer "Edge" vakalarını nasıl bulabilir ve kodunuzu onlar için nasıl hazırlayabilirsiniz?
Algoritmanın içeriğine bağlı olarak hangi veri yapılarının/türlerinin/yapılarının kullanıldığını belirleyebilirsiniz. Sonra, bunların (olası) zayıf noktalarını anlamaya ve bu durumlarda çalışmasını sağlayacak bir icra planı bulmaya çalışıyorsunuz.
Örneğin, algoritma girdi olarak bir dize ve bir tam sayı alır ve dizenin karakterlerinin bir tür sıralamasını yapar.
İşte burada:
String bilinen bazı özel durumlarda:
Tamsayı bilinen özel durumlar ile:
Sıralama algoritması, aşağıdaki sınır durumlarda başarısız olabilir:
Ardından, tüm bu durumları ele alın ve nasıl üst üste geldiğini anlamaya çalışan uzun bir liste oluşturun. Ör:
Şimdi onlar için test senaryoları oluşturun :)
Kısa özet: algoritmayı sınır durumlarını bildiğiniz temel bloklarda kırın ve ardından bunları yeniden birleştirin ve global sınır vakaları oluşturun
"Edge" in iki anlamı vardır ve Edge vakaları söz konusu olduğunda her ikisi de geçerlidir. Kenar, girişteki küçük bir değişikliğin çıktıda büyük bir değişikliğe yol açtığı bir alandır veya bir aralığın sonudur.
Bu nedenle, bir algoritmanın Edge örneklerini tanımlamak için önce girdi alanına bakarım. Edge değerleri algoritmanın Edge durumlarına yol açabilir.
İkincisi, çıktı alanına bakıyorum ve onları yaratabilecek giriş değerlerine tekrar bakıyorum. Bu, algoritmalarda daha az görülen bir sorundur, ancak belirli bir çıktı alanına yayılan çıktı üretmek için tasarlanmış algoritmalarda sorunların bulunmasına yardımcı olur. Örneğin. rastgele sayı üretecinin amaçlanan tüm çıktı değerlerini üretebilmesi gerekir.
Son olarak, benzer, ancak farklı çıktılara yol açan giriş durumları olup olmadığını görmek için algoritmayı kontrol ediyorum. Bu Edge vakalarını bulmak en zordur, çünkü hem alan adlarını hem de bir çift girişi içerir.
Edge koşullarını belirlemek için herhangi bir algoritma olduğunu sanmıyorum .... sadece deneyim.
Örnek: bir bayt parametresi için 0, 127, 128, 255, 256, -1 gibi sayıları, soruna neden olabilecek herhangi bir şeyi test etmek istersiniz.
Bu çok genel bir soru, bu yüzden tek yapabileceğim bazı genel, belirsiz fikirler atmak :)
-Sınır sınır davaları. Ör. bir dizeyi ayrıştırırsanız, dize boş veya null olursa ne olur? X'den y'ye sayıyorsanız, x ve y'de ne olur?
- Basitleştirilmiş veya D.R.Y.-ed. Gereksiz herhangi bir karmaşıklık, yanlış gidebilecek şeylere katkıda bulunabilir.
Algoritma kullanma becerisinin bir kısmı zayıflıklarını ve patolojik vakalarını bilmektir. Victor'un cevabı bazı iyi ipuçları veriyor, ancak genel olarak, bunu hissetmek için konuyu daha derinlemesine incelemenizi tavsiye ederim, bu soruyu tam olarak cevaplamak için başparmak kurallarını takip edebileceğinizi düşünmüyorum. Örneğin. bkz. Cormen veya Skiena (Özellikle Skiena, algoritmaların nerede kullanılacağı ve bazı durumlarda neyin iyi çalıştığı konusunda çok iyi bir bölüme sahiptir, Cormen daha fazla teoriye girer) .