Genel yöntemlerin argümanlarının doğrulanmasının önerildiğini duydum:
- Biri null beklemiyorsa null olup olmadığını kontrol etmeli mi?
- Bir yöntem parametrelerini doğrulamalı mı?
- MSDN - CA1062: Genel yöntemlerin bağımsız değişkenlerini doğrulama (.NET arka planım var ama soru C # 'a özgü değil)
Motivasyon anlaşılabilir. Bir modül yanlış bir şekilde kullanılacaksa, öngörülemeyen davranışlar yerine hemen istisna atmak istiyoruz.
Beni rahatsız eden şey, yanlış argümanların bir modül kullanılırken yapılabilecek tek hata olmamasıdır. Önerileri takip edersek ve hata yükseltme istemiyorsak kontrol mantığı eklememiz gereken bazı hata senaryoları aşağıdadır:
- Gelen çağrı - beklenmeyen argümanlar
- Gelen çağrı - modül yanlış durumda
- Harici arama - beklenmeyen sonuçlar döndürüldü
- Harici çağrı - beklenmeyen yan etkiler (çağrı modülüne çift giriş, diğer bağımlılık durumlarını kırma)
Tüm bu koşulları hesaba katmaya çalıştım ve tek bir yöntemle basit bir modül yazdım (üzgünüm, değil C # çocuklar):
public sealed class Room
{
private readonly IDoorFactory _doorFactory;
private bool _entered;
private IDoor _door;
public Room(IDoorFactory doorFactory)
{
if (doorFactory == null)
throw new ArgumentNullException("doorFactory");
_doorFactory = doorFactory;
}
public void Open()
{
if (_door != null)
throw new InvalidOperationException("Room is already opened");
if (_entered)
throw new InvalidOperationException("Double entry is not allowed");
_entered = true;
_door = _doorFactory.Create();
if (_door == null)
throw new IncompatibleDependencyException("doorFactory");
_door.Open();
_entered = false;
}
}
Şimdi güvende =)
Oldukça ürpertici. Ancak düzinelerce yöntem, karmaşık durum ve birçok dış çağrı (gerçek, bağımlılık enjeksiyon sevenler!) İle gerçek bir modülde ne kadar ürkütücü olabileceğini hayal edin. Hangi davranışı geçersiz kılan bir modülü (C # 'da mühürlü olmayan sınıf) çağırıyorsanız, harici bir arama yaptığınızı ve sonuçların arayanın kapsamında tahmin edilemeyeceğini unutmayın.
Özetle, doğru yol nedir ve neden? Aşağıdaki seçeneklerden birini seçerseniz, lütfen ek soruları yanıtlayın.
Tüm modül kullanımını kontrol edin. Birim testlerine ihtiyacımız var mı? Böyle bir kod örneği var mı? Bağımlılık enjeksiyonu kullanımda sınırlandırılmalı mı (daha fazla kontrol mantığına neden olacağından)? Bu kontrolleri hata ayıklama zamanına taşımak pratik değil mi (sürümde yer almayın)?
Yalnızca bağımsız değişkenleri kontrol edin. Deneyimlerime göre, argüman kontrolü - özellikle de null kontrol - en az etkili kontroldür, çünkü argüman hatası nadiren karmaşık hatalara ve hata artışlarına yol açar. Çoğu zaman bir NullReferenceException
sonraki satırda bir alacaksınız . Peki neden argüman kontrolleri bu kadar özel?
Modül kullanımını kontrol etmeyin. Oldukça popüler olmayan bir görüş, nedenini açıklayabilir misiniz?