2013-07-02 177 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一起工作。 –

相关问题