Yeni bir işte, şöyle kod için kod incelemelerinde işaretlenmeye başladım:
PowerManager::PowerManager(IMsgSender* msgSender)
: msgSender_(msgSender) { }
void PowerManager::SignalShutdown()
{
msgSender_->sendMsg("shutdown()");
}
Bana son yöntemin okuması gerektiği söylendi:
void PowerManager::SignalShutdown()
{
if (msgSender_) {
msgSender_->sendMsg("shutdown()");
}
}
yani ben gereken bir koyun NULLetrafında nöbet msgSender_bunun özel veri üyesi olmasına rağmen değişken. Bu 'bilgelik' parçasını nasıl hissettiğimi tarif etmek için kendimi patlayıcı maddeler kullanmaktan alıkoymak zor. Bir açıklama istediğimde, bir sınıf öğrencinin, bir yıl, bir sınıfın nasıl çalışması gerektiği ve kazara yapmaması gereken bir üyeyi kazara silmesi gerektiği hakkında (ve bunu daha NULLsonra ayarlamak üzere) nasıl kafasının karıştığı hakkında korku hikayeleri hakkında bir likitlik alıyorum. (görünüşe göre) ve ürün piyasaya sürüldükten hemen sonra alanda işler patladı ve biz her şeyiNULL kontrol etmenin daha iyi olduğunu "zor yoldan öğrendik, bize güvenin" .
Bana göre bu, kargo kültü programlaması gibi görünüyor , basit ve basit. İyi niyetli birkaç meslektaşım, “onu almam” konusunda bana yardım etmeye çalışıyor ve bunun daha sağlam bir kod yazmamda bana nasıl yardımcı olacağını görüyorlar ama… .
Bir kodlama standardının , bir fonksiyonda referans verilen her bir işaretçinin NULLilk önce - hatta özel veri üyeleri için kontrol edilmesini gerektirmesi uygun mudur ? (Not: Bir bağlam vermek için, bir hava trafiği kontrol sistemi ya da başka bir 'başarısızlığa eşittir insan ölmek' ürünü değil, tüketici elektroniği cihazı yapıyoruz.)
EDIT : Yukarıdaki örnekte, msgSender_ortak çalışan isteğe bağlı değildir. Eğer öyleyse NULL, bir hata olduğunu gösterir. Yapıcıya geçmesinin tek nedeni, PowerManagersahte bir IMsgSenderalt sınıfla test edilebilir .
ÖZET : Bu soruya gerçekten çok güzel cevaplar vardı, herkese teşekkürler. Birini @aaronps 'dan başlıca kısalıklarından dolayı kabul ettim. Oldukça geniş bir genel anlaşma olduğu anlaşılmaktadır:
- Korunan her işaretçi
NULLiçin zorunlu görevlendirme gereğinden fazla abartılıdır , ancak - Bunun yerine (eğer mümkünse) bir referans veya bir
constişaretçi kullanarak tüm tartışmayı adım adım yapabilirsiniz ve assertifadeler, birNULLişlevin ön koşullarının karşılandığını doğrulamak için gardiyanlara daha aydınlık bir alternatiftir .
nullve hiçbir şey yapmamak, hatayı idamın altına çekmenin bir yoludur ve kaynağa geri dönmeyi çok daha zorlaştırır.