1

关于功能使用,我几乎没有什么具体问题。

如果在这里问似乎太基本了,我深表歉意。我正在从事一个不断发展的项目。这些问题最近一直困扰着我。

问题:

1. 我需要验证每个函数中的参数吗?

   //getConcatInfo: ("John Doe", 50, {name: "London"}) => "John 50 London"
    getConcatInfo(name, age, city){
        let first = name.split(" ")[0];
        return first + " " + age + " " + city.cityName;
    }
  1. 我是否应该检查项目中的每个函数中是否存在每个参数?
  2. 对于所有函数,我是否应该检查每个参数的类型是否正确?例如city应该是一个带有键的对象,cityName并且name应该ageStringNumber
  3. 例如,如果存在两个参数并且第三个参数不应该抛出异常或只返回 null。询问这个问题的原因是,像RXJS, 这样的库将在该事件处理程序中引发任何错误时停止侦听给定事件

2. 在调用函数之前我需要验证参数吗?

let name = user.name;
let name = user.age;
let city = getUserCity();

if(name && age && city && city.name) //<= like this?
   getConcatInfo(name, age, city);

我的问题是:我是采用方法 1 还是方法 2 还是两者兼而有之?

4

1 回答 1

0

永远不应该相信输入。您应该检查函数内部的参数。

您可以控制功能,但无法控制调用站点。

关于你应该做多少检查。这取决于您的用例。检查太少,您最终可能会遇到很多运行时问题,检查太多,您的发布速度会慢很多,因此由您决定什么是太多。您可以应用的一条经验法则是,您对调用站点的控制越多,您可以在函数内部进行的检查就越少,但您不应该信任输入。

返回 null(或其他值)或抛出异常取决于您在参数中获得的违规程度。您可以尝试从小问题中恢复:通过返回 null 或使用特定参数的默认值并执行您的代码。如果您无法从错误中恢复,那么您应该抛出异常。在你的情况下,你可以做这样的事情

getConcatInfo(name, age, city){
    name = name || 'default name'
    age = age || 18
    city = city || {cityName: 'default name'}
    let first = name.split(" ")[0];
    return first + " " + age + " " + city.cityName;
}

你也可以使用默认参数

getConcatInfo(name = 'default name', age = 18, city = {cityName: 'default name'}){
    let first = name.split(" ")[0];
    return first + " " + age + " " + city.cityName;
}

如果您想要类型检查,您可能需要查看TypeScript。但当然,这是一种不同的语言:)

于 2019-03-17T07:29:55.347 回答