Soru 1:
Yeni StreamReader (dosya adı) döndürmesi nedeniyle mi; for döngüsü içinde? ya da bu durumda bir for döngüsüne ihtiyacınız olmadığı gerçeği?
Akış okuyucunun bununla hiçbir ilgisi yoktur. Anti-desen nedeniyle arasındaki niyet net bir çatışma çıkar foreach
ve if
:
Amacı nedir foreach
?
Cevabınızın şöyle olacağını düşünüyorum: "Tekrar tekrar belirli bir kod parçası yürütmek istiyorum"
Kaç dosyayı işlemeyi bekliyorsunuz?
Yalnızca belirli bir klasörde (uzantısı dahil) Belirli bir dosya adı olabilir, çünkü bu kod bulmak için tasarlanmıştır kanıtlıyor biri uygulanabilir dosyası.
Bu, hemen bir değer döndürdüğünüz ile de doğrulanır. Var olsa bile, aslında ikinci bir maç umurunda değil.
Bunun bir anti-desen olmadığı bir durum var.
- Alt dizinlere (
Directory.GetFiles(".", SearchOption.AllDirectories)
) de bakarsanız , aynı dosya adına (uzantı dahil) sahip birden fazla dosya bulmak mümkündür
- Kısmi dosya adı eşleşmeleri (örneğin, adı ile başlayan
"Test_"
her "*.zip"
dosya veya her dosya) arıyorsanız .
Bu iki durumun da birden fazla eşleşmeyi gerçekten işlemenizi gerektireceğini ve bu nedenle hemen bir değer döndürmeyeceğini unutmayın.
Soru 2:
İkinci örneği düzeltmek için, if ifadesi olmadan yeniden yazar ve bunun yerine StreamReader'ı bir try-catch bloğu ile kuşatırsınız ve bir FileNotFoundException özel durumu atarsa buna göre catch bloğunda işlersiniz?
İstisnalar pahalıdır. Asla uygun akış mantığı yerine kullanılmamalıdır. İstisnalar, adlarının istisnai durumlara işaret ettiği gibi .
Bu nedenle if
,.
SoftwareEngineering.SE'deki bu cevaba göre :
Genel olarak, kontrol akışı için istisnaların kullanılması, dikkate değer bir duruma ve dile özgü öksürük istisnalarının öksürüğü olan bir anti-kalıptır.
Genel olarak neden bir anti-desen olduğuna dair hızlı bir özet olarak:
- İstisnalar, özünde, karmaşık GOTO ifadeleridir
- Bu nedenle istisnalar dışında programlama, kodu okumak ve anlamak daha zor olur
- Çoğu dilde, istisnasız olarak sorunlarınızı çözmek için tasarlanmış mevcut kontrol yapıları vardır
- Verimlilik argümanları, kontrol akışı için istisnaların kullanılmadığı varsayımıyla optimize edilen modern derleyiciler için tartışmalı olma eğilimindedir.
Daha ayrıntılı bilgi için Ward'ın wiki'sindeki tartışmayı okuyun .
Bunu bir try / catch'e sarmanız gerekip gerekmediği, büyük ölçüde durumunuza bağlıdır:
- Bir yarış koşuluyla karşılaşma olasılığınız nedir?
- Aslında bu durumla başa çıkabiliyor musunuz, yoksa bu sorunun kullanıcıyla nasıl başa çıkacağını mı düşünüyorsunuz çünkü nasıl başa çıkacağınızı bilmiyorsunuz.
Hiçbir şey "daima kullan" meselesi değildir. Demek istediğimi kanıtlamak için:
Ayrı çalışmalar, bir kask, koruyucu gözlük ve kurşun geçirmez yelek giydiğinizde incinme olasılığınızın daha düşük olduğunu kanıtlamıştır.
Öyleyse neden hepimiz bu güvenlik ekipmanını takmıyoruz?
Basit cevap, onları giymenin dezavantajları olmasıdır:
- Paraya mal olur
- Hareketinizi daha hantal yapar
- Giymek oldukça sıcak olabilir.
Şimdi bir yere gidiyoruz: profesyoneller ve eksiler var . Başka bir deyişle, bu ekipmanı sadece profesyonellerin eksilerini aştığı durumlarda takmak mantıklıdır .
- İnşaat işçilerinin işleri sırasında yaralanmaları çok daha muhtemeldir. Emniyet kaskından faydalanırlar.
- Ofis çalışanları ise, yaralanma şansı çok daha düşüktür. Güvenlik kaskları buna değmez.
- Bir SWAT ekibi üyesinin, bir ofis çalışanına kıyasla vurulma olasılığı daha yüksektir.
Aramayı dene / yakala? Bu, bunu yapmanın yararlarının, uygulamanın maliyetinden daha ağır basmayacağına bağlıdır.
Diğerlerinin, onu sarmanın yalnızca birkaç tuşa basıldığını iddia edebileceğini unutmayın, bu yüzden açıkça yapılması gerekir. Ancak tüm tartışma bu değildir:
- İstisnayı yakaladıktan sonra ne yapacağınıza karar vermeniz gerekir.
- Kod tabanının her yerinde farklı dosyalara çok sayıda farklı çağrı varsa, bir dene / yakala seçeneğine karar vermeniz genellikle bu durumların tümünü sarmanız gerektiği anlamına gelir . Bunun uygulanması için gereken çaba miktarı üzerinde önemli bir etkisi olabilir.
- O bunu yeterince mümkündür kasten istiyoruz değil bir istisna işlemek.
- Başvurunuz de durum işlenecek olacağı Not bazı noktada, ama bu durum büyüdü hemen sonra mutlaka değildir.
Yani, seçim senin. Bunu yapmanın bir yararı var mı? Uygulamayı geliştirmek için daha fazla çaba harcamanın ötesinde uygulamayı geliştirdiğini düşünüyor musunuz?
Güncelleme - Yazdığım bir yorumdan diğer cevaba kadar, bunun sizin için de önemli olduğunu düşünüyorum:
Çevrelere çok bağlı.
- Akış okuyucunun açılmasından önce
if(!File.Exists) File.Create()
, akış okuyucuyu açarken dosyanın olmaması gerçekten istisnai bir durumdur .
- Dosya adı mevcut dosyalar listesinden seçildiyse, ani yokluğu yine istisnadır .
- Henüz dizine karşı henüz test etmediğiniz bir dizeyle çalışıyorsanız; dosyanın olmaması mükemmel bir mantıksal sonuçtur ve bu nedenle istisnai değildir .