ancak müşterinizin yazılımını çökertmek hala iyi bir şey değil
Kesinlikle çok iyi bir şey.
Tanımsız bir sistem bozuk veri gibi kötü şeyler yapabilir, sabit sürücüyü biçimlendirir ve cumhurbaşkanı tehdit edici e-postalar gönderir; Eğer sistemi kurtaramaz ve tekrar tanımlanmış bir duruma koyarsanız, kilitlenme işlemi yapmakla sorumludur. İşte bu yüzden, kendilerini sessizce parçalamak yerine çökecek sistemler inşa ediyoruz. Şimdi elbette, hepimiz asla çökmeyen istikrarlı bir sistem istiyoruz, ancak yalnızca sistemin tanımlanabilir bir öngörülebilir güvenli durumda kalmasını istiyoruz.
Kontrol akışı olarak istisnaların ciddi bir antipattern olarak kabul edildiğini duydum.
Bu kesinlikle doğru, ancak çoğu zaman yanlış anlaşılıyor. İstisna sistemini icat ettikleri zaman korkmuşlardı, yapılandırılmış programlamayı çiğniyorlardı. Elimizdeki neden Yapısal programlama olduğunu for
, while
, until
, break
, ve continue
tüm ihtiyacımız olduğunda, bütün bunları yapmak için vardır goto
.
Dijkstra bize goto'yu gayrı resmi olarak kullanmanın (dilediğiniz yere atlayarak) okuma kodunu bir kabus haline getirdiğini öğretti. İstisna sistemini bize verdiklerinde, yeniden yarattıklarından korkuyorlardı. Bu yüzden bize anlayacağımızı umarak "akış kontrolü için kullanmamamızı" söylediler. Ne yazık ki, çoğumuz yapmadık.
Garip, sık sık alıştığımız gibi spagetti kodu oluşturmak için istisnaları istismar etmiyoruz. Tavsiyenin kendisi daha fazla belaya neden olmuş gibi görünüyor.
Temel olarak istisnalar, bir varsayımı reddetmekle ilgilidir. Bir dosyanın kaydedilmesini istediğinizde, dosyanın kaydedilebileceğini ve kaydedileceğini varsayarsınız. Adının yasadışı olması, HD'nin dolu olması ya da bir kablonun veri kablonuzdan kemirilmiş olması nedeniyle olamayacağınız durumdaki istisna. Tüm bu hataları farklı şekilde halledebilir, hepsini aynı şekilde kaldırabilir veya sistemi durdurmalarına izin verebilirsiniz. Kodunuzda varsayımlarınızın gerçekleşmesi gereken mutlu bir yol var. Bir ya da başka istisnalar sizi bu mutlu yoldan uzaklaştırır. Açıkçası, evet, bu bir tür "akış kontrolü" ama sizi uyardıkları şey değildi. Böyle saçmalıktan bahsediyorlardı :
"İstisnalar olağanüstü olmalı". Bu küçük totoloji doğdu çünkü istisna sistem tasarımcılarının yığın izleri oluşturmak için zamana ihtiyaçları var. Etrafta atlamakla karşılaştırıldığında, bu yavaş. CPU zamanını yiyor. Ancak, sistemi günlüğe kaydetmek ve durdurmak ya da en azından bir sonraki sisteme başlamadan önce geçerli olan yoğun işlemi durdurmak istiyorsanız, o zaman öldürmek için biraz zamanınız var. Eğer insanlar "akış kontrolü için" istisnalar kullanmaya başlarlarsa, zaman hakkındaki bu varsayımların hepsi pencereden dışarı çıkar. Bu nedenle, "İstisnalar olağanüstü olmalı" gerçekten performans değerlendirmesi olarak bize verildi.
Bundan çok daha önemli, bizi şaşırtmıyor. Sonsuz döngüyü yukarıdaki kodda görmeniz ne kadar sürdü?
YAPMAYIN hata kodlarını döndürür.
... tipik olarak hata kodlarını kullanmayan bir kod tabanındaysanız iyi bir tavsiyedir. Neden? Çünkü kimse dönüş değerini kaydetmeyi ve hata kodlarını kontrol etmeyi hatırlamayacak. C'deyken hala iyi bir kongre.
OneOf
Başka bir kongre kullanıyorsun. Konvansiyonu ayarladığınız ve sadece başka biriyle savaşmadığınız sürece sorun değil. Aynı kod tabanında iki hata konvansiyonunun olması kafa karıştırıcı. Bir şekilde diğer sözleşmeyi kullanan tüm kodlardan kurtulduysanız, devam edin.
Kongreyi kendim seviyorum. Burada bulduğum en iyi açıklamalardan biri * :
Ama sevdiğim kadarıyla hala diğer sözleşmelerle karıştırmayacağım. Birini seç ve buna sadık kal. 1
1: Demek istediğim, aynı anda birden fazla kongre hakkında düşünmemi sağlama.
Sonraki düşünceler:
Bu tartışmadan şu anda elimde olan şey şu şekilde:
- Anında arayanın çoğu zaman istisnayı yakalayıp işlemesini ve belki de başka bir yoldan çalışmalarına devam etmesini beklerseniz, bu muhtemelen geri dönüş türünün bir parçası olmalıdır. İsteğe bağlı veya OneOf burada yararlı olabilir.
- Anında arayanın çoğu zaman istisnayı yakalamamasını beklerseniz, bir yığın istisna atarak manuel olarak yığının üstünden el ile geçirme aptallığını kurtarın.
- Acil arayanın ne yapacağından emin değilseniz Parse ve TryParse gibi ikisini de sağlayın.
Gerçekten bu kadar basit değil. Anlamanız gereken temel şeylerden biri, sıfırın ne olduğudur.
Mayıs ayında kaç gün kaldı? 0 (çünkü Mayıs değil. Zaten Haziran).
İstisnalar, bir varsayımı reddetmenin bir yoludur, ancak tek yol değildir. Eğer varsayımı reddetmek için istisnalar kullanırsanız, mutlu yolu terk edersiniz. Ancak, olayların varsayıldığı kadar basit olmadığını gösteren mutlu yolu göndermek için değerler seçtiyseniz, o zaman bu değerlerle başa çıkabildiği sürece o yolda kalabilirsiniz. Bazen 0 zaten bir şey ifade etmek için kullanılmaktadır, bu nedenle varsayımınızı reddettiğiniz fikrinin haritasını çıkarmak için başka bir değer bulmanız gerekir. Bu fikri eski güzel cebirdeki kullanımından tanıyabilirsiniz . Monad'lar bu konuda yardımcı olabilirler, ancak her zaman bir monad olmak zorunda değildir.
Örneğin 2 :
IList<int> ParseAllTheInts(String s) { ... }
Bunun kasıtlı olarak herhangi bir şey atması için tasarlanması gereken herhangi bir iyi sebep olduğunu düşünüyor musunuz? Hiçbir int ayrıştırılamadığında ne elde edeceğini tahmin et? Sana söylememe bile gerek yok.
Bu iyi bir ismin işaretidir. Üzgünüm ama TryParse benim için iyi bir isim değil.
Çoğu zaman, cevap aynı anda birden fazla şey olduğunda hiçbir şey almamaya istisna atmaktan kaçınırız, ancak bazı nedenlerden dolayı, cevap ya bir şey ya da hiçbir şeyse, bize bir şey vermesi ya da atması konusunda ısrarla takıntılı hale gelirsek:
IList<Point> Intersection(Line a, Line b) { ... }
Paralel çizgilerin gerçekten burada bir istisna oluşturması gerekiyor mu? Bu listenin asla birden fazla nokta içermemesi gerçekten kötü mü?
Belki anlamsal olarak bunu alamazsın. Eğer öyleyse, üzücü. Ancak, keyfi bir boyuta sahip olmayan Monad'lar, List
sizi daha iyi hissetmenizi sağlayacaktır.
Maybe<Point> Intersection(Line a, Line b) { ... }
Monad'lar, test etmelerine gerek kalmayan belirli şekillerde kullanılması amaçlanan küçük özel amaçlı koleksiyonlardır. Ne içerdiklerine bakmaksızın onlarla başa çıkmanın yollarını bulmamız gerekiyor. Bu şekilde mutlu yol basit kalır. Çatlak açıp her Monad'ı test ederseniz dokunduğunuzda yanlış kullanıyorsunuzdur.
Biliyorum, çok garip. Ama bu yeni bir araç (bizim için). Bu yüzden biraz zaman ver. Çekiçler onları vidalarla kullanmayı bıraktığında daha anlamlı olur.
Beni şımartacaksanız, bu yorumu ele almak istiyorum:
Yanıtların hiçbiri, ya Monad'ın bir hata kodu olmadığını, ne de OneOf olmadığını açıklamaz. Bunlar temelde farklıdır ve sonuçta soru bir yanlış anlaşılmaya dayanıyor gibi görünmektedir. (Değiştirilmiş bir formda olmasına rağmen hala geçerli bir soru.) - Konrad Rudolph 4 Haz 18, 14:08
Bu kesinlikle doğru. Monadlar, istisnalar, bayraklar veya hata kodlarından çok koleksiyonlara daha yakındır. Akıllıca kullanıldığında böyle şeyler için ince kaplar yaparlar.
Result
;-) kullanın