Saat API tidak melakukan apa pun, lakukan tidak ada dengan benar
- Ketika API seharusnya tidak melakukan apa pun, penting untuk memastikan bahwa ia tidak melakukan apa pun dengan cara yang benar.
- Sebagai contoh, Windows memiliki infrastruktur pencetakan yang sangat besar, tetapi Xbox tidak memiliki infrastruktur semacam itu.
- Saat aplikasi mencoba mencetak di Xbox, melempar
NotSupportedException adalah cara yang keliru.
- Karena aplikasi terutama diuji di PC, saat dijalankan di Xbox penanganan pengecualian mungkin tidak ada dan aplikasi bisa crash.
- Desain yang lebih baik untuk "mendukung" fitur pencetakan di Xbox adalah membuat fungsi pencetakan berhasil tetapi melaporkan bahwa tidak ada printer yang terpasang.
- Ketika pengguna mencoba mencetak, sistem meminta pemilihan printer, tetapi daftarnya kosong sehingga pengguna menyadari, "oh, tidak ada printer," lalu membatalkan permintaan cetak.
- Untuk aplikasi yang mencoba memasang printer, fungsi pemasangan printer dapat segera mengembalikan kode hasil "pengguna membatalkan tindakan".
- Tujuannya adalah bertindak seolah fitur pencetakan didukung sepenuhnya, padahal sebenarnya hanya berperilaku seolah tidak ada printer.
- Pada sistem yang pencetakannya benar-benar tidak berfungsi, dapat ditambahkan fungsi untuk memeriksa apakah pencetakan tersedia agar tombol cetak bisa disembunyikan dari UI.
- Perilaku ini disebut "inert".
- Permukaan API tetap ada dan masih berfungsi sesuai spesifikasi, tetapi pada praktiknya tidak melakukan apa pun.
- Yang penting adalah tidak melakukan apa pun secara konsisten sesuai cara yang didokumentasikan, sehingga masalah dengan kode yang sudah ada dapat diminimalkan.
Contoh penonaktifan API
- Ada contoh penonaktifan API yang mencakup berbagai fungsi untuk membuat handle widget, fungsi yang menerima handle widget, dan fungsi untuk menutup handle widget.
- Tim awalnya mengusulkan untuk menonaktifkan API dengan membuat
CreateWidget berhasil tetapi mengembalikan pointer null.
- Namun, pendekatan ini bisa membingungkan aplikasi. "Pemanggilan berhasil, tetapi saya tidak menerima handle yang valid?"
EnableWidget yang mengembalikan "handle tidak valid" juga dapat menimbulkan kebingungan.
- Dari dokumentasi yang ada, ditemukan nilai balikan
ERROR_CANCELLED yang berarti pembuatan widget dibatalkan oleh pengguna.
- Karena itu, setiap kali aplikasi mencoba membuat widget, sistem dapat mengatakan, "tidak, pengguna membatalkannya".
Pendapat GN⁺
- Hal terpenting dari tulisan ini adalah bahwa ketika API tidak melakukan apa pun, ia harus tidak melakukan apa pun dengan cara yang tidak merusak pengalaman pengguna dan tetap menjaga kompatibilitas dengan kode yang sudah ada.
- Pendekatan ini menekankan pentingnya desain API kepada para pengembang dan membantu menghadirkan pengalaman perangkat lunak yang ramah pengguna.
- Tulisan ini menunjukkan sisi teliti dari rekayasa perangkat lunak dan memberikan contoh menarik tentang bagaimana aplikasi dapat gagal dengan anggun bahkan di lingkungan yang tidak terduga.
2 komentar
Opini Hacker News
Pendapat tentang "menelan error":
panicdi bahasa Go adalah cara yang baik untuk dengan jelas menandai kesalahan programmer saat pengujian.Pendapat tentang kompatibilitas mundur:
Keluhan tentang desain UI:
Kritik terhadap kurangnya pembelajaran Microsoft:
Pendapat tentang Xbox yang tidak mendukung pencetakan:
Saran tentang penggunaan API:
NotSupportedException.Perasaan tentang "kepatuhan yang berniat jahat":
Pendapat positif tentang keamanan:
Kilas balik tentang strategi browser:
Hal yang disalahpahami para pengkritik tentang penanganan exception:
Pendapat di Lobste.rs
Terlepas dari leluconnya, saya tidak setuju dengan pemrograman yang terlalu defensif dan pengalaman pengguna seperti ini. Akibatnya, perangkat lunak tidak menjalankan tugasnya tanpa alasan yang jelas, dan tidak ada cara untuk mengetahui mengapa. Aplikasi seharusnya menangkap error dan, jika memungkinkan, membuat pesan yang ramah pengguna, atau setidaknya menampilkan pesan error aslinya kepada pengguna. Jika ini pekerjaan latar belakang, harus ada log error
Saya mengakui bahwa tulisan ini ditulis dari sudut pandang pengembang API, bukan pengembang aplikasi. Jadi error API harus didokumentasikan, dan harus menyediakan pesan error yang bisa ditindaklanjuti oleh pihak pemanggil
Saya juga tidak suka ketika tombol disembunyikan di UI hanya karena tidak ada hak akses. Jika ruang memungkinkan, menurut saya lebih baik tombolnya tetap ditampilkan namun dinonaktifkan, lalu ketika pengguna mengarahkan mouse ke sana, tampilkan pesan yang menjelaskan bagaimana cara mengaktifkannya
Secara umum, lebih baik menuntut ketepatan. Namun jika pengguna yang sudah ada berjumlah 1 miliar, sangat bijak untuk sebisa mungkin tidak merusaknya, dan dari sudut pandang pengguna hal itu memang menciptakan nilai nyata di tingkat sistem karena semuanya tetap berjalan. Pada akhirnya sikap yang tepat adalah fail fast, tapi jangan sampai membuat banyak hal ikut gagal
Ini lebih dekat ke stabilitas ABI daripada API. Di Windows, perangkat lunak yang dibangun 15 tahun lalu pun harus tetap berjalan di OS baru sebisa mungkin. Karena signature fungsi tidak bisa diubah, Anda harus melakukan kebohongan putih agar API yang sudah tidak lagi bermakna tetap bisa berjalan
Misalnya, API masih berpura-pura bahwa Active Desktop itu ada. Alternatifnya adalah merusak banyak perangkat lunak lawas yang sudah telanjur ada
Jadinya kita tidak tahu apakah fitur itu memang sudah hilang, atau hanya tersembunyi di layar lain di tengah jalan
Tetapi kalau aplikasinya tidak melakukan itu, orang yang memakai aplikasi tersebut akan menyalahkan Windows. Mereka menyalahkan Windows, bukan aplikasinya, dan hal yang sama terjadi bahkan saat aplikasinya crash
Itulah sebabnya Microsoft membuat jalan memutar seperti ini. Jauh lebih mudah membiarkan pekerjaan cetak menghilang begitu saja, sehingga pengguna akan berhenti sejenak lalu menerima, “oh benar, memang tidak ada printer”
ifuntuk mengecek null. Setiap kali melihatnya, saya teringat tulisan iniJadi saya menginstruksikan agen agar tidak mengulang-ulang pemeriksaan null, melainkan menggunakan fungsi yang aman dan memeriksa sekali saat deklarasi bahwa nilainya tidak akan pernah null