首页 > 函数对传入参数的检查应该做到什么程度呢?

函数对传入参数的检查应该做到什么程度呢?

想像这样一个业务场景:前端提交了一些数据,比如新建一篇文章,后台route模块收到请求和数据,传给post模块中的create()函数,create()函数对数据进行一些处理,整理成最终要入库的数据,然后调用db模块的insertOne()函数写入数据。

流程大概是这样(伪代码):
前端:

POST /post/

    formData

route 模块:

app.post('/', (req, res) => {
    post.create(req.body);
})

post 模块:

create(post) {
    // do something
    db.insertOne('posts', post);
}

db 模块:

insertOne(name, doc) {
    db.collection(name).insertOne(doc);
}

我的问题是,对每一个函数来说,对传入数据的检查应该做到什么程度呢?

比如,route作为后台第一个收到前端数据的模块,肯定会检查一遍所有数据,包括必要字段的完整性和所有字段的合法性。那么post在被route调用时,是否还要对传入的数据再做一遍检查呢?因为理论上它收到的数据已经是前置函数检查过的了,再做检查似乎是没必要的?

又比如,routepost模块都是专用的,db模块是共用的。在db模块中,是否还需要对数据做通用的合法性检查呢(比如检查数据类型)?是否需要判断数据内容做针对性检查呢(比如判断是插入posts表,再检查一遍数据是否符合表的要求)?


个人的看法是:
route/insertOne/db 不需要对参数做检测.
检测的地方是在 post 中完成.


理论上续上对每一个函数的参数执行类型及合法值的校验~
同时你要看你的函数的潜在调用方是否可预知,
如果你确定你的调用方可预知可控制的,那么在调用方检查下类型及合法值就可以
如果你对潜在的调用方式不可预知的,考虑到扩展性,那么最好每一个函数要对自己负责,你不能信任调用者的传递给你的参数~

【热门文章】
【热门文章】