搬砖方法论:Single Responsibility Principle(单一职责原则、SRP原则)

差异的源头

前言:语言本身是一件非常不稳定的表达工具,这也是为什么我们在沟通中需要观察对方的表情、肢体动作、给予的隐喻、提供的图像来进一步确定对方想表达的意思,加之语言的使用者和接收者因文化、职业、经历等不确定因素的影响,又会造成相同的语句表达出不同含义,这让语言的精确性再次下降。

只有这些?

当我们用搜索引擎搜索 SRP原则或单一职责原则关键字,定义中使用频率最多的一句话就是:一个类应该只有一个发生变化的原因。

这不仅让读者陷入思索,其中所描述的原因到底是什么?是否可量化?

以量取胜

为了进一步解释这个"原因",我们对其定义丰富一下:

  • 一个类应该只有一个发生变化的原因。
  • 每一个类都应该对程序功能的一个部分负责,此时它应该封装。该模块、类或函数的所有服务都应该与该职责紧密结合。
  • 将因相同原因而发生变化的事物聚集在一起。分开由于不同原因而改变的事物。

以上的三条定义说的都是一件事:单一职责原则。
这也能看出,这个发生变化的"原因"是基于一个集合。如果每个函数只做一件事是一个机器的零件,那单一职责中的"职责"也就是所说的“原因”就是这些零件组合起来的功能。

确定单一

既然我们已经从概念上统一了职责到底是什么,那么下一步就是从量化的角度确定如何保证职责单一。

分为如下三步

  • 建模
  • 编码对应的类(笔者开始阶段常用伪代码代替)
  • 将对应的类拆分为多个类直到不能拆分

建模:可以理解为对应需求的梳理和拆分,最终抽象(总结)出这个职责核心是做什么的,要依赖于哪些其他的职责。

应用

我们可以举个例子来说明,我们要做一个菜单界面功能,一般我们会这么写

public class MenuPanel
{
    public MenuPanel()
    {
        var menuData = GetMenuData();
        SetMenuDataAndUpdate(menuData);
    }

    public string GetMenuData()
    {
        // do something...
        return default;
    }

    public void SetMenuDataAndUpdate(string temp)
    {
        // do something...
    }
}

在这个MenuPanel类中负责显示Menu这个菜单界面,但是这个MenuPanel真的是仅仅负责显示吗?答案是否定的。

当得到策划需求的时候,可按照【确定单一】里面所说的3步骤进行如下操作

建模

  • 根据数据库的数据显示对应的菜单。
  • 数据方面需要:请求-验证-解析-整合-筛选等操作。相当于上述代码GetMenuData()函数。
  • UI方面需要:接收数据-数据分类填充-适配布局-注册响应事件等操作。相当于上述代码SetMenuDataAndUpdate()函数。
  • 将上面数据与UI进行衔接操作。相当于上述代码MenuPanel()

拆分对应的类直到不能再拆分

  • 数据处理一个类
  • UI显示一个类
  • 数据与UI衔接一个类

经过拆分后的代码

public class ServerData
{
    public string GetNeedData()
    {
        /*
         * 请求 函数
         * 验证 函数
         * 解析 函数
         * 整合 函数
         * 筛选 函数
         */
        return default;
    }

}

public class MenuPanel
{
    private string m_NeedData;
    public MenuPanel(string needData)
    {
        m_NeedData = needData;
    }

    public void UpdateMenu()
    {
        // do something...
    }
}

public class EnterMenuPanelCommand
{
    public void Excute()
    {
        var serverData = new ServerData();
        var needData = serverData.GetNeedData();
        //TODO:正常情况下不应该直接传入基本类型,应该传入对应的自定义类,为了示例简单暂且代替
        var menuPanel = new MenuPanel(needData);
        menuPanel.UpdateMenu();
    }
}

经过一系列的操作我们得到三个职责:数据处理、UI刷新、数据与UI衔接三个职责。这样每一个类当职责变化,即只有一个发生变化原因时,我们才需要更改对应的类。

总结

SRP原则并不是彻底消灭腐朽代码的银弹,它只是降低出现代码坏的味道的几率,提高代码整洁的系数。SRP原则是一个指导性建议,并非强制要求,也切勿生搬硬套。


更多文章详见主页:www.aihailan.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容