2013-07-02 101 views
2

我有以下構造函數URL圖1)來幫助解釋我的問題。方法isValidUrl採用可選參數optUrl。默認使用實例屬性url。但是,如果參數已設置,則會被參數optUrl覆蓋。將實例方法也用作靜態方法是不是很好的做法?

我不確定這是否是好的軟件工程實踐。

圖1:

function Url(url) { 

    this.url = url; 

    this.isValidUrl = function (optUrl) { 
     var url; 

     // Questionable pattern 
     if (typeof(optUrl) === 'undefined') { 
      url = this.url; 
     } else { 
      url = optUrl; 
     } 

     // 1. call: 'http://www.example.com' 
     // 2. call: 'http://www.exampl2.com' 
     console.log(url); 

     return url !== ''; // Very simple check 
    } 
} 

var u = new Url('http://www.example.com'); 
console.log(u.isValidUrl()); // true 
console.log(u.isValidUrl('http://www.exampl2.com')); // true 
+0

1)它仍然不是一個靜態方法 - 需要一個對象2)我會在構造函數中執行檢查並拋出一個異常...沒有有效url的Url對象沒有多大意義。 –

+0

我同意1)。我也同意2)但我上面的代碼只是一個簡單的例子。 –

+0

可能發生的情況是,有一天,當您輸入u.isValidUrl()時,您不知道該值來自哪裏。在這樣一個簡單的例子中,你仍然可以知道,但是在更復雜的事情中,它可能會導致錯誤的結果/返回。我會拋出虛假如果無效的URL給出像空字符串/ undefined – Marcio

回答

2

首先,我會做的isValid在UrlHelper或東西靜態輔助方法。 如果你只需要這個方法的Url類,我會避免有一個單獨的類,並直接調用助手。

喜歡的東西:

function Url(){ 

} 

Url.isValidUrl(url){ 
if(!url) return false; 

    return true; //add here code to check if url is valid 
} 

如果你確實需要一些額外的邏輯URL類,那麼你可以調用從輔助類中的方法。

就你的問題而言,用參數覆蓋實例屬性是否是一種好的做法,我的意見是否定的。在上面的示例中,您將使用類作爲對象(創建實例,調用這些實例的方法),並將其用作與特定實例無關的實用程序類(至少在上面的示例中)。

+0

如果Url將有一千個方法,你仍然有UrlHelper靜態檢查?我同意你最後一段的意見。在我的情況下,我可能會刪除可選參數,並只與傳遞給構造函數的url一起工作。 –

相關問題