请问这样算不算滥用class
发布于 6 年前 作者 fuxingZhang 3918 次浏览 来自 问答

阅读腾讯出的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')
    }
};
18 回复

万一以后想添加其他方法不是又得导出一个?这个看自己吧,也不算是滥用吧 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是最近刚发布的)

@fuxingZhang

不是我的主观认为,楼上你自己也阐述了,我也就懒得写了,这种是没必要OOP的场景。

曾经我是这把无法没什么关联的函数式风格的controller改成OOP风格. 结果发现不是什么都可以用类来写的,反而会显得怪异

@axetroy Strongly agree

我觉得都可以吧,不然按你的意思,类的静态方法不该存在?

@musclejack 不是啊,如果需要实例化,就该用类,如果有的方法不想被实例继承,而是作为该类的工具函数使用,在不需要实例化的情况下,直接调用,这是静态方法存在的意义

回到顶部