Kesme noktaları ile hata ayıklama ve iddia çağrısı fark? Sadece birim testler için olduğunu düşündüm. Kesme noktasından daha fazlasını yapar mı? Kırılmaya başlayabildiğim için neden Assert kullanmalıyım?
Kesme noktaları ile hata ayıklama ve iddia çağrısı fark? Sadece birim testler için olduğunu düşündüm. Kesme noktasından daha fazlasını yapar mı? Kırılmaya başlayabildiğim için neden Assert kullanmalıyım?
Yanıtlar:
Hata ayıklama derlemesinde, Assert
Boole koşulunu parametre olarak alır ve koşul yanlışsa hata iletişim kutusunu gösterir. Koşul doğruysa program kesintisiz olarak devam eder.
Release'de derlerseniz, hepsi Debug.Assert
otomatik olarak dışarıda bırakılır.
Debug.Assert
serbest bırakma modunda olsun ki?
Gönderen Kod tam
8 Savunma Programlama
8.2 Bildiriler
Bir iddia, geliştirme sırasında kullanılan bir koddur - genellikle bir program veya makro - bir program çalışırken kendisini kontrol etmesini sağlar. Bir iddia doğru olduğunda, bu her şeyin beklendiği gibi çalıştığı anlamına gelir. Yanlış olduğunda, kodda beklenmedik bir hata tespit ettiği anlamına gelir. Örneğin, sistem bir müşteri bilgi dosyasının hiçbir zaman 50.000'den fazla kayda sahip olmayacağını varsayarsa, program kayıt sayısının 50.000'den az veya ona eşit olduğunu iddia edebilir. Kayıt sayısı 50.000'den az veya ona eşit olduğu sürece, iddia sessiz olacaktır. Bununla birlikte, 50.000'den fazla kayıtla karşılaşırsa, programda bir hata olduğunu yüksek sesle "iddia edecektir".
İddialar özellikle büyük, karmaşık programlarda ve yüksek güvenilirlik programlarında kullanışlıdır. Programcıların, uyumsuz arabirim varsayımlarını, kod değiştirildiğinde hata veren hataları vb. Daha hızlı bir şekilde temizlemelerini sağlar.
Bir iddia genellikle iki argüman alır: doğru olması gereken varsayımı tanımlayan bir boole ifadesi ve eğer değilse görüntülenecek bir mesaj.
(...)
Normalde, kullanıcıların üretim kodunda onaylama mesajlarını görmesini istemezsiniz; iddialar öncelikle geliştirme ve bakım sırasında kullanım içindir. İddialar normalde geliştirme sırasında koda derlenir ve üretim kodundan derlenir. Geliştirme sırasında, iddialar çelişkili varsayımları, beklenmedik koşulları, rutinlere aktarılan kötü değerleri vb. Temizler. Üretim sırasında, iddialar sistem performansını düşürmemek için koddan derlenirler.
Değişkenleri kontrol etmek için her küçük kod satırını kırmak istemediğiniz zamanlar için kullanmalısınız, ancak belirli durumlar varsa bir tür geri bildirim almak istersiniz, örneğin:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
System.Diagnostics
Assert ayrıca Microsoft'un UI tasarım becerilerine kıkırdama fırsatı sunuyor. Demek istediğim: İptal Et, Yeniden Dene, Yoksay ve üç düğmeli bir iletişim kutusu ve başlık çubuğunda bunların nasıl yorumlanacağıyla ilgili açıklama!
Assert, kodunuzda bir koşulun (posta veya ön) geçerli olduğunu iddia etmenizi sağlar. Bu, niyetlerinizi belgelemenin ve hata ayıklayıcının niyetiniz karşılanmadığı takdirde sizi bir iletişim kutusu ile bilgilendirmesini sağlamanın bir yoludur.
Bir kesme noktasının aksine, Assert kodunuzla birlikte gelir ve niyetiniz hakkında ek ayrıntılar eklemek için kullanılabilir.
Öncelikle Assert()
yöntem Trace
ve Debug
sınıflar için kullanılabilir .
Debug.Assert()
yalnızca Hata Ayıklama modunda yürütülüyor.
Trace.Assert()
Hata Ayıkla ve Bırak modunda yürütülüyor.
İşte bir örnek:
int i = 1 + 3;
// Debug.Assert method in Debug mode fails, since i == 4
Debug.Assert(i == 3);
Debug.WriteLine(i == 3, "i is equal to 3");
// Trace.Assert method in Release mode is not failing.
Trace.Assert(i == 4);
Trace.WriteLine(i == 4, "i is equla to 4");
Console.WriteLine("Press a key to continue...");
Console.ReadLine();
Bu kodu Hata Ayıklama modunda ve ardından Serbest bırakma modunda çalıştırın.
Hata Ayıklama modu sırasında kod Debug.Assert
deyiminizin başarısız olduğunu, uygulamanın geçerli yığın izini gösteren bir ileti kutusu aldığınızı fark edeceksiniz . Trace.Assert()
Koşul doğru olduğu için Yayınlama modunda bu gerçekleşmiyor (i == 4)
.
WriteLine()
yöntemi, bilgileri Visual Studio çıktısına kaydetme seçeneği sunar.
İddialar, Design by Contract (DbC) 'de, anladığım kadarıyla Meyer, Bertand tarafından tanıtıldı / onaylandı. 1997. Nesneye Yönelik Yazılım Yapısı.
Önemli bir özellik, yan etkiler üretmemeleri gerektiğidir, örneğin bir istisna işleyebilir veya bir if ifadesiyle farklı bir işlem yapabilirsiniz (savunma amaçlı programlama).
Sözleşmenin ön / posta koşullarını, müşteri / tedarikçi ilişkisini kontrol etmek için iddialar kullanılır - müşteri, tedarikçinin ön koşullarının karşılandığından emin olmalıdır. £ 5 gönderir ve tedarikçi post-koşulların karşılandığından emin olmalıdır. 12 gül verir. (Müşteri / tedarikçinin basit açıklaması - daha az kabul edebilir ve daha fazlasını sunabilir, ancak İddialar hakkında). C #, sürüm kodu için kullanılabilen Trace.Assert () yöntemini de sunar.
Soruyu cevaplamak için evet hala yararlılar, ancak kod ve zamana karmaşıklık + okunabilirlik + bakımı zor olabilir. Onları hala kullanmalı mıyız? Evet, hepsini kullanacak mıyız? Muhtemelen hayır ya da değil, Meyer'ın tarif ettiği ölçüde.
(Bu tekniği öğrendiğim OU Java kursu bile sadece basit örnekler gösterdi ve geri kalan kodlar kodun çoğunda DbC onaylama kurallarını zorunlu kılmadı, ancak programın doğruluğunu sağlamak için kullanıldığı varsayıldı!)
Düşünme şeklim Debug.Assert, bir yöntemin nasıl çağrılması gerektiği hakkında bir sözleşme oluşturmanın bir yoludur, bir parametrenin (yalnızca tür yerine) değerleri hakkındaki ayrıntılara odaklanır. Örneğin, ikinci parametrede null değer göndermemeniz gerekiyorsa, tüketiciye bunu yapmamasını bildirmek için Assert'i bu parametrenin etrafına eklersiniz.
Birinin kodunuzu bonehead bir şekilde kullanmasını engeller. Ama aynı zamanda, bu başlı yolun üretime geçmesine ve bir müşteriye kötü mesaj vermemesine izin verir (bir Release derlemesi inşa ettiğiniz varsayılarak).