null
Kullanım Uygulama / Dil Bağımlı
Sonuç null
olarak geçerli bir uygulama değeri olarak kullanılıp kullanılmayacağının seçimi büyük ölçüde uygulamanız ve programlama dili / arayüzü / kenarı tarafından belirlenir.
Temel düzeyde, farklı değer sınıfları varsa, farklı türler kullanmayı denemeyi tavsiye ederim. null
Arayüzünüz izin veriyorsa ve temsil etmeye çalıştığınız bir özelliğin yalnızca iki sınıfı varsa bir seçenek olabilir. Arabiriminiz veya biçiminiz izin veriyorsa, bir özelliği atlamak bir seçenek olabilir. Yeni bir toplu tür (sınıf, nesne, ileti türü) başka bir seçenek olabilir.
Dize örneğiniz için eğer bu programlama dilinde ise kendime birkaç soru sorarım.
- Gelecekteki değer türlerini eklemeyi planlıyorum mu? Eğer öyleyse,
Option
muhtemelen arayüz tasarımı için daha iyi olacaktır.
- Tüketici aramalarını ne zaman doğrulamam gerekir? Statik? Dinamik? Önce? Sonra? Hiç mi? Programlama diliniz destekliyorsa, doğrulama için oluşturmanız gereken kod miktarını önlediği için statik yazmanın avantajlarını kullanın.
Option
Eğer dize nullable değilse muhtemelen bu durumu en iyi şekilde doldurur. Ancak, muhtemelen yine de kullanıcı girişini bir null
dize değeri için kontrol etmeniz gerekecek , bu yüzden muhtemelen ilk sorgulama hattına geri döneceğim: kaç tür değer göstermek / temsil etmek isteyeceğim.
- Mı
null
benim programlama dilinde bir programcı hatası göstergesidir? Ne yazık ki, null
genellikle bazı dillerde başlatılmamış (veya açıkça başlatılmamış) işaretçiler veya referanslar için varsayılan değerdir. Mı null
varsayılan değer olarak kabul edilebilir bir değer olarak? Öyle mi güvenli varsayılan değer olarak? Bazen null
tahsis edilen değerlerin göstergesidir. Arayüzümün tüketicilerine bu potansiyel bellek yönetimi veya başlatma problemlerini programlarında göstermeli midir? Bu tür bir aramanın bu tür problemler karşısında başarısızlık modu nedir? Arayan kişi benimkiyle aynı süreçte mi yoksa iş parçacığında mı, bu tür hatalar benim başvurum için yüksek bir risk oluşturacak mı?
Bu sorulara verdiğiniz cevaplara bağlı olarak, muhtemelen null
arayüzünüz için doğru olup olmadığına karar verebileceksiniz .
örnek 1
- Başvurunuz güvenlik açısından kritik
- Başlangıçta bir tür yığın başlatması kullanıyorsunuzdur ve
null
bir dizeye yer ayırma başarısızlığında geri geçen olası bir dize değeridir.
- Böyle bir dize arayüzüne isabet potansiyel
Cevap: null
muhtemelen uygun değildir
Gerekçe: null
Bu durumda aslında iki farklı değer tipini belirtmek için kullanılır. İlki, arayüzünüzdeki kullanıcının ayarlamak istediği varsayılan bir değer olabilir. Ne yazık ki, ikinci değer, sisteminizin doğru çalışmadığını gösteren bir işarettir. Bu gibi durumlarda, muhtemelen mümkün olduğu kadar güvenli bir şekilde başarısız olmak istersiniz (sisteminiz için ne anlama gelirse).
Örnek 2
char *
Üyesi olan bir C yapısı kullanıyorsunuz .
- Sisteminiz yığın tahsisi kullanmıyor ve MISRA denetimini kullanıyorsunuz.
- Arayüzünüz bu yapıyı bir işaretçi olarak kabul eder ve yapının işaret etmediğinden emin olmak için denetler.
NULL
- API'niz için
char *
üyenin varsayılan ve güvenli değeri tek bir değerle belirtilebilir.NULL
- Kullanıcınızın yapı başlatması üzerine, kullanıcıya
char *
üyeyi açıkça başlatmayan bir fırsat sağlamak istersiniz .
Cevap: NULL
uygun olabilir
Gerekçe: Yapınızın NULL
kontrolden geçmesi ancak başlatılmaması için küçük bir şans var . Ancak, yapı değerinde ve / veya yapı adresinin aralık denetlemesinde bir miktar sağlama toplamı sağlamadığınız sürece API'nız bunu hesaplayamayabilir. MISRA-C gömlekleri, API'lerin kullanıcılarına, başlangıçtan önce yapıların kullanımını işaretleyerek yardımcı olabilir. Bununla birlikte, char *
üyeye göre, yapı işaretçisi, başlatılmış yapıya işaret ediyorsa, yapı belirleyicisinde yapı belirleyicisinin NULL
varsayılan değeridir. Bu nedenle, uygulamanızdaki yapı üyesi NULL
için güvenli, varsayılan bir değer olabilir char *
.
Bir seri hale getirme arabirimindeyse, bir dizede boş kullanılıp kullanılmayacağı hakkında kendime şu soruları sorarım.
- Mı
null
potansiyel bir müşteri tarafı hatası göstergesidir? JavaScript'teki JSON için, bu muhtemelen bir null
tahsisat hatası göstergesi olarak kullanılmasının zorunlu olmadığı bir rakamdır. JavaScript'te, sorunlu olarak ayarlanacak bir referanstan nesne yokluğunun açık bir göstergesi olarak kullanılır. Bununla birlikte, JSON'u null
yerel tiple eşleyen javascript olmayan ayrıştırıcılar ve serileştiriciler var null
. Bu durumda, kendi null
diliniz, ayrıştırıcı ve seri hale getirici birleşimi için yerel kullanımın uygun olup olmadığının tartışılması için yalvarır .
- Bir mülk değerinin açıkça yokluğu, tek bir mülk değerinden daha fazlasını etkiler mi? Bazen a
null
aslında tamamen yeni bir mesaj tipine sahip olduğunuzu gösterir. Tüketicileriniz için, tamamen farklı bir mesaj türü belirtmesi için seri hale getirme formatı daha temiz olabilir. Bu, doğrulama ve uygulama mantığının, web arayüzünüzün sağladığı iki mesaj ayrımı arasında temiz bir ayrım yapmasını sağlar.
Genel tavsiye
null
bir kenarı veya arayüzde onu desteklemeyen bir değer olamaz. Özelliklerin değerlerini (örn. JSON) yazarken doğada aşırı derecede gevşek olan bir şey kullanıyorsanız, eğer mümkünse , tüketici kenarı yazılımında (örn. JSON Schema ) bir şema veya doğrulama formu yüklemeye çalışın . Bir programlama dili API'sı ise, kullanıcı girişini mümkünse statik olarak (yazarak) veya çalışma süresinde duyarlı olduğu kadar yüksek sesle doğrulayın (diğer bir deyişle , müşteriye dönük arabirimlerde savunma programlama yapın ). En önemlisi, kenarı belgeleyin veya tanımlayın, böylece:
- Bir mülkün hangi tür değerlerini kabul ettiği
- Belirli bir mülk için hangi değer aralıkları geçerlidir?
- Bir toplu türün nasıl yapılandırılması gerektiği. Agrega tipinde hangi özellikler olmalı / gerekir / mevcut olabilir?
- Bir tür konteynırsa, konteynır kaç öğeyi tutabilir veya tutabilir ve bu kabın sahip olduğu değer türleri nelerdir?
- Bir kapsayıcının veya toplu türün özellikleri veya örnekleri varsa hangi sırayı alıyorsunuz?
- Belirli değerleri belirlemenin hangi yan etkileri vardır ve bu değerleri okumanın yan etkileri nelerdir?