null Penggunaan tergantung pada Aplikasi / Bahasa
Pada akhirnya pilihan untuk digunakan atau tidaknya nullnilai aplikasi yang valid sebagian besar ditentukan oleh aplikasi Anda dan bahasa pemrograman / antarmuka / tepi.
Pada level fundamental, saya sarankan mencoba menggunakan tipe yang berbeda jika ada kelas nilai yang berbeda. nullmungkin menjadi opsi jika antarmuka Anda mengizinkannya dan hanya ada dua kelas properti yang Anda coba wakili. Menghilangkan properti mungkin menjadi opsi jika antarmuka atau format Anda memungkinkannya. Tipe agregat baru (kelas, objek, tipe pesan) dapat menjadi pilihan lain.
Sebagai contoh string Anda, jika ini dalam bahasa pemrograman, saya akan bertanya pada diri sendiri beberapa pertanyaan.
- Apakah saya berencana menambahkan jenis nilai di masa mendatang? Jika demikian,
Optionmungkin akan lebih baik untuk desain antarmuka Anda.
- Kapan saya perlu memvalidasi panggilan konsumen? Secara statis? Secara dinamis? Sebelum? Setelah? Sama sekali? Jika bahasa pemrograman Anda mendukungnya, gunakan manfaat pengetikan statis karena menghindari jumlah kode yang harus Anda buat untuk validasi.
Optionmungkin mengisi kasus ini dengan baik jika string Anda tidak dapat dibatalkan. Namun, Anda mungkin harus memeriksa input pengguna untuk nullnilai string, jadi saya mungkin akan menunda kembali ke pertanyaan pertama: berapa banyak tipe nilai yang ingin / ingin saya wakili.
- Apakah
nullindikasi kesalahan programmer dalam bahasa pemrograman saya? Sayangnya, nullsering kali nilai default untuk petunjuk atau referensi yang tidak diinisialisasi (atau tidak diinisialisasi secara eksplisit) dalam beberapa bahasa. Apakah nullsebagai nilai dapat diterima sebagai nilai default? Apakah aman sebagai nilai default? Kadang null- kadang merupakan indikasi nilai yang tidak dialokasikan. Haruskah saya memberi konsumen antarmuka saya indikasi tentang potensi manajemen memori ini atau masalah inisialisasi dalam program mereka? Apa modus kegagalan dari panggilan seperti itu dalam menghadapi masalah seperti itu? Apakah penelepon dalam proses yang sama atau utas dengan saya sehingga kesalahan seperti itu berisiko tinggi untuk aplikasi saya?
Bergantung pada jawaban Anda atas pertanyaan-pertanyaan ini, Anda mungkin dapat mengasah apakah nullantarmuka Anda cocok atau tidak .
Contoh 1
- Aplikasi Anda sangat penting untuk keselamatan
- Anda menggunakan beberapa jenis inisialisasi heap pada startup dan
nullkemungkinan nilai string dikembalikan setelah kegagalan mengalokasikan ruang untuk string.
- Ada potensi string tersebut mengenai antarmuka Anda
Jawab: nullmungkin tidak tepat
Dasar Pemikiran: nulldalam hal ini sebenarnya digunakan untuk menunjukkan dua jenis nilai yang berbeda. Yang pertama mungkin merupakan nilai default yang ingin ditetapkan pengguna antarmuka Anda. Sayangnya, nilai kedua adalah tanda untuk menunjukkan bahwa sistem Anda tidak berfungsi dengan benar. Dalam kasus seperti itu, Anda mungkin ingin gagal seaman mungkin (apa pun artinya bagi sistem Anda).
Contoh 2
- Anda menggunakan struct C yang memiliki
char *anggota.
- Sistem Anda tidak menggunakan alokasi tumpukan dan Anda menggunakan pemeriksaan MISRA.
- Antarmuka Anda menerima struct ini sebagai penunjuk dan memeriksa untuk memastikan bahwa struct tidak menunjuk ke
NULL
- Nilai default dan aman
char *anggota untuk API Anda dapat ditunjukkan dengan nilai tunggalNULL
- Setelah inisialisasi struct pengguna Anda, Anda ingin memberikan kemungkinan kepada pengguna untuk tidak menginisialisasi
char *anggota secara eksplisit .
Jawab: NULLmungkin tepat
Dasar Pemikiran: Ada sedikit kemungkinan bahwa struct Anda melewati NULLpemeriksaan tetapi tidak diinisialisasi. Namun, API Anda mungkin tidak dapat menjelaskan hal ini kecuali Anda memiliki semacam checksum pada nilai struct dan / atau rentang memeriksa alamat struct. Linter MISRA-C dapat membantu pengguna API Anda dengan menandai penggunaan struct sebelum inisialisasi mereka. Namun, untuk char *anggota, jika penunjuk ke struct menunjuk ke struct yang diinisialisasi, NULLadalah nilai default dari anggota yang tidak ditentukan dalam penginisialisasi struct. Oleh karena itu, NULLdapat berfungsi sebagai nilai default aman untuk char *anggota struct di aplikasi Anda.
Jika itu pada antarmuka serialisasi, saya akan bertanya pada diri sendiri pertanyaan berikut tentang apakah akan menggunakan null pada string.
- Apakah
nullindikasi potensi kesalahan sisi klien? Untuk JSON dalam JavaScript, ini mungkin tidak karena nulltidak selalu digunakan sebagai indikasi kegagalan alokasi. Dalam JavaScript, ini digunakan sebagai indikasi eksplisit tentang tidak adanya objek dari referensi yang akan ditetapkan bermasalah. Namun, ada parser dan serialis non-javascript di luar sana yang memetakan JSON nullke nulltipe asli . Jika ini masalahnya, ini meminta diskusi tentang apakah nullpenggunaan asli atau tidak cocok untuk kombinasi bahasa, parser, dan serializer tertentu.
- Apakah ketiadaan nilai properti secara eksplisit berdampak lebih dari nilai properti tunggal? Kadang-kadang a
nullsebenarnya menunjukkan bahwa Anda memiliki tipe pesan baru seluruhnya. Mungkin lebih bersih bagi konsumen Anda dari format serialisasi untuk hanya menentukan jenis pesan yang sama sekali berbeda. Ini memastikan bahwa validasi dan logika aplikasi mereka dapat memiliki pemisahan yang bersih antara dua perbedaan pesan yang disediakan antarmuka web Anda.
Nasihat Umum
nulltidak dapat menjadi nilai di tepi atau antarmuka yang tidak mendukungnya. Jika Anda menggunakan sesuatu yang sifatnya sangat longgar pada pengetikan nilai properti (yaitu JSON), cobalah untuk mendorong beberapa bentuk skema atau validasi pada perangkat lunak edge konsumen (mis. Skema JSON ) jika Anda bisa. Jika itu adalah bahasa pemrograman API, validasikan input pengguna secara statis jika memungkinkan (melalui pengetikan) atau sekeras yang masuk akal dalam runtime (alias praktikkan pemrograman defensif pada antarmuka yang dihadapkan konsumen). Yang terpenting, dokumentasikan atau tentukan tepi sehingga tidak ada pertanyaan tentang:
- Jenis nilai apa yang diterima properti yang diberikan
- Rentang nilai apa yang valid untuk properti yang diberikan.
- Bagaimana jenis agregat harus disusun. Properti apa yang harus / harus / dapat hadir dalam tipe agregat?
- Jika itu adalah beberapa jenis wadah, berapa banyak barang yang dapat atau harus dimiliki oleh wadah tersebut, dan apa saja jenis nilai yang dimiliki wadah tersebut?
- Bagaimana urutan, jika ada, properti atau instance dari wadah atau tipe agregat dikembalikan?
- Apa efek samping dari penetapan nilai-nilai tertentu dan apa efek samping dari membaca nilai-nilai itu?