API hiçbir şey yapmayacaksa, doğru şekilde hiçbir şey yapmamak
- Bir API’nin hiçbir şey yapmaması gerektiğinde, bunu doğru şekilde hiçbir şey yapmayacak biçimde sağlamak önemlidir.
- Örneğin Windows’ta kapsamlı bir yazdırma altyapısı vardır, ancak Xbox’ta böyle bir altyapı yoktur.
- Xbox’ta bir uygulama yazdırmayı denediğinde
NotSupportedException fırlatmak yanlış bir yöntemdir.
- Uygulama ağırlıklı olarak PC’de test edilmiş olabileceği için, Xbox’ta çalıştığında bu özel durum ele alınmayabilir ve uygulama çökebilir.
- Xbox’ta yazdırma özelliğini “desteklemenin” daha iyi bir tasarımı, yazdırma işlevinin başarılı olması ama yüklü yazıcı olmadığını bildirmesidir.
- Kullanıcı yazdırmayı denerse yazıcı seçmesi istenir, ancak liste boş olduğu için kullanıcı “Demek ki yazıcı yokmuş” diye fark eder ve yazdırma isteğini iptal eder.
- Yazıcı yüklemeye çalışan uygulamalar için, yazıcı yükleme işlevi “kullanıcı işlemi iptal etti” sonuç koduyla hemen dönebilir.
- Amaç, yazdırma özelliği tamamen destekleniyormuş gibi davranmak ama gerçekte yazıcı yokmuş gibi davranmaktır.
- Yazdırmanın hiç çalışmadığı sistemlerde, UI’de yazdırma düğmesini gizlemek için yazdırmanın mümkün olup olmadığını denetleyen bir işlev eklenebilir.
- Bu davranışa “eylemsiz (inert)” denir.
- API yüzeyi hâlâ vardır ve belirtime uygun şekilde çalışır, ama gerçekte hiçbir şey yapmaz.
- Önemli olan, belgelenmiş yöntemle tutarlı biçimde hiçbir şey yapmayarak mevcut kodla yaşanacak sorunları en aza indirmektir.
API’yi devre dışı bırakma örneği
- Widget tanıtıcısı oluşturan çeşitli işlevleri, widget tanıtıcısı alan işlevleri ve widget tanıtıcısını kapatan işlevleri içeren bir API’yi devre dışı bırakmaya dair bir örnek vardır.
- Ekip başlangıçta
CreateWidget işlevinin başarılı olup null pointer döndürmesini önerdi.
- Ancak bu yaklaşım uygulamanın kafasını karıştırabilir. “Çağrı başarılı oldu ama geçerli bir tanıtıcı alamadım mı?”
EnableWidget işlevinin “geçersiz tanıtıcı” döndürmesi de kafa karışıklığı yaratabilir.
- Mevcut belgelerde, widget oluşturmanın kullanıcı tarafından iptal edildiği anlamına gelen
ERROR_CANCELLED adlı bir dönüş değeri bulundu.
- Bu nedenle uygulama ne zaman widget oluşturmaya çalışsa, “Hayır, kullanıcı iptal etti” demek mümkün olur.
GN⁺ görüşü
- Bu yazıdaki en önemli nokta, bir API hiçbir şey yapmadığında, bunu kullanıcı deneyimine zarar vermeden ve mevcut kodla uyumluluğu koruyarak yapması gerektiğidir.
- Bu yaklaşım, geliştiricilere API tasarımının önemini vurgular ve kullanıcı dostu bir yazılım deneyimi sunmaya katkı sağlar.
- Yazı, yazılım mühendisliğinin incelikli bir yönünü gösteriyor ve uygulamaların beklenmedik ortamlarda bile nasıl zarif biçimde başarısız olabileceğini inceleyen ilginç bir örnek sunuyor.
2 yorum
Hacker News görüşü
"Hataları yutmak" hakkında görüş:
panic, test sırasında programcının hatalarını yüksek sesle duyurmanın iyi bir yoludur.Geriye dönük uyumluluk hakkında görüş:
UI tasarımına dair şikayet:
Microsoft'un ders almamasına dair eleştiri:
Xbox'ın yazdırmayı desteklememesi hakkında görüş:
API kullanımı hakkında tavsiye:
NotSupportedExceptionfırlatması yanlış değildir."Kötücül uyum" hakkındaki hisler:
Güvenlik hakkında olumlu görüş:
Tarayıcı stratejisine dair bir değerlendirme:
İstisna işleme konusundaki eleştirmenlerin yanlış anlaması:
Lobste.rs görüşleri
Şakayı bir kenara bırakırsak, bu kadar aşırı savunmacı programlama ve kullanıcı deneyimi yaklaşımına katılmıyorum. Böyle olunca yazılım nedenini bile bilmeden görevini yapmaz hale geliyor ve nedenini öğrenmenin de bir yolu kalmıyor. Uygulama hataları yakalayıp mümkünse kullanıcı dostu bir mesaj üretmeli; bunu yapamıyorsa en azından özgün hata mesajını kullanıcıya göstermeli. Arka plan işi ise bir hata günlüğü olmalı
Bu yazının uygulama geliştiricisinden çok API geliştiricisinin bakış açısından yazıldığını kabul ediyorum. O yüzden API hatalarını belgelendirmeli ve çağıran tarafın harekete geçebileceği hata mesajları sağlamalısınız
Ayrıca erişim izni yok diye UI'da düğmeleri gizlemekten de hoşlanmıyorum. Yer varsa düğmeyi gösterip devre dışı bırakmak ve kullanıcı üstüne geldiğinde onu nasıl etkinleştirebileceğini anlatan bir mesaj göstermek daha iyi bence
Genel olarak doğruluğu talep etmek daha iyidir. Ama mevcut kullanıcı tabanınız 1 milyar kişiyse, mümkün olduğunca bir şeyleri bozmamak çok akıllıcadır ve kullanıcı açısından sadece çalıştığı için sistem düzeyinde gerçek bir değer de üretir. Sonuçta tavır şu olmalı: erken başarısız ol, ama çok sayıda şeyi başarısız hale getirme
Bu, API'den çok ABI kararlılığına yakın bir konu. Windows'ta 15 yıl önce derlenmiş yazılımlar da mümkün olduğunca yeni işletim sistemlerinde çalışmaya devam etmelidir. Fonksiyon imzasını değiştiremezsiniz; bu yüzden artık anlamı kalmamış API'leri bile çalışır tutmak için iyi niyetli yalanlar söylemek gerekir
Örneğin API hâlâ Active Desktop varmış gibi davranır. Çünkü alternatif, çok sayıda eski yazılımı kırmaktır
Özelliğin kaldırılıp kaldırılmadığını mı, yoksa bu arada başka bir ekranın altına mı gömüldüğünü anlayamıyorsunuz
Ama uygulama bunu yapmazsa, o uygulamayı kullananlar uygulamayı değil Windows'u suçlar. Hatta uygulama çökse bile yine Windows'u suçlarlar
Bu yüzden Microsoft geçici çözümler üretiyor. Yazdırma işinin sessizce yok olmasına izin vermek çok daha kolay; kullanıcı da kısa bir duraksamadan sonra “aa doğru ya, yazıcı yoktu” deyip durumu kabulleniyor
ifdenetimleri eklediğini görüyorum. Bunu her gördüğümde bu yazı aklıma geliyorBu yüzden ajana null denetimlerini tekrar tekrar eklememesini, bunun yerine zararsız fonksiyonlar kullanmasını ve değerin asla null olmadığını bildirim anında bir kez doğrulamasını söyledim