Sormanız gereken temel soru şudur: İşleviniz için arayüzün ne olmasını istiyorsunuz? Özellikle, _Materials.ContainsKey(name)
koşul, işlevin bir önkoşulu mu?
Eğer öyleyse değil önkoşulu, işlev için iyi tanımlanmış bir sonuç vermelidir tüm olası vales name
. Bu durumda, bir name
parçası değilse atılan istisna _Materials
, fonksiyonun arayüzünün bir parçası olur. Bu, arayüz dokümantasyonunun bir parçası olması gerektiği anlamına gelir ve ileride bu istisnayı değiştirmeye karar verirseniz, bu bir ara yüz değişimi olacaktır .
Daha ilginç olan soru, eğer bir önkoşul ise ne olur. Bu durumda önkoşulun kendisi fonksiyon arayüzünün bir parçası olur, ancak bu koşul ihlal edildiğinde bir fonksiyonun nasıl davrandığı mutlaka arayüzün bir parçası değildir .
Bu durumda, gönderdiğiniz yaklaşım, önkoşul ihlallerini kontrol etmek ve hatayı rapor etmek, savunma programlaması olarak bilinir . Defansif programlama, bir hata yaptığında ve işlevini sahte bir argümanla çağırdığında kullanıcıyı erkenden bilgilendirdiği için iyidir. Kullanıcı kodu, işlevin ön koşul ihlallerini belirli bir şekilde ele almasına bağlı olabileceğinden, bakım yükünü önemli ölçüde arttırması kötüdür. Özellikle, çalışma zamanı kontrolünün gelecekte hiç bir performans darboğazına dönüşmediğini tespit ederseniz (bu kadar basit bir durum için muhtemel değildir, ancak daha karmaşık ön koşullar için oldukça yaygındır), artık kaldıramayabilirsiniz.
Bu dezavantajların çok önemli olabileceği ortaya çıktı, bu da savunma programlamasına bazı çevrelerde kötü bir ün kazandı. Ancak, başlangıçtaki hedef hala geçerlidir: İşlevimizin kullanıcılarının bir hata yaptığında erken fark etmelerini istiyoruz.
Bu nedenle günümüzde birçok geliştirici bu tür sorunlar için biraz farklı bir yaklaşım önermektedir. Bir istisna atmak yerine, önkoşulları kontrol etmek için onay benzeri bir mekanizma kullanırlar. Diğer bir deyişle, ön koşullar kullanıcıların hatalarını erken yakalamalarına yardımcı olmak için hata ayıklama yapıları içinde kontrol edilebilir, ancak işlevler arayüzünün bir parçası değildir. Fark ilk bakışta ince görünebilir, ancak pratikte büyük bir fark yaratabilir.
Teknik olarak, ihlal edilmiş ön koşullara sahip bir işlevi çağırmak tanımsız davranıştır. Ancak uygulama, bu vakaları tespit etmeye ve bu durumda derhal kullanıcıyı bilgilendirmeye karar verebilir. İstisnalar ne yazık ki, kullanıcı kodu bunlara tepki gösterebileceği ve dolayısıyla varlıklarına güvenmeye başlayabileceğinden, bunu uygulamak için iyi bir araç değildir.
Klasik savunma yaklaşımı ile ilgili sorunların ayrıntılı bir şekilde açıklanmasının yanı sıra , eşik tarzı önkoşul kontrolleri için olası bir uygulama için, John Lakos'un CppCon 2014'ten Sağlanan Doğru Savunma Programları konuşmasına bakın ( Slaytlar , Video ).
_Materials.Add
Bir istisna atmak mı ?