İddialar üretim kodunda ne zaman kalmalıdır? [kapalı]


166

Comp.lang.c ++ 'da devam eden bir tartışma var . C ++' da yalnızca varsayılan olarak hata ayıklama yapılarında bulunan iddiaların üretim kodunda tutulması gerekip gerekmediği konusunda denetlenmektedir.

Açıkçası, burada benim sorum bu yüzden her proje, benzersiz değil çok olsun iddialar tutulmalı, ancak hangi durumlarda içinde bu tavsiye / iyi bir fikirdir.

İddiaya göre, demek istediğim:

  • Yanlış olduğunda yazılımda bir hata gösteren bir koşulu test eden bir çalışma zamanı denetimi.
  • Programın durdurulduğu bir mekanizma (belki de gerçekten minimum temizlik çalışmasından sonra).

Mutlaka C veya C ++ hakkında konuşmuyorum.

Benim düşüncem, programcıysanız, ancak verilere sahip değilseniz (çoğu ticari masaüstü uygulamasında olduğu gibi), bunları devam ettirmelisiniz, çünkü başarısız bir onaylama bir hata gösterir ve gitmemelisiniz kullanıcı verilerini bozma riskiyle karşı karşıya. Bu, sizi göndermeden önce güçlü bir şekilde test etmeye zorlar ve böcekleri daha görünür hale getirir, böylece tespit edilmesi ve düzeltilmesi daha kolaydır.

Fikriniz / deneyiminiz nedir?

Alkış,

Carl

İlgili soruyu burada görün


Yanıtlar ve Güncellemeler

Hey Graham,

Bir iddia hata, saf ve basittir ve bu nedenle bir iddia gibi ele alınmalıdır. Bir hata sürüm modunda ele alındığından, gerçekten iddialara ihtiyacınız yoktur.

Bu yüzden iddialardan bahsederken "böcek" kelimesini tercih ederim. Her şeyi daha açık hale getiriyor. Bana göre "hata" sözcüğü çok belirsiz. Eksik dosya bir hata değil, bir hatadır ve program bununla başa çıkmalıdır. Boş bir göstergenin kuralsızlığını kaldırmaya çalışmak bir hatadır ve program bir şeyin kötü peynir gibi koktuğunu kabul etmelidir.

Bu nedenle, işaretçiyi bir iddiayla, normal hata işleme koduyla dosyanın varlığını test etmelisiniz.


Konu dışı bir konu ama tartışmada önemli bir nokta.

Head-up olarak, iddialarınız başarısız olduklarında hata ayıklayıcıya girerse neden olmasın. Ancak, kodunuzun kontrolünün tamamen dışında bir dosyanın bulunamamasının birçok nedeni vardır: okuma / yazma hakları, disk dolu, USB aygıtı takılı değil, vb. Üzerinde kontrolünüz olmadığından, iddiaların bununla başa çıkmanın doğru yolu değil.

Carl


Thomas,

Evet, Kod Tamamlandı ve bu tavsiyeye kesinlikle katılmıyorum demeliyim.

Özel bellek ayırıcısının vidalarını söyleyin ve başka bir nesne tarafından kullanılmakta olan bir belleği sıfırlar. Bu nesnenin düzenli olarak kayıttan çıkarıldığı bir işaretçiyi sıfırlarım ve değişmezlerden biri bu işaretçinin asla boş olmaması ve bu şekilde kaldığından emin olmak için birkaç iddianız var. İşaretçi aniden boşsa ne yaparsınız. Etrafında () çalışmasını umuyorsun?

Unutmayın, burada ürün kodundan bahsediyoruz, bu nedenle hata ayıklayıcıya girip yerel durumu denetlemiyoruz. Bu kullanıcının makinesinde gerçek bir hatadır.

Carl


3
Software Engineering SE'de ilginç bir ilgili yazı var (tartışma c ++ odaklı olsa da): Sürüm sürümlerinde iddialar olmalı
sonny

Yanıtlar:


84

İddialar modası geçmeyen yorumlar. Hangi teorik durumların amaçlandığını ve hangi durumların meydana gelmemesi gerektiğini belgelemektedirler. Kod, durumların değişmesine izin verecek şekilde değiştirilirse, geliştirici yakında bilgilendirilir ve onaylamayı güncellemesi gerekir.


16
@jkschneider: birim testleri program kodu kapsamındaki şeyleri test etmek içindir. iddialar, kodun bu varsayımlar altında işlemeye devam etmesinden önce, kodun dayandığı varsayımların gerçekte gerçek olmasını sağlamak içindir. Durum böyle olmadıkları takdirde programın iptal edeceği, varsayımı ifade edeceği ve varsayımın dayanmadığını göstermesi açısından "belgeler" dir. Tabii ki bu iddiayı da kodun belgeseli olarak okuyabilirsiniz.

2
Bu en iyi yanıttır, çünkü yorumları yorumlarla ilişkilendirir, bu da onlar hakkında yararlı bir düşünce şeklidir. Yorumlardan bir adım öteye geçiyorlar çünkü geliştirme sırasında sürekli olarak makine testine tabi tutuluyorlar, ancak her zaman önce insan okuyucular için anlamlı olmalılar. Yorumlar gibi, mantığın veya son uygulamanın bir parçası olmamalıdır. Yorumlar gibi, dilin derlenip yorumlanmamasına veya yorumlanmasına, yayılma planlarınız, gizleme stratejiniz vb.Bağlı olarak bunları bırakabilir veya çıkarabilirsiniz. Bir yorumun aslında bir hataya neden olduğu bir durum gördüm, ancak bu tuhaf biri.
DaveWalley

1
Daha spesifik olarak, varsayımlar bilgi amaçlıdır ve işlevsel değildir . Bir savunucunun kendi başına program akışı veya sonuçları üzerinde bir etkisi yoktur. Öte yandan, bir istisna, program akışını değiştirir ve sonuç verir.
yoyo

59

Steve McConnell'in Kodu Tamamlandı. Bildiri bölümü 8.2.

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.

Bununla birlikte, aynı bölümün ilerleyen kısımlarında bu tavsiye verilmektedir:

Oldukça sağlam kod için hatayı yine de iddia edin ve işleyin.

Performans bir sorun olmadığı sürece, iddiayı bırakın, bir mesaj görüntülemek yerine bir günlük dosyasına yazmasını sağlayın. Ben de tavsiye Kod Tamamlandı olduğunu düşünüyorum, ama şu anda bulamıyorum.


7
Ben Kod Komple ikinci alıntı ne demek olduğunu iddia - üretim kodu derlenmiş olacak - ve ayrıca "if (! Condition) {AttemptGracefulRecovery ();}", yani don olmalıdır Program değişmezlerinin ihlali programın çökmesine izin vermeyin.
yoyo

34

Programın kapalıyken önemli ölçüde daha hızlı çalıştığını ölçmediyseniz, üretim kodunda onayları açık bırakın.

daha verimli olduğunu kanıtlamak için ölçmeye değmezse, bir performans oyunu için netlikten ödün vermeye değmez. "- Steve McConnell 1993

http://c2.com/cgi/wiki?ShipWithAssertionsOn


11
Aslında, meydana gelen en kötü şey, bir iddia OLMAYAN bir şey nedeniyle kod çöktüğü zamandır. Kod daha sonra% 100 olasılıkla daha sonra çökecekse, iddia kesinlikle orada olmalıdır. Bir işaretçiyi kaydettiyseniz, daha önce boş olmadığını dolaylı olarak belirtmeniz gerekir. Bir sayıya bölerseniz, sıfır olmadığını iddia edersiniz. Ekleri çıkarın ve tüm çökme yerleri BELGESİZDİR. Asıl sorun, programı alt sistemlerin çökmesine ve bir bekçi tarafından yeniden başlatılmasına izin verecek şekilde yapılandırmak değildir.
Rob

5
assert ref != null;farklıdır if (ref == null) throw new IllegalArgumentException();Yanlış olabilir ön koşulları için ilk kullanan edilmemelidir. Yanlış olmayanassert şeyler için kullanmanız gerekir . Örnek, daha sonra insanlara olumlu olduğunu hatırlatmak için ,int i = -1 * someNumber; i = i * i;iassert i > 0;
Kaptan Adam

1
"Aslında, ortaya çıkan en kötü şey, bir iddia olmayan bir şey nedeniyle kod çöktüğü zamandır. Kod daha sonra% 100 olasılıkla daha sonra çökecekse, o zaman iddia kesinlikle orada olmalıdır." - Bu yanlış bir ikilik.
Rob Grant

2
@RobertGrant: Birçok program için çökme, olabilecek en kötü şeyden uzaktır. Bir binanın veya köprü tasarımının sağlamlığını kontrol etmesi gereken bir program için, bir tasarımın ses olduğunu yanlış bildirmek, yapabileceği en kötü şey hakkında olabilir. Dış dünyaya açık olan ancak gizli verilere salt okunur erişime sahip bir program için, verilerin sızdırılması, programın yapabileceği diğer her şeyden daha kötü olabilir. Nedenin anlamlı bir göstergesi olmayan bir çöküşün "olabilecek en kötü şey" olduğu düşüncesi, çok daha kötü olan birçok tehlikeyi göz ardı eder.
Supercat

@supercat Alıntı yaptığım yorumu kabul etmiyordum.
Rob Grant

21

Üretimde iddiaları bırakmayı düşünüyorsanız bile, muhtemelen onları yanlış düşünüyorsunuz. Tüm iddialar, bunları üretimde kapatabileceğinizdir, çünkü bunlar çözümünüzün bir parçası değildir. Bunlar, varsayımlarınızın doğru olduğunu doğrulamak için kullanılan bir geliştirme aracıdır. Ancak üretime başladığınız zaman, varsayımlarınıza zaten güvenmelisiniz.

Bununla birlikte, üretimde iddiaları açacağım bir durum var: Üretimde test ortamında çoğaltmakta zorlandığımız tekrarlanabilir bir hatayla karşılaşırsak, hatayı iddiayı açık olarak yeniden oluşturmak yararlı olabilir yararlı bilgi sağlayıp sağlamadıklarını görmek için.

Daha ilginç bir soru şudur: Test aşamasında, iddiaları ne zaman kapatırsınız?


4
İddiaların asla üretim koduna dahil edilmemesi gerektiğini düşünüyorum. iddialar hata DEĞİLDİR, geliştiriciler için tasarlanmıştır. İddialar sadece test kodunda olmalıdır. Bir uygulama kilitlenmesine sahip olmak ve iddianın kabul edilemez ve özensiz gelişimden kaynaklanması. Geliştiricilerin hataları zarifçe ele almak için ekstra yol kat etmesi gerekir.
iksnae

9
Bir fn'ye boş bir işaretçi verildiğinde çökmeniz kaçınılmazsa; bununla açıkça ilgilenme seçeneği yoktur. Koşulu incelikle ele almanın bir yolu var (çünkü dış dünyadan gelen girdiden gelebilir) veya yol boyunca işleri bozmuş olabilecek rastgele bir nokta yerine, bir iddia ile BELGELİ bir yere çarpıyorsunuz. iddia nasıl ele alınır modül başına bir karar olmalıdır. Belki bekçi köpeğiniz işlemi yeniden başlatır veya modülün başlangıç ​​durumuna sıfırlanması için bir bellek silersiniz (yumuşak nesne "yeniden başlatma").
Rob

1
Bu, iddiaların kullanımının sınırlı bir görünümü olduğunu düşünüyorum. Ekleri her zaman hem konsol hem de bulut depolama alanına kaydeder ve üretimde bırakırım. Bırakmak varsayımlarımın üretim kodunda ve üretim kullanımında bile doğru kaldığını doğrular. Kod, hatalar ile hata ayıklamada birkaç kez başarılı bir şekilde çalıştığından, kullanıcıların aynı kod yolundan farklı değerleri iletmenin bir yolunu bulamayacağı anlamına gelmez.
SafeFastExpressive

Assert ifadesinin bütün amacı kontrolleri açıp kapatabilmenizdir. Onları üretimde bırakırsanız neden onay ifadesini kullanıyorsunuz?
MiguelMunoz

1
İddialar genellikle sistemi yavaşlatır. Üretim için tasarlanmadığından, yavaş ve verimsiz olmaları serbesttir, bu da belirli testleri yapmak için gerekli olabilir. Örneğin, Microsoft bir zamanlar Excel'e hızlı yeniden hesaplama özelliği ekledi. Bir hücre değiştiğinde, bu özellik yeniden hesaplamayı sadece ihtiyacı olan hücrelerle sınırlandırdı. Bunu, tüm forma sayfasını yeniden hesaplayan ve sonuçları karşılaştıran bir iddia ile test ettiler. Bu, geliştirme versiyonunun gerçekten yavaş çalışmasını sağladı, ancak aynı zamanda çok sayıda hata ayıkladı. Bu özelliği piyasaya sürdüklerinde çok güvenilir olduklarını kanıtladılar.
MiguelMunoz

16

İddialar asla üretim kodunda kalmamalıdır . Belirli bir iddia üretim kodunda faydalı gibi görünüyorsa, bir iddia olmamalıdır; Böyle kodlanmış bir çalışma zamanı hatası kontrol, yani bir şey olmalıdır: if( condition != expected ) throw exception.

Terim 'iddiası' anlamına gelmiştir "bir gelişme seferlik hangi kontrol değil sahada gerçekleştirilebilir."

İddiaların sahaya gelebileceğini düşünmeye başlarsanız, kaçınılmaz olarak, herhangi bir iddiada bulunmaya gerçekten değip değmeyeceğini merak etmek gibi başka tehlikeli düşünceler de yapmaya başlayacaksınız. Yapmaya değmez bir iddia yoktur. Kendinize asla “bunu iddia etmeli miyim, söylememeli miyim?” Diye sormamalısınız. Sadece kendinize "iddia etmeyi unuttuğum bir şey var mı?"


6

Profil oluşturma, iddiaların performans sorunlarına neden olduğunu göstermedikçe, üretim sürümlerinde de kalmaları gerektiğini söylüyorum.

Ancak, bunun aynı zamanda iddianın başarısızlıklarını biraz incelikle ele almanızı gerektirdiğini düşünüyorum. Örneğin, yalnızca programdan çıkmak veya çökmekle kalmayıp sorunu geliştiricilere (otomatik olarak) bildirme seçeneğiyle genel bir iletişim türü oluşturmalıdırlar. Ayrıca, gerçekten izin verdiğiniz, ancak muhtemelen istemediğiniz veya istemediğiniz durumlar için iddiaları kullanmamaya dikkat etmelisiniz. Bu koşullar kodun diğer bölümleri tarafından ele alınmalıdır.


Gördüğüm gibi, bir üretim iddiasının temel amacı acil bir geri dönüş durmasıdır: programın devam etmesine izin vermenin, programın önlenebileceği her şeyden daha önemli olduğu kadar ciddi olan zararlara neden olması muhtemeldir. İyi bir hata mesajına sahip olmak mümkünse iyi olurdu, ancak bu sadece ikincil öneme sahiptir.
Supercat

5

Benim C ++ 'de, bir sürüm derlemesinde onaylama başarısız olursa, istisna (x) gibi REQUIRE (x) tanımlarım.

Başarısız bir iddia bir hatayı gösterdiğinden, bir Yayın derlemesinde bile ciddi şekilde ele alınmalıdır. Kodumun performansı önemli olduğunda, daha yüksek düzey kod için REQUIRE () ve hızlı çalışması gereken daha düşük düzey kod için assert () kullanacağım. Arıza koşulunun üçüncü bir tarafın yazdığı koddan veya veri bozulmasından kaynaklanabileceğinden, iddia yerine REQUIRE kullanıyorum (en iyi şekilde, dosya bozulması durumunda özellikle iyi davranacak şekilde kodu tasarlarım, ancak biz bunu yapmak için her zaman vaktiniz olmaz.)

Bu iddia mesajlarını son kullanıcılara göstermemeniz gerektiğini söylüyorlar çünkü onları anlamayacaklar. Yani? Son kullanıcılar size ekran görüntüsü veya hata mesajının bazı metinlerini içeren bir e-posta göndererek hata ayıklamanıza yardımcı olabilir. Kullanıcı sadece "çöktü" diyorsa, düzeltmek için daha az yeteneğiniz vardır. Onay hatası mesajlarını internet üzerinden kendinize otomatik olarak göndermek daha iyi olur, ancak bu sadece kullanıcının internet erişimi varsa çalışır ve izinlerini alabilirsiniz.


Ayrıca, bu iddia mesajlarını bilgisayar korsanlarına göstermemeniz gerektiğini söylüyorlar, çünkü bunlar
içeri girmek

4

Bunları saklamak istiyorsanız, hata işleme ile değiştirin. Kaybolan bir programdan daha kötü bir şey yok. Belirli hataların ciddi hatalar olarak ele alınmasında yanlış bir şey görmüyorum, ancak programınızın veri toplayarak, günlüğe kaydederek ve uygulamanızın istenmeyen bir durumu olduğunu kullanıcıya bildirerek bunlarla başa çıkmak için donanımlı bir bölümüne yönlendirilmeli ve çıkıyor.


2

Diğer herhangi bir hata gibi ele alınmaları koşuluyla, bununla ilgili bir sorun görmüyorum. Yine de, C'deki başarısız iddiaların, diğer dillerde olduğu gibi, programdan çıkacağını unutmayın ve bu genellikle üretim sistemleri için yeterli değildir.

Bazı istisnalar vardır - örneğin PHP, yalnızca hatalar yerine özel hataları görüntüleyebilmeniz, ayrıntılı günlük kaydı yapabilmeniz vb. İçin hatalar için özel bir işleyici oluşturmanıza olanak tanır.


2

Veritabanı sunucusu yazılımımız hem üretim hem de hata ayıklama iddialarını içerir. Hata ayıklama iddiaları sadece - üretim kodunda kaldırılır. Üretim iddiaları sadece (a) asla var olmaması gereken bir durum varsa ve (b) bu ​​durumdan güvenilir bir şekilde iyileşmenin mümkün olmadığı durumlarda gerçekleşir. Üretim iddiası, yazılımda bir hatayla karşılaşıldığını veya bir tür veri bozulması oluştuğunu gösterir.

Bu bir veritabanı sistemi olduğundan ve potansiyel olarak işletme açısından kritik verileri depoladığımızdan, bozuk verileri önlemek için elimizden geleni yapıyoruz. Yanlış verileri depolamamıza neden olabilecek bir durum varsa, derhal tüm işlemleri iddia eder, geri alır ve sunucuyu durdururuz.

Bunu söyledikten sonra, performans açısından kritik rutinlerde üretim iddialarından kaçınmaya çalışıyoruz.


5
"Üretim iddianıza" "istisna" diyebilirim ve böyle kodlarım.
DaveWalley

1
Muhtemelen haklısınız ancak ürün başlangıçta C ile yazılmıştır. C ++ olarak değiştirdiğimizde bile, bazı platformlarımızda kullandığımız derleyiciler istisnaları düzgün bir şekilde desteklemedi. Eski kodların çoğu C ++ ile yeniden yazılmadı, bu nedenle bu iddialar hala kullanılıyor.
Graeme Perrow

1

Ekleri sıralı birim testler olarak görüyorum. Gelişirken hızlı bir test için kullanışlıdır, ancak sonuçta bu iddialar birim testlerde dışarıdan test edilmek üzere yeniden hesaplanmalıdır.


İddia: Bir gerçeği veya inancı belirtin. Sadece test etmek için değil, doğru olduğunu düşündüğünüzü belirtmek için (yani varsayımlarınız), bu nedenle varsayımlarınız bir nedenle yanlışsa programınız devam etmeyecektir. Örneğin, bu geçerli bir iddia kullanımıdır: assert (pow (1,0) <1). Hata kontrolü için gerçekten uygun bir yer değil, çünkü bu doğru değilse, modern matematiğin hemen hemen hepsi yanlıştır ve ... peki, bununla nasıl başlayabilirsiniz? Yanlış varsayımın program kapsamı dışında kalması; imana inanıyorsun. Ama yine de doğrularsın.

1

Kapsamdaki tüm hataların üstesinden gelmeyi en iyi buluyorum ve doğru olduğunu iddia ettiğimiz varsayımlar için iddiaları kullanıyorum.

yani, programınız bir dosyayı açıyor / okuyor / kapatıyorsa, o zaman dosyayı açamama kapsamı içindedir - başka bir deyişle, görmezden gelmeyi ihmal etmek gerçek bir olasılıktır. Yani, bununla ilişkili hata kontrol kodu olmalıdır.

Ancak, diyelim ki fopen () her zaman geçerli, açık bir dosya tanıtıcısı döndürüyor. Dosyayı açın ve readfile () işlevinize iletin.

Bu readfile işlevi, bu bağlamda ve muhtemelen tasarım özelliklerine göre, geçerli bir dosya ptr alacağını varsayabilir. Bu nedenle, böyle basit bir programda, olumsuz durum için hata işleme kodu eklemek israf olacaktır. Ancak, yürütmeyi sürdürmeden önce, en azından bir şekilde - bir şekilde - bu durumun aslında böyle olduğunu varsaymalıdır. GERÇEKTEN yanlış çağrılması veya örneğin başka bir programa kopyalanması / yapıştırılması durumunda her zaman geçerli olacağını varsaymamalıdır.

Yani, readfile () {assert (fptr! = NULL); ..} bu durumda uygundur, ancak tam gelişmiş hata işleme (aslında dosyayı okumanın yine de bazı hata işleme sistemi gerektireceği gerçeğini göz ardı ederek).

Ve evet, bu iddialar, onları devre dışı bırakmak için kesinlikle gerekli olmadıkça, üretim kodunda kalmalıdır. O zaman bile, bunları yalnızca performans açısından kritik bölümlerde devre dışı bırakmalısınız.


1

Bir kod parçasının üretimde olduğunu ve normalde tetiklenecek bir iddiayı vurduğunu varsayalım. İddia bir hata buldu! Bunun dışında, çünkü iddia kapalıdır.

Peki şimdi ne olacak? Program, sorunun kaynağından daha fazla kaldırılan bir noktada (1) bilgilendirici olmayan bir şekilde çökecek veya (2) büyük olasılıkla yanlış sonuç verecek şekilde tamamlanmak üzere nadiren çalışacaktır.

Her iki senaryo da davetkar değil. Üretimde bile iddiaları aktif bırakın.


0

Zaman türü denetimini derleyen başka şeyler için nadiren iddiaları kullanıyorum. Sadece çoğu dil onları ele almak için inşa edildiğinden, bir iddia yerine bir istisna kullanırdım.

Bir örnek öneriyorum

file = create-some-file();
_throwExceptionIf( file.exists() == false, "FILE DOES NOT EXIST");

karşısında

file = create-some-file();
ASSERT(file.exists());

Uygulama iddiayı nasıl ele alacaktı? try catchÖlümcül hatalarla başa çıkmanın eski yöntemini tercih ederim .


2
İstisnalar, buradaki örnekte olduğu gibi, çalışan bir uygulamada karşılaşmayı beklediğiniz olağandışı durumlar içindir. İddialar, hiç karşılaşmamanızı beklediğiniz durumlar içindir. Yani, onlarla karşılaşırsanız, kodunuzda bir hata olması gerekir. Örneğinizde ve istisna açıkça doğru yaklaşımdır. Ancak, iddiaları yakalamak için hala çok faydalıdır.
MiguelMunoz

0

Çoğu zaman, ben java (assert anahtar kelime) iddiasını kullandığınızda otomatik olarak sonra bazı üretim kodları ekleyin. Davaya göre, bir günlük mesajı, bir istisna ... veya hiçbir şey olmayabilir.

Bana göre, tüm iddialarınız üretimde değil, sürümde kritik öneme sahiptir. Bazıları saklanmalı, diğerleri atılmalıdır.


0

DEĞERLENDİRME hata değildir ve hata olarak ele alınmamalıdır. Bir iddia atıldığında, kodunuzda veya alternatif olarak kodunuzu çağıran kodda bir hata olduğu anlamına gelir.

Üretim kodunda iddiaları etkinleştirmekten kaçınmak için birkaç nokta vardır: 1. Son kullanıcınızın "ASSERTION başarısız MyPrivateClass.cpp satır 147" gibi bir mesaj görmesini istemezsiniz. Son kullanıcı siz QA mühendisi DEĞİLDİR . performansı etkilemek

Bununla birlikte, iddiaları bırakmak için güçlü bir neden vardır: DEĞERLENDİRME performansı ve zamanlamayı etkileyebilir ve ne yazık ki bu bazen önemlidir (özellikle gömülü sistemlerde).

İddiayı üretim kodunda bırakmak için oy verme eğilimindeyim, ancak bu iddiaların çıktılarının son kullanıcıya maruz kalmadığından emin olmak için oy kullanıyorum.

~ Yitzik


Hayır, iddialar varsayılan gerçekler içindir. Kodumuz HER ZAMAN 25 döndüreceği varsayıldığında 27 değerini döndürürse, sorun evren hakkındaki fiziksel varsayımlarımızda da bir hata olabilir: belki bu iki bit, bilgi işlem tarihinde ilk kez 5 olası değere geçti. İddia, kodunuzun hala yazıldığı varsayımlar altında çalıştığını doğrulamak için var. Fizik pencereden dışarı çıkarsa, kodunuz fark etmeli, sürücüyü yalnız bırakmalı ve öndeyken bırakmalıdır;) Ama evet, kodda bir hata değil ve ne tür bir hata işleme yapabilirdiniz?

Benim fikrimi düzeltmem için izin ver: 1. İddia varsayımlarımızı kontrol et. Varsayımlarımız yanlışsa, bu bizim kodumuzda bir hata olduğu anlamına gelir. 2. Kodumuz, kodumuzun kullanımını iddia etmemelidir. örn. kullanıcı girişinde bir sorun varsa, bir işlev iddiasında başarısız olmamalıdır. Biz hata döndürecek ve kullanıcı (o başarı iddia edebilir) 3. işleyecek iddiası üretimde terk tercih - ama muhtemelen davranış değiştirilecektir. Uygun bir hata işlemenin olmadığını kabul ediyorum. Başarısızlık iddiası == hata .. ancak sistem durdurma ve yeniden başlatma için beklemek yerine kendini yeniden başlatabilir.
Yitshak Yarom

1
GEREKLİ BİR hata olduğu anlamına gelmez. Örneğin, dahil olduğum projelerin çoğu, dokümantasyonda varsayılan gerçeklerin bir listesi ile birlikte geliyor. Bu varsayımlar, iş adamları onlara yanlış bir şey söylediklerinde veya örneğin üçüncü taraflardan belirli değişkenler hakkında bilgi bulunmadığında, geliştiricilerin kodunun buggy olarak adlandırılmasını önlemek için vardır. Yalnızca BT'nin doğru olup olmadığını değil, üçüncü taraf sistemlerinin doğru olduğunu programın çalıştırılması / çalıştırılmaması gerektiğini doğrulamak için iddialar kullanılabilir.

-8

Bir iddia hata, saf ve basittir ve bu nedenle bir iddia gibi ele alınmalıdır.

Bir hata sürüm modunda ele alındığından, gerçekten iddialara ihtiyacınız yoktur.

İddialar için gördüğüm ana fayda, koşullu bir moladır - 1 kod satırı gerektiren bir şey kurmak için VC'nin pencerelerini delmekten çok daha kolaydır.


2
Önermeleri koşullu kesme noktaları olarak kullanmak çeşitli nedenlerden dolayı gerçekten can sıkıcıdır. En önemlisi, bu iddiaların takımdaki diğer geliştiricileri karıştırmasıdır - bu iddia tetiklendiğinde bir hata olup olmadığını veya birisinin koşullu kesme noktasını koda bıraktığını nasıl bilebilirler?
lego

Eğer ekler ilk etapta kodda olmasaydı olmazdı. Bunları yalnızca kodu izlemek için kullanıyor olsaydınız, onları görürdünüz (kaynak ağacında kontrol etmedikçe). Neredeyse her şeyi ileri süren yerlerde çalıştım. Yardım dokümantasyon sunucusu kullanılamadığı için programın başında yaklaşık 60 kez tıklamak zorunda kalmak çok çabuk yorucu oluyor.
graham.reeds
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.