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 NULL
etrafı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 NULL
sonra 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 NULL
ilk ö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, PowerManager
sahte bir IMsgSender
alt 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
NULL
için zorunlu görevlendirme gereğinden fazla abartılıdır , ancak - Bunun yerine (eğer mümkünse) bir referans veya bir
const
işaretçi kullanarak tüm tartışmayı adım adım yapabilirsiniz ve assert
ifadeler, birNULL
işlevin ön koşullarının karşılandığını doğrulamak için gardiyanlara daha aydınlık bir alternatiftir .
null
ve hiçbir şey yapmamak, hatayı idamın altına çekmenin bir yoludur ve kaynağa geri dönmeyi çok daha zorlaştırır.