从 JavaScript 看接口隔离

450 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

前言

之前讲过了单一职责原则,依赖倒置原则。这篇讲剩下的接口隔离原则。

接口隔离原则

首先在其他语言里,接口是指一种实现,和继承稍微有点不同,从JavaScript 的角度来看,大概就是引用的对象他暴露多少东西。这里有一个词叫胖接口,意思是一个接口里面有非常多的方法,各种各样的方法。而接口隔离原则是让这个接口尽可能的少暴露过多方法,主要的思想是实现更多接口来实现更多功能,而不是通过一个接口实现全部功能。

JavaScript 是函数更多一些,简单来说就是为一些特定的功能实现相应的一系列函数,然后引用。如果分得太细,就会导致有很多重复或者整个代码使用的复杂性增加了,因为要记很多函数。但是如果设计得好能够很清晰的看清楚代码结构的层次。

整体的思想是不要引用太多这个功能不需要的函数。比如有一个支付模块,里面有生成订单的函数,有查询订单的函数,有获取商品的函数,有支付的函数。那这个模块是有点臃肿的,而且紧密耦合,因为这些函数都有一些其他的自己固定依赖的属性或方法。导致其中一个发生变化的时候,会影响到整个模块。

    const payModule = {
        createOrder() {},
        queryOrder() {},
        getGoods() {},
        usexxxPay() {}
    }

好的做法是让他们分别提供专门的服务,约束内部的行为。

    const payModule = {
        usexxxPay() {}
    }
    
    const orderModule = {
        createOrder() {},
        queryOrder() {},
    }
    
    const goodsModule = {
        getGoods() {}
    }

这样能减少影响其他代码的可能性,而且我们能很快看出系统的结构。

举另外一个例子,在 vue 项目中,我们会用 isFoo 来作为控制隐藏或者其他行为的判断基准。例如 isShow 等。如果用接口隔离的思想来看,这个 isShow 不应该作为太多地方同时依赖的判断。而应该用多个 isFoo 来分别的管理。但是用太多的时候,我们就很难记住他们到底谁负责谁。而交互复杂时多个 isFoo 切换的时候,我们就需要取舍专一约束和复杂性之间的平衡。

结尾

JavaScript 和其他语言不一样没有接口,不用 implement。所以只能在代码设计上借鉴这样的思想,而不能落实到特定的操作上。