null
Penggunaan tergantung pada Aplikasi / Bahasa
Pada akhirnya pilihan untuk digunakan atau tidaknya null
nilai 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. null
mungkin 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,
Option
mungkin 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.
Option
mungkin mengisi kasus ini dengan baik jika string Anda tidak dapat dibatalkan. Namun, Anda mungkin harus memeriksa input pengguna untuk null
nilai string, jadi saya mungkin akan menunda kembali ke pertanyaan pertama: berapa banyak tipe nilai yang ingin / ingin saya wakili.
- Apakah
null
indikasi kesalahan programmer dalam bahasa pemrograman saya? Sayangnya, null
sering kali nilai default untuk petunjuk atau referensi yang tidak diinisialisasi (atau tidak diinisialisasi secara eksplisit) dalam beberapa bahasa. Apakah null
sebagai 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 null
antarmuka Anda cocok atau tidak .
Contoh 1
- Aplikasi Anda sangat penting untuk keselamatan
- Anda menggunakan beberapa jenis inisialisasi heap pada startup dan
null
kemungkinan nilai string dikembalikan setelah kegagalan mengalokasikan ruang untuk string.
- Ada potensi string tersebut mengenai antarmuka Anda
Jawab: null
mungkin tidak tepat
Dasar Pemikiran: null
dalam 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: NULL
mungkin tepat
Dasar Pemikiran: Ada sedikit kemungkinan bahwa struct Anda melewati NULL
pemeriksaan 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, NULL
adalah nilai default dari anggota yang tidak ditentukan dalam penginisialisasi struct. Oleh karena itu, NULL
dapat 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
null
indikasi potensi kesalahan sisi klien? Untuk JSON dalam JavaScript, ini mungkin tidak karena null
tidak 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 null
ke null
tipe asli . Jika ini masalahnya, ini meminta diskusi tentang apakah null
penggunaan 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
null
sebenarnya 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
null
tidak 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?