2014-03-05 79 views
3

我是球拍新手,我需要作爲家庭作業編寫一些程序。檢查參數的類型是否是一種好的做法?例如,什麼是更好的:在球拍類型檢查參數是不錯的做法

(define (add x y) 
    (+ x y) 
) 

或者

(define (add x y) 
    (unless (number? x)(raise exception)) 
    (unless (number? y)(raise exception)) 
    (+ x y) 
) 

我能想到的:類型檢查,使異常被拋出更早,並且更容易找到。但它使代碼更復雜,可讀性更差。

回答

7

專業球拍編碼傾向於使用contracts爲此目的,通常在模塊的出口。合同既可以作爲文件,也可以保證您的功能在正確的輸入上被調用併產生正確的輸出。

他們還會「違反」違反合同條款的代碼。

對於你的榜樣,你可以寫喜歡你模塊中的下列合同:當其他模塊嘗試錯誤地使用add功能

(provide (contract-out [add (-> number? number? number?)])) 

然後,他們將受到指責。因爲它將執行和規範分開,所以分開單獨編寫合同是很好的做法。


也就是說,除非你正在服用一種軟件工程課程,並編寫大型程序,這可能只是一個分心。所以對於你的任務,不要打擾。

2

如果您正在編寫一個將被其他人使用的可重用模塊,檢查參數並確保類型是正確的,但只有在檢查尚未執行時纔有意義 - 你的例子沒有必要驗證參數是否是數字,如果它們不是由於違反合同而會發生錯誤,換句話說:類型檢查已經存在,在添加過程中。

Scheme使用動態類型變量,並且在正常情況下,您的代碼不應該執行這樣的檢查,只需要編寫程序的邏輯並擔心稍後的類型檢查(如果有的話)。

1

添加程序已經進行了類型檢查。更重要的問題是你想如何處理異常。花一些時間調查with-exception-handler