2011-04-21 14 views
9

İşlev/yöntem parametre denetimi (izin verilen değerlere karşı) yapmak için herhangi bir tasarım deseni veya temiz yolu var mı?İşlev parametre denetimi yapmak için temiz bir yol (veya desen) nedir?

Şu anda, işlevlerimin ilk kodları bu parametre denetimlerinden (boş dizeler, geçersiz karakterler, varolan kimlik, ...) oluşur ve gerektiğinde biraz çirkin ve 'gerçek' kodu gizler. fonksiyonun çözüm için

def my_function(p1,p2,p3,p4): 
    #check parameters 
    if p1 == '' 
     raise InvalidArgError('p1 can not be empty') 
    if p1 not in valid_list: 
     raise InvalidArgError('p1 does not exist') 
    if p2 < 0: 
     raise InvalidArgError('p2 can not be negative') 
    ... 

    #finally do something 
    p = p2+p3 

, Python içinde decorators çizgisinde düşünüyorum: Tipik olarak, benim kod şöyle gider.
Python kullanıyorum, ancak iyi bir çözümün dilden bağımsız olacağını düşünüyorum.

cevap

0

Bunu yapmanın bir yolu, tek bir yolunu bilmiyorum. Gerçek kod (rastgele örnek) parametresinin bir sürü yapılması gereken kontrol varsa başladığı

şahsen benim fonksiyonları olayı aydınlatmak:

def setpoint(x, y): 
    # checking for out of bounds 
    if x < 0 or x >= maxwidth: return false 
    if y < 0 or y >= maxheight: return false 

    # start function 
    map[x][y] = true 

Belki daha küçük işlevlerde İşlevlerinizi Ayrılıyorlar düşünmelisiniz, parametre kontrolünü yaymak için.

3
şu anda hayal edebiliyorum

sadece oldukça dil bağımsız şey gibi şeyler yapabilirsiniz böylece kod sözleşme çeşit: Sana çoğunda bazı tür bir uygulama ile gelebilir varsayalım

func foo(param1, param2) 
{ 
    Contract.NotNull(param1) 
    Contract.IsIn(0, 100, param2) 
} 

Programlama dilleri.

Güncelleme

Microsoft is working on an implementationve a Java implementation yoktur.

+0

Kod etkileşimlerine aşina değilim. İyi bir başlangıç ​​bağlantınız var mı? (google tarafından döndürülen sonuçlar ilk bakışta biraz fazla yüksek görünüyordu) – Rabarberski

1

Bir yöntemin her parametresi bir varlığı temsil eder. Yöntemin/tüm sınıfın çalıştığı argüman değerleri hakkında bazı kısıtlamalar veya varsayımlar olmalıdır. Bu yüzden bu parametrelerin geçerlilik kontrolü için yöntemler yazarım.

void drawRectangle(int length, int width) { 
    if (isValidLength(length) == false || isValidWidth(width) == false) { 
     // log about invalid argument so that it can be easily traced for debugging 
     return; 
    } 

    // remaining code 
} 

boolean isValidLength(int length) { 
    if (value < 0 || value > 100) { 
     return false; 
    } 

    return true; 
} 

Buradaki avantaj, yinelenen kodlardan kaçınılmasıdır. Null kontrol edilirse, çeşitli metotlarda aynı parametre tipi için aralık kontrolü yapılır ve bir süre sonra, gereksinim değişikliği nedeniyle bu parametrenin aralığı değişir, ardından değişiklikler birkaç yerde yapılır. Diğer taraftan, eğer kontrol ayrı bir yöntemle yapılırsa, değişimin kapsamı azalır.

İlgili konular