Bir istisnanın atılıp atılmadığını kontrol eden bir bayrağa sahip olmamanız gerektiğini açıklayan tüm cevapları düşünüyorum. Onların tavsiyesi, bu soruyu sorma ihtiyacı duyan herkese tavsiyem olur.
Bununla birlikte, bu kural için anlamlı bir istisna olduğunu belirtmek istiyorum. Yüzlerce başka insanın kullanacağı API'ler geliştirmeye başlamak için yeterince gelişmiş olduğunuzda, böyle bir bayrak vermek isteyebileceğiniz durumlar vardır. Bir API yazarken, sadece saflara yazmazsın. Gerçek arzuları olan gerçek müşterilere yazıyorsun. İşinizin bir parçası, API'nızla onları mutlu etmektir. Bu, bir programlama probleminden ziyade sosyal bir problem haline gelir ve bazen sosyal problemler, kendi başına programlama çözümleri kadar ideal olan çözümleri belirler.
API'nizde biri istisnalar diğeri istemeyen iki ayrı kullanıcınız olduğunu görebilirsiniz. Bunun gerçekleşebileceği gerçek hayattan bir örnek, hem geliştirilmekte hem de gömülü bir sistemde kullanılan bir kütüphanedir. Geliştirme ortamlarında, kullanıcılar muhtemelen her yerde istisnalar olmak isteyecektir. İstisnalar, beklenmeyen durumları ele almak için çok popülerdir. Ancak, birçok yerleşik durumda yasaklanmıştır, çünkü etrafındaki gerçek zamanlı kısıtlamaları analiz etmek çok zordur. Aslında sadece işlevinizi yerine getirmek için gereken ortalama süreyi değil, aynı zamanda herhangi bir bireysel eğlence için geçen süreyi umursuyorsanız , yığını herhangi bir yerde serbest bırakma fikri çok istenmeyen bir durumdur.
Benim için gerçek bir yaşam örneği: bir matematik kütüphanesi. Eğer matematik kütüphanenizde Vector
aynı yöne birim vektör almayı destekleyen bir sınıf varsa, büyüklük ile bölmeniz gerekir. Büyüklüğü 0 ise, sıfır durumuna göre bir bölme var. Gelişmede bu yakalamak istiyorum . Gerçekten de 0'lı takılarak şaşırtıcı bir şekilde ayrılmak istemiyorsunuz. Bir istisna atmak bunun için çok popüler bir çözümdür. Neredeyse hiçbir zaman olmaz (gerçekten istisnai bir davranıştır), ancak olduğu zaman bunu bilmek istersiniz.
Gömülü platformda bu istisnaları istemezsiniz. Çek yapmak daha mantıklı olur if (this->mag() == 0) return Vector(0, 0, 0);
. Aslında, bunu gerçek kodda görüyorum.
Şimdi bir iş açısından düşünün. Bir API kullanmanın iki farklı yolunu öğretmeye çalışabilirsiniz:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
Bu, buradaki cevapların çoğunun görüşlerini tatmin eder, ancak şirket açısından bu istenmeyen bir durumdur. Gömülü geliştiriciler bir kodlama stili öğrenmek zorunda kalacak ve geliştirme geliştiricileri başka bir tane öğrenecek. Bu oldukça sinir bozucu olabilir ve insanları bir şekilde düşünmeye zorlar. Potansiyel olarak daha kötü: Gömülü sürümün herhangi bir istisna atma kodu içermediğini nasıl kanıtlarsınız? Fırlatma sürümü kolayca karışabilir ve pahalı bir Arıza İnceleme Kurulu bulana kadar kodunuzda bir yere gizlenebilir.
Öte yandan, istisna işlemeyi açan veya kapatan bir bayrağa sahipseniz, her iki grup da aynı kodlama stilini öğrenebilir. Aslında, çoğu durumda, bir grubun kodunu diğer grubun projelerinde bile kullanabilirsiniz. Bu kodun kullanılması unit()
durumunda, 0 durumunda bir bölmede ne olduğunu gerçekten umursuyorsanız, testi kendiniz yazmalısınız. Dolayısıyla, onu yalnızca kötü sonuçlar aldığınız gömülü bir sisteme taşırsanız, bu davranış "aklı başında" olur. Şimdi, iş perspektifinden kodlayıcıları bir kez eğitiyorum ve işimin tüm bölümlerinde aynı API'leri ve aynı stilleri kullanıyorlar.
Çoğu durumda, başkalarının tavsiyelerine uymak istersiniz: tryGetUnit()
istisnalar atmayan işlevler için benzer veya benzeri deyimler kullanın ve bunun yerine boş gibi bir sentinel değeri döndürün. Kullanıcıların tek bir programda hem istisna işleme hem de istisna dışı işleme kodunu yan yana kullanmak isteyebileceğini düşünüyorsanız, tryGetUnit()
gösterime devam edin. Ancak, işletme gerçekliğinin bayrak kullanmayı daha iyi sağlayabileceği bir köşe durumu var. Kendinizi o köşede bulursanız, "kuralları" yan yana bırakmaktan korkmayın. Bunun için kurallar!