单一职责简述

单一职责

前言

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

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

相关文章

来自专栏calmound

匈牙利算法

今天学习了下匈牙利算法,发现这个早在几个月前学过的知识已经忘记的一干二净了,记得当初学习的时候只是看书,看论文,现在要好好的总结下,防止以后再次忘记。 此次总结...

48370
来自专栏企鹅号快讯

C语言到底有多牛!你知道多吗?

有人说C语言是世界上最牛逼的语言,因为操作系统就是用C语言编写的,学好了C才能更好的学习其他编程语言。为此,有人分享了下面一段代码,说是很牛逼的c语言代码,看得...

598100
来自专栏鸿的学习笔记

关于英语,也许你忽视了很多东西

这是葛传椝老先生对英语学习者的教导,通篇用易读的英文短文讲述了英语学习过程中的种种心得,其中“大都是英语语法书和英语修辞学书不曾提到的”,文短而词丰,言简而意赅...

10310
来自专栏编程心路

从王者荣耀看设计模式-策略模式(java版)

曾经我也是一名玩农药的大学生,但现在已经弃了,别问我为什么(被坑爹队友坑的哭。。。)。而今天我们来把让农药变荣耀,我们来从王者荣耀中看设计模式的策略模式。

17450
来自专栏企鹅号快讯

编程为什么入门首选C语言呢

为什么入门首选C语言呢 C语言除了能让我们了编程的大门,也让我们了解到程序的运行原理,和计算机底层是如何交互的,这些底层的知识决定了你的高度,也决定了你的未来的...

47560
来自专栏北京马哥教育

7个案例15分钟让你了解Python套路!

古人云:书山有路勤为径 学海无涯苦作舟 。 注:一般标榜着 “ XX天学会XX”、“ XX 分钟了解XX”的文章都不会是让你增长功力的文章,如本文。 随着互联...

38960
来自专栏技术小黑屋

Java程序员必读的9本书

本文列出的9本书在Java程序员界都是被认为很棒的书。当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java。这个问题也就表明...

15520
来自专栏钱塘大数据

一文总结学习 Python 的 14 张思维导图

大数据时代,数据是智能世界的土壤,发达的数据文明孕育于此之上。但大数据只是一种资源,它告知信息但不解释,只有学会深耕这片土地,真正挖掘到深埋土壤之下的数据金矿,...

49580
来自专栏好好学java的技术栈

从初级程序员到编程大牛,只需要每天坚持做这件事情……

程序员这个行业是很特殊的。之所以说特殊,就是因为它所有的技术大多来自欧美,所以最主流,最新鲜,最正确的技术文章都是英文,遗憾的是,大部分还没有译本。

11220
来自专栏web前端教室

算法--天下武功,唯快不破

我只写JS,为什么也要学习算法? 我入行最开始时是做网页设计的,那是在2003年, 然后一路到了现在,... 所以做为读者的你应该已经明白,我是一个野路子出身的...

22150

扫码关注云+社区

领取腾讯云代金券