JS面向对象的七大基本原则(单一/开闭)

单一原则

类的设计只为完成某一类任务;类中方法只为完成某一个任务;模块的设计只为完成某一个功能;这些体现的都是单一原则。

如下展示

import {model} from 'mongoose';
const User = model('User');
export default class UserModel {
    static newUser(data) {
        return new User(data);
    }
    
    static saveUser (document) {
        return document.save();
    }
   
    static otherNewUser(data) {
        return model.create(data);
    }
    

}

 

在使用mongoose时,为创建一个document,模块实现了3个方法new Model();  document.save(); Model.create(),。

其中Model.create()就是先 new Model(), 然后调用 save()写入数据库;直接使用create虽然简化了一点开发工作,但是在以后开发过程中的复用性却远远不及前两个方法;原因就是create方法失去了单一原则。

开闭原则

构思基类时,确保基类的属性/行为能够描述所有实例(包括子类实例)的一致特征,不为某单一实例修改属性/行为;实例之间的区别通过子类扩展,避免实例间互相影响。一句话描述就是 对修改关闭,对扩展开放。

如下展示

class Person {
    constructor () {
        this.name = '';
        /* 其它一些通用属性: age,sex,。。。。 */
    }
     /* 其它一些通用行为: getAge,setSex,。。。。 */
    setName (name) {
        this.name = name;
    }

    getName () {
        return this.name;
    }
}

class Adult extends Person {
    constructor () {
        super();
        this.career = '';//成年人特有的属性:职业
    }

    setCareer (career) {
        this.career = career
    }

    getCareer () {
        return this.career;
    }
}

class Child extends Person {
    constructor () {
        super();
        this.kindergaten;//小朋友特有的属性:幼儿园
    }

    setKdg (kdg) {
        this.kindergaten = kdg;
    }

    getKdg () {
        return this.kindergaten;
    }
}

上述两个子类 Adult/Child 都是对Person的扩展,各自扩展出自己独特的属性和行为,而不去为了某一独特需求更改基类。

 

posted on 2019-02-25 13:35  panda_peter  阅读(310)  评论(0编辑  收藏  举报