PHP'nin özel durumlar kullanmak en iyisidir?

3 Cevap php

Ben genellikle false dönerek bir yöntemde bir hata olduğunu göstermez, ama her zaman (yöntemine bağlı olarak, false geçerli bir dönüş olabilir) anlamsal benimle jel değildir.

Ben istisnalar içine baktım ve onlar bir tek beden uyan tüm çözüm merak ediyorum? false ben hala nerede can dönmek gerekir?

I may tamamen yani ayı ile beni lütfen buradan noktası eksik.

// My old way
function getProductById($id) {

    if ( ! is_numeric($id)) {
         return false;     
    }

}

// My consideration
function getProductById($id) {

    if ( ! is_numeric($id)) {
         throw new Exception('The id must be numerical!');     
    }

}

3 Cevap

İstisnalar harika! Eğer uzakta hata kodu hata işleme kodu devam edelim.

Sen dönmeden false bir fonksiyon için geçerli bir cevap olabilir ki haklısınız. Eğer bir hata atarsanız da onu yakalamak ve daha kullanışlı bir şey yapabilirsiniz.

Ben sizin hata uzakta hatalar kod işleme yardımcı olur derken bunu göz önünde

try {    
    func1($a);  
    func2($b);  
    func3($c);  
} catch (Exception $e) {  
    // error handling here  
}  

Yani bir yanlış dönüş için her fonksiyonu kontrol ve üzerinde hareket etmek gerekmez.

Ben bir stil sadece kullanarak öneriyoruz, böylece şimdiye kadar yanlış dönen başvurunuzu yazdım eğer, o uydurarak düşünmelisiniz.

Ama istisnalar alışılmadık kaynak-aç (hem CPU zamanı ve bellekte) PHP farkında olmak, istisnalar için kodunuzu yeniden yazmak istiyorsanız. Ben örnek göstermek istiyorum: bir işlevi var düşünün Product::getById($id). Eğer id bulunamadı değilse bu işlevi bir istisna atmak istiyorsanız, her şey yolunda. Tek bir sayfa isteği içinde olduğunu fonksiyonunu bir çok çağrı ve tüm olmayan kimlikleri toplamak istiyorsanız, ilk önce bir döngü içinde özel durumları yakalamak düşünebilirsiniz. Bu büyük bir yavaşlamaya yol açar. Seçenekler şunlardır:

  • Kod çoğaltmak (adında bir işlev oluşturmak Product::getByIdWithoutException())
  • bu kullanım durumda özel bir işlev oluşturmak (Product::getAllIds(array $ids)). Bu (çok fazla kod yazma veya büyük bir parametre listesi sahip veya yazılım mühendisliği diğer en iyi uygulamaları, vb kırmadan) her zaman mümkün değil iyi çözümdür, ama.

Sonunda bir istisna ya da değil olup olmadığını denetlemek için bir parametre geçirilen başka bir model, geçti. Gerçek bana böyle bir hata durumlarda düşünmeden tembel programlamak için izin için varsayılan değer ayarlama ve ben bir ek argüman ileterek hız için istisnalar alışverişinde başardı. Eğer etrafında o parametresi iletebilirsiniz beri istisna, diğer fonksiyonlar atılır, bu bile çalışır:

function getById($id, $throwException = true) {
    if (!self::idExists($id)) {
        if ($throwException) {
            throw new IdNotFoundException();
        } else {
            return NULL;
        }
    }
    return self::getByWhereClause('id = ' . self::escape($id), $throwException);
}

Bunu yararlı olabilir diye düşündüm.

Joel Spolsky göre, Exceptions shouldn't be used.

Istisna işleme ile ilgili başparmak benim genel kural önce sen ilk etapta PHP durumlar atma asla tarafından başarabileceği son kullanıcı için uygulama akışını korumak için denemek için, ama onlar yararlıdır zamanlar vardır.

Ben koşulların bu sorunu tetikler duruma yol açabilecek ne dayalı bir boolean false veya başka bir işleme yöntemi dönen karşı bir istisna konusunda bir karara bakmak eğilimindedir.

Bu belirli bir kod bloğu çalıştırıldığında olmak normal, makul değeri ya da devlet var mı? Eğer öyleyse, o zaman muhtemelen sadece bir boolean false veya kod bloğu bir başarısızlık noktasına ulaştı belirten diğer bazı değer döndürmek istiyorum.

Eğer bu sizin için anında geri bildirim sağlar, çünkü olmayan bir normal değer ya da devlet var olabilir, ya da değer ya da devlet düzgün, kodu bir değişken başlatmak için unutmadan birinin sonucu ise, o bir istisna muhtemelen uygun olacağını endişe ederseniz Bir geliştirici olarak. Burada örnek bir çift bir nesne kurucu içinde ayarlanmış olması gerekir, ancak değer düzgün belirtilmemiş ya da bir yöntem, bir nesne üzerinde değil denilen bir senaryo varsa bir istisna atmak isteyebilirsiniz gerekli bir özellik olurdu denir alırsa.

Kısacası, ben en uygun aracı kullanma eğiliminde. Ben normal uygulama yürütmenin parçası olan bir şey ile uğraşıyorum sonra ben genellikle başarısızlığı belirten bir değer döndürür. Ben sorunu ile başa çıkmak o kadar geçersiz bir şey oluyor onun bir durum o zaman ben bir istisna durumunda.

Sana gerçekten bir son kullanıcı için uygulama durdurulması ama kod bu hatlar uygun test hiçbiri ile her vahşi çalıştırmak gerektiğini akılda fikri ile kodlamak gereken o şeyleri yakalamak için sadece özel durumlar kullanmak olduğunu söyleyebiliriz herhalde.