阅读腾讯出的SDK的源码,发现以下代码(删掉了注释)
const TencentCloudSDKHttpException = require("./exception/tencent_cloud_sdk_exception");
const crypto = require('crypto');
class Sign {
static sign(secretKey, signStr, signMethod) {
let signMethodMap = {
HmacSHA1: "sha1",
HmacSHA256: "sha256"
};
if (!signMethodMap.hasOwnProperty(signMethod)) {
throw new TencentCloudSDKHttpException("signMethod invalid, signMethod only support (HmacSHA1, HmacSHA256)");
}
let hmac = crypto.createHmac(signMethodMap[signMethod], secretKey || "");
return hmac.update(new Buffer(signStr, 'utf8')).digest('base64')
}
}
module.exports = Sign;
忽略其中使用废弃的的new Buffer不管, 这本身只是在提供一个函数,根本不需要实例化,为什么非要用class,这算不算滥用class
我的理解是这样写
const TencentCloudSDKHttpException = require("./exception/tencent_cloud_sdk_exception");
const crypto = require('crypto');
function sign(secretKey, signStr, signMethod) {
let signMethodMap = {
HmacSHA1: "sha1",
HmacSHA256: "sha256"
};
if (!signMethodMap.hasOwnProperty(signMethod)) {
throw new TencentCloudSDKHttpException("signMethod invalid, signMethod only support (HmacSHA1, HmacSHA256)");
}
let hmac = crypto.createHmac(signMethodMap[signMethod], secretKey || "");
return hmac.update(Buffer.from(signStr, 'utf8')).digest('base64')
}
module.exports = Sign;
或者保持原代码的调用方式,这样写
const TencentCloudSDKHttpException = require("./exception/tencent_cloud_sdk_exception");
const crypto = require('crypto');
module.exports = {
sign(secretKey, signStr, signMethod) {
let signMethodMap = {
HmacSHA1: "sha1",
HmacSHA256: "sha256"
};
if (!signMethodMap.hasOwnProperty(signMethod)) {
throw new TencentCloudSDKHttpException("signMethod invalid, signMethod only support (HmacSHA1, HmacSHA256)");
}
let hmac = crypto.createHmac(signMethodMap[signMethod], secretKey || "");
return hmac.update(Buffer.from(signStr, 'utf8')).digest('base64')
}
};
万一以后想添加其他方法不是又得导出一个?这个看自己吧,也不算是滥用吧 From Noder
@bigsomg 使用class添加方法跟第二种写法是一样的,包在在一个对象内。我理解的是需不需要实例化,需要就上,不需要实例化就没有class的必要
这就是面向对象的思想和面向函数的思想的区别之一吧
阿斯蒂芬
class 是给人类看的,代码如果迭代复杂了,比较好理解和阅读; 如果是单文件、一个方法来说,其实无所谓了,如果文件多了,保持一致性,当然class好呀。
但从这个函数来看的话,还是比较喜欢直接function的,对于大工程还是要用class来组织一下,而且这也用了static方法,也不需要实例化,其实看个人喜好吧
我觉得是滥用。
@axetroy 有人能抛弃主观看法,从技术角度深入分析一下就好了
这不是 static 么,不需要实例化啊,直接就可以调用了,也不算是滥用
Sign.sign()
这语义很奇怪吧,如果针对这命名我觉得是。 但我觉得更可能的情况是名字没命好。。。
@a631807682 SDK是这样命名和使用的,语意没问题,调用Sign类里的sign方法,静态方法就是这样的
new Buffer(array) Stability: 0 - Deprecated: Use Buffer.from(array) instead. https://nodejs.org/dist/latest-v8.x/docs/api/buffer.html#buffer_new_buffer_array
显然这是临时让java程序猿写的sdk
@x770158999 腾讯的工程师很忙,不见得有时间看文档(这个SDK是最近刚发布的)
不是我的主观认为,楼上你自己也阐述了,我也就懒得写了,这种是没必要OOP的场景。
曾经我是这把无法没什么关联的函数式风格的controller改成OOP风格. 结果发现不是什么都可以用类来写的,反而会显得怪异
@axetroy Strongly agree
我觉得都可以吧,不然按你的意思,类的静态方法不该存在?
@musclejack 不是啊,如果需要实例化,就该用类,如果有的方法不想被实例继承,而是作为该类的工具函数使用,在不需要实例化的情况下,直接调用,这是静态方法存在的意义