单一职责简述

单一职责

前言

谈到单一职责,就肯定会踢到引用了一万次的名言:

A class should have only one reason to change。 一个类应该只有一个原因能引起它变化。

这是什么意思呢,举个例子,男生一般是站着尿尿,所以代码是:

    function Male (name, age) {
        this.name = name;
        this.age = age;
        this.sex = 'male';
    }

    Male.prototype = {
        coustructor: Male,

        //尿尿的行为
        pee: function () {
            console.log('站着尿尿');
        }
    };

女生一般是蹲着尿尿,所以代码是:

    function FeMale (name, age) {
        this.name = name;
        this.age = age;
        this.sex = 'female';
    }

    FeMale.prototype = {
        coustructor: FeMale,

        //尿尿的行为
        pee: function () {
            console.log('蹲着尿尿');
        }
    };

所以结果男生lilei是站着尿尿的,女生hanmeimei是蹲着尿尿的

    var lilei = new Male('lilei', 20);
    //站着尿尿
    lilei.pee();

    var hanmeimei = new FeMale('hanmeimei', 20);

    //蹲着尿尿
    hanmeimei.pee();

这一切是不是看起来好像很完美? 但是lilei虽然是男生,但是他却喜欢蹲着尿尿(或者都喜欢女生行为),这时候lilei的行为就与自己的性别产生了耦合,其实性别与行为分别负责不同的职责

    /**
    *   人类的基类
    *   @param person: 人类的各种属性,包括姓名、年龄、性别等
    *          behavior: 人类的行为
    */
    var Human = function (person, behavior) {
        this.person = person;
        this.behavior = behavior;
    }

    //人的属性
    var Person = function (name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //行为类
    var Behavior = function () {
    }

    Behavior.prototype = {
        courstructor: Behavior,

        //尿尿的行为
        pee: function () {
        }
    };

    //一般男生的行为
    var MaleBehaior = function (){
    }

    MaleBehaior.prototype = Object.create(Behavior.prototype, {
        pee: { 
                writable:true, 
                configurable:true, 
                value: function () {
                    console.log('站着尿尿');
                } 
            }
    });

    //一般女生的行为
    var FeMaleBehaior = function (){
    }

    FeMaleBehaior.prototype = Object.create(Behavior.prototype, {
        pee: { 
                writable:true, 
                configurable:true, 
                value: function () {
                    console.log('蹲着尿尿');
                } 
            }
    });

基本类都构造完毕了,现在看下lilei是怎么实例出来的:

    var lilei = new Human(new Person('lilei', 20, 'male'), new FeMaleBehaior());

    //此时,lilei就是蹲着尿尿的,lilei虽然是男生,但是他喜欢女生的各种行为。
    lilei.behavior.pee();

    var hanleilei = new Human(new Person('lilei', 20, 'female'), new FeMaleBehaior());

    //hanleilei是萌妹子
    hanleilei.behavior.pee();

    var peter = new Human(new Person('lilei', 20, 'female'), new MaleBehaior());

    //perter是纯爷们
    perter.behavior.pee();

此时,职责就分明了,Person负责个人的基本属性,Behaior负责行为,各自直接就完全解耦了。

总结

虽然上面例子解耦了属性与行为,但是如果粗粒度来分析,Male类与Female类其实也符合单一职责原则,Male负责男性个体,Female负责女性个体,并没有违反单一职责原则,所以我们在开发的时候,单一职责原则不能死搬书上的例子,要根据项目的大小与计算以后维护成本来衡量是否要更细粒度的解耦,实现粒度更细的单一职责。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

自己动手写游戏:飞机大战

  要说微信中最火爆的小游戏是哪款,可能既不是精心打造的3D大作,也不是《植物大战僵尸2》,而是微信5.0刚开启时的《飞机大战》。

1271
来自专栏技术分享

.NET应用架构设计—适当使用活动记录模式代替领域模型模式

阅读目录: 1.背景介绍 2.简单介绍领域模型模式、活动记录模式 3.活动记录模式的简单示例及要点 4.总结 1.背景介绍 对软件开发方法论有兴趣的博友应...

1849
来自专栏Charlie's Road

<Solidity学习系列三>安全考量

本文英文版原地址:http://solidity-cn.readthedoc... 因为本人英语能力有限,使用谷歌翻译,本篇好多地方不通顺。有能力的可以直接看英...

884
来自专栏iOSDevLog

ARKit和CoreLocation:第三部分

演示代码 ARKit和CoreLocation:第一部分 ARKit和CoreLocation:第二部分 ARKit和CoreLocation:第三部分

1152
来自专栏阮一峰的网络日志

为什么寄存器比内存快?

计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。 ? 同样都是晶体管存储设备,为什么寄存器比内...

3147
来自专栏携程技术中心

干货 | 基于红黑树的高效IP归属地查询方案

作者简介 邢钦华,携程风控团队高级研发经理。2016年加入携程,是风控大数据平台Chloro的设计和开发的主要参与者。专注于大数据流式处理和用户行为分析在互联网...

3919
来自专栏技术分享

.NET应用架构设计—适当使用活动记录模式代替领域模型模式

对软件开发方法论有兴趣的博友应该发现最近“领域驱动设计”慢慢的被人发现被人实践起来,园子里也慢慢有了DDD的学习气氛和宝贵实战经验的分享。其实之前我也痴迷于DD...

720
来自专栏性能与架构

建立索引后的代价到底有多大?

前几天写的文章“MySQL 性能优化案例:覆盖索引”,介绍了使用覆盖索引优化查询的方式,受到了一个网友的批评 批评的内容为: “直接从索引放回数据很快是个常...

3287
来自专栏云霄雨霁

设计模式----抽象工厂模式

1370
来自专栏月牙寂

Golang分布式并发---群体性热点淘汰算法

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

3339

扫码关注云+社区