• 可组合的类定义


    我们定义类时,炉墙代码,和业务代码常常耦合在一起,本文是将业务代码和炉墙代码解耦。利用类继承的特性。

    一个常用的构造类的模式是流利模式,或者方法链,耦合的代码如下:

        class Cake {
            setFlavour(flavour) {
                this.flavour = flavour;
                return this
            }
            setLayers(layers) {
                this.layers = layers;
                return this
            }
            bake() {
                // do some baking
                return this
            }
        }
    
        const cake = new Cake()
    
        cake.
            setFlavour('chocolate').
            setLayers(3).
            bake();
    
        expect(cake).toEqual({ flavour: "chocolate", layers: 3, })
    
    

    这里,每个方法的赋值代码是业务代码,最后返回本实例是框架代码,混合在一起的代码阅读难度增加很多。我们将其分离,首先,基类只写业务代码:

        class Cake {
            setFlavour(flavour) {
                this.flavour = flavour;
            }
            setLayers(layers) {
                this.layers = layers;
            }
            bake() {
                // do some baking
            }
        }
    
    

    然后,我们写流利模式代码:

        class FluentCake extends Cake {
            setFlavour(flavour) {
                super.setFlavour(flavour)
                return this
            }
            setLayers(layers) {
                super.setLayers(layers)
                return this
            }
            bake() {
                // do some baking
                super.bake()
                return this
            }
        }
    

    分离后的代码,更加清晰可读。

    用法是一样的:

        const cake = new FluentCake()
    
        cake.
            setFlavour('chocolate').
            setLayers(3).
            bake();
    
        expect(cake).toEqual({ flavour: "chocolate", layers: 3, })
    
    

    javascript中,超类和子类也可以解耦:

        const Fluent = (superclass) => class Fluent extends superclass {
            setFlavour(flavour) {
                super.setFlavour(flavour)
                return this
            }
            setLayers(layers) {
                super.setLayers(layers)
                return this
            }
            bake() {
                // do some baking
                super.bake()
                return this
            }
        }
    

    使用方法如下:

        const FluentCake = Fluent(Cake)
    
        const cake = new FluentCake()
        cake.
            setFlavour('chocolate').
            setLayers(3).
            bake();
        expect(cake).toEqual({ flavour: "chocolate", layers: 3, })
    
  • 相关阅读:
    实现反转函数,即反转一个Null结尾的字符串
    给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串
    IDL 常用字符串处理函数
    IDL创建进度条
    python中f'{}'用法
    Win10 pycharm中显示PyTorch tensorboard图
    torch.cat()和torch.stack()
    运筹学笔记6初始可行基
    运筹学笔记5单纯形法
    运筹学笔记4线性规划问题的几何特征
  • 原文地址:https://www.cnblogs.com/cuishengli/p/15399558.html
Copyright © 2020-2023  润新知