单一职责简述

单一职责

前言

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

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 条评论
登录 后参与评论

相关文章

来自专栏Android-JessYan

我们为什么要把Dagger2,MVP以及Rxjava引入项目中?

原文地址: http://www.jianshu.com/p/91c2bb8e6369

723
来自专栏数据结构与算法

博弈论进阶之Every-SG

因为两个人都顶尖聪明,因此当一个人知道某一个游戏一定会输的话,它一定会尽力缩短游戏的时间,当它知道某一个游戏一定会赢的话,一定会尽力延长游戏的时间(毕竟都是为了...

39811
来自专栏程序员宝库

比较优雅地编码

命名很重要,随便一本逻辑学教材(如果读者有兴趣,此处推荐《逻辑学导论》)里都会有长篇大论来讨论命名的问题,我国古代在人才辈出的百家争鸣时期曾经出现过一个学派叫“...

1213
来自专栏Java成神之路

WEB前端开发成长指南

小 编注:相比起网页射击狮,操纵代码的前端攻城狮凭着双手在键盘巴拉巴拉敲出的字符,就能赋予二次元的静态页面生命,各种lovely 的~~fabulous的~~e...

733
来自专栏恰同学骚年

[转] Agile Software Development 敏捷软件开发

  敏捷开发是一种软件开发方法,基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作。

722
来自专栏数据结构与算法

P2712 摄像头

题目描述 食品店里有n个摄像头,这种摄像头很笨拙,只能拍摄到固定位置。现有一群胆大妄为的松鼠想要抢劫食品店,为了不让摄像头拍下他们犯罪的证据,他们抢劫前的第一件...

3666
来自专栏数据结构与算法

2924 数独挑战

2924 数独挑战  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Descripti...

2613
来自专栏专知

关关的刷题日记79 – Leetcode 9 Palindrome Number

关关的刷题日记79 – Leetcode 9 Palindrome Number 题目 Determine whether an integer is a pa...

3438
来自专栏张善友的专栏

依赖注入是否值得?

在博客的世界里进行了一场关于使用依赖注入(DI)之优点和缺点的有趣讨论。论题是:依赖注入是否真的值得? 讨论始自Jacob Proffitt,他撰文解释他的观...

1729
来自专栏木宛城主

敏捷团队的规范与准则

1.序言 打造一个金诚所至的敏捷团队,需要大家自发的来遵守以及完善相应的规范。大家在自我约束的前提下,彼此之间互相影响,由下而上推动团队的建设。所以规矩、准则...

2069

扫码关注云+社区