SORU
26 NİSAN 2013, Cuma


Test oluşturun, deneyin-oluşturmak-catch oluşturmak?hangi tasarım en tercih edilir:

Hadi bir kullanıcı oluşturur bir işlem olmadığını varsayalım. Bu işlem ise belirtilen e-posta veya kullanıcı adı varsa başarısız olabilir. Eğer başarısız olursa, tam olarak nedenini bilmek gereklidir. Gördüğüm kadarıyla bu işin üç yaklaşım vardır ve kesin bir kazanan olup olmadığını merak ediyorum.

Yani, burada bir sınıf kullanıcı:

class User
{
    public string Email { get; set; }
    public string UserName { get; set; }
}

Ve oluşturma işlemi tamamlamak için 3 yol vardır:

Test Oluşturun

if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);

UserExists ve UsernameExists isteği sunucu doğrulama yapmak için db. Bu aramalar tekrar CreateUser API doğru kullanıldığından emin olmak için tekrar edilir. Doğrulama başarısız oldu diye, her iki durumda da ArgumentOutOfRangeException atarım. Performans isabet vardır.

Deneyin Oluşturun

enum CreateUserResultCode
{
    Success,
    UserAlreadyExists,
    UsernameAlreadyExists
}

if (!TryCreate(user, out resultCode))
{
    switch(resultCode)
    {
        case UserAlreadyExists: act on user exists error;
        case UsernameAlreadyExists: act on username exists error;
    }
}

Bu model doğrulama sadece bir kez yapar, ama iyi bir uygulama olarak kabul edilemez olan sözde hata kodları kullanarak çare.

Oluşturun Yakalamak

try
{
    CreateUser(user);
}
catch(UserExistsException)
{
    act on user exists error;
}
catch(UsernameExistsException)
{
    act on username exists error;
}

Hata kodları burada kullanmak istemiyorum, ama ben artık her vaka için ayrı özel bir sınıf oluşturmak zorunda. İstisnalar kullanılmak üzere gereken ne kadar daha fazla veya daha az, ama eğer numaralama girişi yerine ayrı bir özel durum oluşturma zahmete değer olup olmadığını merak ediyorum.

Ya da daha fazla tat meselesi kesin bir kazanan var mı?

CEVAP
26 NİSAN 2013, Cuma


Ya da daha fazla tat meselesi kesin bir kazanan var mı?

İlk seçenek temel bir kusur asla parçacığı CreateUser dış kaynaklara dayanır emniyetli ve güvenli olacak, ve diğer uygulamalar arasında testlerinizi oluşturmak olabilir. Genel olarak, bu "" bu. çünkü desen uzak durmaya çalışıyorum

Diğer iki seçenek için - gerçekten hata olup olmadığını aşağı gelirbeklendiğiolacak. Eğer CreateUser biraz normal olarak başarısız olması durumunda, Dene* desen istisnalar aslında kullanarak denetimi akışı için özel durumlar kullanarak olur gibi benim de tercihimdir.

Eğer başarısızlık gerçekten olağanüstü bir durum olurdu, o zaman durumlar daha anlaşılır olurdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C#

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bach Vlogs

    Bach Vlogs

    18 HAZİRAN 2011
  • CommonArtisan

    CommonArtisa

    7 Temmuz 2012
  • whiteboy7thst

    whiteboy7ths

    1 Temmuz 2009