Halo, Habr! Untuk perhatian Anda, saya persembahkan terjemahan dari artikel "Mengumumkan keselamatan suara nol" oleh Filip Hracek dengan komentar saya:Sebuah langkah penting telah datang bagi tim Dart dengan presentasi pratinjau teknis dari perkembangan keselamatan nol. Keamanan nol menghindari seluruh kelas bug yang sering kali sulit dideteksi, dan sebagai bonusnya, ini memberikan sejumlah peningkatan kinerja. Saat ini, kami telah merilis pratinjau teknis awal dan menunggu tanggapan Anda.
Keamanan nol - kerja aman dengan tautan kosong. Lebih lanjut dalam teks, untuk singkatnya dan karena kestabilan istilah, nama bahasa Inggris null, null safety akan digunakan. Dan terjemahan "keamanan nol" mengarah pada pemikiran yang sepenuhnya berlawanan.
suara - dalam konteks ini (keamanan suara nol) dapat diterjemahkan sebagai "dapat diandalkan".
Jika Anda memiliki saran untuk meningkatkan terjemahan atau menemukan kesalahan - tulis dalam pesan pribadi, kami akan mencoba memperbaikinya.
Dalam artikel ini, kami akan mengungkapkan rencana tim Dart untuk menerapkan keamanan nol, serta menjelaskan apa yang ada di balik istilah Keamanan nol suara, dan bagaimana pendekatan ini berbeda dari bahasa pemrograman lain.
Versi yang dijelaskan disajikan pada 10 Juni 2020.
Mengapa keamanan nol?
Dart adalah bahasa yang aman untuk tipe. Ini berarti bahwa ketika Anda mendapatkan variabel dari beberapa tipe, kompilator dapat menjamin bahwa variabel itu miliknya. Tetapi keamanan tipe saja tidak menjamin bahwa variabel tidak nol.
Kesalahan nol biasa terjadi. Pencarian di GitHub menemukan ribuan laporan (masalah) yang disebabkan oleh nilai null dalam kode Dart, dan bahkan lebih banyak lagi komitmen yang mencoba menyelesaikan masalah ini.
Cobalah untuk melihat masalah tautan nulling dalam contoh berikut:
void printLengths(List<File> files) {
for (var file in files) {
print(file.lengthSync());
}
}
Fungsi ini pasti akan gagal jika dipanggil dengan parameter nol, tetapi ada kasus kedua yang perlu dipertimbangkan:
void main() {
// Error case 1: passing a null to files.
printLengths(null);
// Error case 2: passing list of files, containing a null item.
printLengths([File('filename1'), File('filename2'), null]);
}
Keamanan nol memperbaiki masalah ini:
Dengan keamanan nol, Anda dapat mengandalkan kode dengan lebih percaya diri. Tidak akan ada lagi error yang mengganggu saat mengakses variabel nullified saat runtime. Hanya kesalahan statis pada waktu kompilasi.
Sejujurnya, implementasi saat ini masih menyisakan beberapa peluang untuk menangkap kesalahan nol pada saat eksekusi, lebih banyak lagi nanti.
Suara (dapat diandalkan) nol keamanan
Penerapan keamanan nol Dart bagus. Jika kita menganalisanya menggunakan contoh di atas, itu berarti compiler Dart 100% yakin bahwa array file dan elemen di dalamnya tidak boleh null. Ketika compiler Dart menganalisis kode Anda dan menentukan bahwa variabel tersebut bukan null, variabel ini akan selalu memiliki nilai: jika Anda memeriksa kode yang dapat dieksekusi di debugger, Anda akan melihat bahwa tidak ada kemungkinan untuk melakukan zeroing pada waktu proses. Ada implementasi yang tidak "dapat diandalkan" di mana Anda masih perlu melakukan pemeriksaan keberadaan suatu nilai pada waktu proses. Tidak seperti bahasa lain, Dart berbagi keandalan implementasi dengan Swift.
, , , null safety . Swift, Kotlin Dart. .Implementasi yang kuat dari keamanan nol di Dart memiliki konsekuensi bagus lainnya: itu berarti program Anda bisa lebih kecil dan lebih cepat. Karena Dart benar-benar memastikan bahwa variabel tidak akan pernah bisa dinihilkan, Dart dapat mengoptimalkan hasil kompilasi. Misalnya, compiler AOT dapat menghasilkan kode native yang lebih kecil dan lebih cepat karena tidak perlu menambahkan pemeriksaan untuk referensi kosong.
Kami telah melihat beberapa hasil awal yang sangat menjanjikan. Misalnya, kami melihat peningkatan performa 19% dalam tanda mikro yang mengemulasi pola rendering umum dalam framework Flutter.
Prinsip dasar
Sebelum melanjutkan dengan desain detail keselamatan nol, tim Dart menetapkan tiga prinsip dasar:
Non-nullability secara default. / ** Sering dilihat sebagai singkatan untuk NNBD dalam dokumentasi ** / Jika Anda tidak secara eksplisit memberi tahu Dart bahwa variabel dapat dinihilkan, ia akan menganggapnya sebagai non-nullable. Kami memilih ini sebagai default karena kami menemukan bahwa di API, nilai bukan nol adalah yang paling umum. / ** Ini mungkin pengerjaan ulang dari Flutter API ** / .
Penerapan bertahap... Kami memahami bahwa harus ada kemungkinan transisi bertahap ke keselamatan nol langkah demi langkah. Faktanya, Anda harus memiliki kode keamanan nullable dan null dalam project yang sama. Untuk ini, kami berencana menyediakan alat untuk membantu migrasi kode.
Keandalan lengkap (suara). Seperti disebutkan di atas, keamanan nol di Dart aman. Setelah Anda mengubah seluruh proyek dan dependensi Anda menjadi keamanan nol, Anda mendapatkan semua manfaat keandalan.
Mendeklarasikan variabel dengan keamanan nol
Sintaks dasarnya cukup sederhana. Di bawah ini adalah contoh mendeklarasikan berbagai variabel. Perhatikan bahwa variabel non-nullable digunakan secara default, sehingga terlihat sama, tetapi nilainya tidak dapat dibatalkan.
// In null-safe Dart, none of these can ever be null.
var i = 42;
final b = Foo();
String m = '';
Dart akan memastikan bahwa Anda tidak pernah menetapkan null ke salah satu variabel di atas. Jika Anda mencoba menjalankan i = null bahkan seribu baris kemudian, Anda akan mendapatkan kesalahan analisis statis dan garis berlekuk-lekuk merah - program Anda akan menolak untuk dikompilasi.
Jika Anda ingin variabel Anda menjadi nullable, Anda dapat menggunakan '?' seperti ini:
// These are all nullable variables.
int? j = 1; // Can be null later.
final Foo? c = getFoo(); // Maybe the function returns null.
String? n; // Is null at first. Can be null at any later time, too
Variabel yang tercantum di atas berperilaku persis sama dengan semua variabel di versi Dart saat ini.
'?' 'juga dapat digunakan di tempat lain:
// In function parameters.
void boogie(int? count) {
// It's possible that count is null.
}
// In function return values.
Foo? getFoo() {
// Can return null instead of Foo.
}
// Also: generics, typedefs, type checks, etc.
// And any combination of the above.
Tapi sekali lagi, saya berharap Anda hampir tidak pernah menggunakan '?'. Sebagian besar variabel Anda tidak dapat dinihilkan.
Mempermudah penggunaan keamanan null
Tim Dart bekerja keras untuk membuat keamanan nol semudah mungkin digunakan. Misalnya, lihat kode ini, yang menggunakan if untuk menguji null:
void honk(int? loudness) {
if (loudness == null) {
// No loudness specified, notify the developer
// with maximum loudness.
_playSound('error.wav', volume: 11);
return;
}
// Loudness is non-null, let's just clamp it to acceptable levels.
_playSound('honk.wav', volume: loudness.clamp(0, 11));
}
Perhatikan bahwa Dart cukup pintar untuk menyadari bahwa kenyaringan tidak boleh null pada saat kita menyampaikan pernyataan if. Jadi Dart memungkinkan kita memanggil metode clamp () tanpa tarian rebana yang tidak perlu. Kemudahan ini disediakan oleh apa yang disebut analisis aliran: pengurai Dart melihat kode Anda seolah-olah sedang menjalankannya, secara otomatis mencari tahu lebih banyak informasi tentang kode Anda.
Flow analysis, Dart, , , . null safety, :
foo(dynamic str) {
if (str is String) {
// dynamic length,
// String
print(str.length);
}
}
, Dart , null, :
int sign(int x) {
// The result is non-nullable.
int result;
if (x >= 0) {
result = 1;
} else {
result = -1;
}
// By this point, Dart knows the result cannot be null.
return result;
}
- (, result = -1;), Dart , result — , .Analisis aliran hanya bekerja di dalam fungsi. Jika Anda memiliki variabel global atau bidang kelas, maka Dart tidak dapat menjamin bahwa nilai akan ditetapkan ke sana. Dart tidak dapat menyimulasikan aliran eksekusi seluruh aplikasi Anda. Untuk alasan ini, Anda dapat menggunakan kata kunci baru yang terlambat jika Anda tahu bahwa variabel akan diinisialisasi saat pertama kali diakses, tetapi Anda tidak dapat menginisialisasinya saat dideklarasikan.
class Goo {
late Viscosity v;
Goo(Material m) {
v = m.computeViscosity();
}
}
Perhatikan bahwa v tidak dapat dikosongkan, meskipun pada awalnya tidak relevan. Dart berpikir bahwa Anda tidak akan mencoba membaca v sampai diberikan nilai bukan nol dan kode Anda terkompilasi tanpa kesalahan.
— .
, . , . Dart , , , , , Kotlin .
— Swift- , , force unwrap Dart.
void main() {
String? t;
print(t!.length);
}
( late ‘!’) .
late , - Dart. ‘required’ . ‘@required’, .
class Temp {
String str;
Temp({required this.str});
//
Temp.alt({strAtr}) : this.str = strAtr;
}
Tim Dart telah bekerja selama lebih dari setahun untuk menghadirkan keamanan nol ke pratinjau teknis. Ini adalah perubahan bahasa terbesar sejak rilis versi kedua. Namun, ini adalah perubahan yang tidak merusak kompatibilitas ke belakang. Kode yang ada dapat memanggil kode dengan keamanan nol dan sebaliknya. Bahkan setelah rilis penuh, keamanan nol akan menjadi opsi tambahan yang dapat Anda gunakan saat Anda siap. Kode Anda yang sudah ada akan tetap berfungsi tanpa perubahan.
Perpustakaan inti Dart baru-baru ini diperbarui dengan keamanan nol. Sebagai contoh ilustrasi kompatibilitas mundur, penggantian pustaka inti yang ada berjalan tanpa satu pun pengujian yang gagal dan tanpa kesalahan dalam aplikasi pengujian yang berjalan di lingkungan pengujian Dart dan Flutter. Bahkan memperbarui pustaka inti untuk banyak klien internal Google berjalan lancar. Kami berencana untuk mendesain ulang semua paket dan aplikasi kami untuk menggunakan keamanan nol setelah rilis, kami berharap Anda akan melakukan hal yang sama. Tetapi Anda dapat melakukannya dengan kecepatan Anda sendiri, batch demi batch, aplikasi demi aplikasi.
Kata-kata ini, ya untuk pengembang Swift, terutama versi ke-3 ...
Tetapi bahkan di sini semuanya tidak begitu cerah, pengembang sendiri mengatakan bahwa ketika menggabungkan kode keamanan nol dan kode "lama" dalam satu proyek, mereka tidak dapat menjamin kesempurnaan sistem tipe.
Rencana aksi lebih lanjut
Kami berencana untuk meluncurkan keamanan nol secara bertahap dalam tiga fase:
- Pratinjau teknis. Ini diluncurkan ketika artikel asli diterbitkan (06/10/2020) dan tersedia di cabang-dev. Perlu memperhatikan bagian "Mulai sekarang". Ini masih sangat tidak stabil dan dapat berubah, jadi kami belum menyarankan untuk menggunakannya dalam kode produksi. Tapi kami ingin mendengar dari Anda dan memberi kami umpan balik!
- Versi beta. Keamanan nol akan tersedia di cabang beta Dart dan tidak akan lagi bersembunyi di balik bendera eksperimental. Implementasinya akan mendekati versi final yang diharapkan. Dimungkinkan untuk mulai memigrasi paket dan plugin Anda ke pub.dev, tetapi tidak disarankan untuk mempublikasikan perubahan ini sebagai rilis stabil.
- Versi stabil. Keamanan nol akan tersedia untuk semua orang. Anda akan diminta untuk menerbitkan paket dan plugin yang diperbarui sebagai rilis stabil. Anda juga perlu memigrasikan aplikasi Anda pada tahap ini.
Jika semua berjalan sesuai rencana, kami akan merilis versi stabil Dart dengan keamanan nol pada akhir tahun. Dari waktu ke waktu kami akan menambahkan alat untuk membantu Anda beralih ke keamanan nol. Diantara mereka:
- Alat migrasi untuk membantu mengotomatiskan banyak langkah dalam memperbarui paket dan aplikasi yang ada;
- pub.dev, null safety;
- 'pub outdated' , null safety.
Cara tercepat untuk mencoba keamanan nol hari ini adalah dengan nullsafety.dartpad.dev - versi DartPad dengan keamanan nol diaktifkan. Buka daftar tarik-turun Learn with Snippets untuk menemukan serangkaian tutorial yang mencakup sintaks baru dan dasar-dasar keamanan null.
Anda juga dapat bereksperimen dengan keamanan nol dalam aplikasi konsol kecil (kami belum memperbarui kerangka kerja yang lebih besar seperti Flutter). Pertama, Anda perlu mengunduh Dart SDK dari cabang dev, lalu Anda dapat mengunduh aplikasi konsol contoh ini . File README berisi instruksi untuk menjalankan aplikasi dengan fitur keamanan null eksperimental diaktifkan. File lain dalam contoh ini menyediakan konfigurasi proses yang akan memungkinkan proses debug di VS Code dan Android Studio.
Anda juga dapat membaca dokumentasinya (lebih banyak akan muncul di masa mendatang):
- Panduan keamanan nol ;
- Referensi API untuk pustaka inti dengan keamanan nol.
UPD: Di komentar, saya menyarankan tautan ini Memahami keselamatan nol
Kami sangat senang dapat menerapkan keamanan nol di Dart. Penanganan tautan kosong yang andal dan aman akan menjadi ciri khas Dart untuk membantu Anda menulis kode yang paling andal dan produktif. Kami harap Anda meluangkan waktu untuk bereksperimen dengan versi keamanan null saat ini dan meninggalkan umpan balik Anda di pelacak bug kami. Semoga kodenya bagus!
Terima kasih telah membaca sampai akhir. Penerjemahannya agak terlambat, tapi semoga komentarnya bermanfaat untuk materi dan tidak hanya menjadi terjemahan one-to-one. Saya ingin menambahkan bahwa fitur ini adalah langkah maju yang sangat berguna untuk seluruh ekosistem Flutter. Saya tidak sabar untuk menggunakannya di aplikasi langsung. Sementara itu, seperti yang mereka katakan dalam bahasa asing, pantau terus!