it-swarm.asia

Boşluğu ne zaman ve neden kullanmalısınız (örneğin bool / int yerine)

Bazen bir geliştiricinin işlevi için kritik olmayan bir şey döndürmeyi seçtiği yöntemlere girerim. Yani, koda bakarken, görünüşe göre void kadar güzel çalışıyor ve bir an düşündükten sonra, "Neden?" Bu size tanıdık geliyor mu?

Bazen çoğu zaman bool veya int gibi bir şey döndürmenin daha iyi olduğunu kabul ederdim, daha sonra sadece void yapın. Büyük resimde, artıları ve eksileri hakkında emin değilim.

Duruma bağlı olarak, bir int döndürmek, arayanı yöntemden etkilenen satır veya nesne miktarından haberdar edebilir (ör. MSSQL'e kaydedilen 5 kayıt). "InsertSomething" gibi bir yöntem bir boole döndürürse, yöntem başarılı olursa true, başka bir false döndürmek için tasarlanmış yöntem olabilir. Arayan, bu bilgilere göre hareket etmeyi veya etmemeyi seçebilir.

Diğer yandan,

  • Bir yöntem çağrısının daha az net bir amacına yol açabilir mi? Kötü kodlama beni genellikle yöntem içeriğini tekrar kontrol etmeye zorlar. Bir şey döndürürse, yöntemin döndürülen sonuçla bir şeyler yapmak için have türünde olduğunu söyler.
  • Başka bir sorun, yöntem uygulaması sizin için bilinmiyorsa, geliştirici işlev açısından kritik olmayan geri dönmeye ne karar verdi? Tabii ki yorum yapabilirsiniz.
  • İşleme, yöntemin kapanış parantezinde sonlandırılabildiğinde, dönüş değeri işlenmelidir.
  • Kaputun altında ne olur? Atılan hata nedeniyle çağrılan yöntem false aldı mı? Yoksa değerlendirilen sonuç nedeniyle yanlış mı döndü?

Bununla ilgili deneyimleriniz neler? Buna nasıl davranırdınız?

30
Independent

Bir yöntemin başarılı veya başarısız olduğunu gösteren bir bool döndürme değeri durumunda, .NET yöntemlerinde çeşitli yöntemlerde kullanılan Try- önek paradigmasını tercih ederim.

Örneğin, aynı tuşa sahip bir satır zaten varsa, bir void InsertRow() yöntemi bir istisna atabilir. Soru şudur: Arayan kişinin InsertRow'u çağırmadan önce satırının benzersiz olmasını sağlaması mantıklı mıdır? Yanıt hayırsa, satır zaten varsa false döndüren bir bool TryInsertRow() de sağlarım. Db bağlantı hataları gibi diğer durumlarda, db bağlantısını korumanın arayanın sorumluluğu olduğunu varsayarak TryInsertRow yine de bir istisna atabilir.

32
Bubblewrap

Bir "durum kodu" döndüren IMHO, istisnalar C # gibi orta ve üst düzey dillerde yaygın hale gelmeden önce tarihsel zamanlardan kaynaklanmaktadır. Günümüzde, beklenmedik bir hata yönteminizin başarılı olmasını engellediyse bir istisna atmak daha iyidir. Bu şekilde hatanın fark edilmediğinden emin olur ve arayan uygun şekilde bu sorunu çözebilir. Bu durumda, bir yöntemin boole durum bayrağı veya tamsayı durum kodu yerine hiçbir şey döndürmemesi (yani void) mükemmeldir. (Tabii ki, yöntemin hangi istisnaları ne zaman atabileceği belgelenmelidir.)

Öte yandan, katı anlamda bir işlevse, yani giriş parametrelerine göre bazı hesaplamalar yaparsa ve bu hesaplamanın sonucunu döndürmesi beklenirse, dönüş türü açıktır.

Arayanlar için yararlı kabul edilirse, bir may yöntemden bazı "ekstra" bilgiler döndürmeye karar verdiğinde, ikisi arasında gri bir alan vardır. Bir eklemedeki etkilenen satırların sayısı hakkındaki örneğiniz gibi. Veya bir öğeyi ilişkilendirilebilir koleksiyona yerleştirme yönteminde, varsa, o anahtarla ilişkili önceki değeri döndürmek yararlı olabilir. Bu tür kullanımlar, bir API'nin (bilinen ve beklenen) kullanım senaryolarının dikkatle analiz edilmesiyle tanımlanabilir.

28
Péter Török

Peter'ın cevabı istisnaları iyi kapsar. Burada dikkat edilmesi gereken diğer hususlar arasında Komut-Sorgu Ayrımı

CQS ilkesi, bir yöntemin ikisini birden değil komut ya da sorgu olması gerektiğini söylüyor. Komutlar asla bir değer döndürmemeli, yalnızca durumu değiştirmeli ve sorgular durumu döndürmeli ve değiştirmemelidir. Bu, anlambilimi çok net tutar ve kodun daha okunaklı ve bakımı yapılabilir hale getirilmesine yardımcı olur.

CQS prensibini ihlal eden birkaç durum iyi bir fikirdir. Bunlar genellikle performans veya iplik güvenliği ile ilgilidir.

14
Andy Lowry

Yol ne olursa olsun bununla yürüyeceksin. İleride kullanmak için orada dönüş değerlerine sahip olmayın (örneğin, işlevlerin her zaman doğru dönmesini sağlayın) bu korkunç bir çaba kaybıdır ve kodu daha net okumaz. Bir dönüş değeriniz olduğunda, bunu daima kullanmalısınız ve kullanabilmek için en az 2 olası dönüş değerine sahip olmalısınız.

3
refro

Çok sayıda geçersiz işlev yazıyordum. Ama tüm yöntemi zincirleme çatlağı aldığım için, bunu boşluktan ziyade iade etmeye başladım - birisinin dönüşten faydalanmasına izin verebilir, çünkü boşlukla çömelemezsin. Ve eğer onunla hiçbir şey yapmak istemezlerse, onu görmezden gelebilirler.

1
Wyatt Barnett