单一职责是降低耦合度的指导思想,适用于一个微服务,一个类型,一个方法。

微服务层:

微服务一般按业务的领域来进行拆分:药房微服务就是药房的业务,护士站微服务就是护士站的业务,广义上没有什么问题,但对于一些共用业务,就犯难了,究竟放在那个微服务里?还是合并两个微服务?其实这里就单一,把共用的抽离出来,不一定做成另一个微服务,可以统一做成类库,供两个微服务调用,如果业务有细微差别,可以通过设计模式来灵活解决异构情况。

类型:

这里的类型,一般指复杂类型:如结构体(struct),接口(interface),抽类(abstract class),实例化类(class),记录(record)。这此类型内部,重要的成员有属性,方法,正是这些成员的规划,是决定这些类型是否职责单一的重要指标。

比如下面的用户类型,这样的定义是不没有错误的,对于一些小型项目,这样定义是最经济的。

    /// <summary>/// 用户/// </summary>class User{/// <summary>/// 用户名 /// </summary>public string UserName { get; set; }/// <summary>/// 密码/// </summary>public string Password { get; set; }/// <summary>/// 性名/// </summary>public string Name { get; set; }/// <summary>/// 性别 true男,false为女/// </summary>public bool Sex { get; set; }/// <summary>/// 职务/// </summary>public string Position { get; set; }/// <summary>/// 生日/// </summary>public DateTime Birthday { get; set; }}

如果从单一职责考虑,这个类可以分为三个类,如下:

   /// <summary>/// 用户/// </summary>class User{/// <summary>/// 用户名 /// </summary>public string UserName { get; set; }/// <summary>/// 密码/// </summary>public string Password { get; set; }}/// <summary>/// 人员职务/// </summary>class Position{/// <summary>/// 职务名称/// </summary>public string PositionName { get; set; }}/// <summary>/// 人员/// </summary>class Person{/// <summary>/// 人员编号/// </summary>public string PersonNo { get; set; }/// <summary>/// 性名/// </summary>public string Name { get; set; }/// <summary>/// 性别 true男,false为女/// </summary>public bool Sex { get; set; }/// <summary>/// 年龄/// </summary>public int Age { get; set; }/// <summary>/// 用户/// </summary>public User User { get; set; }/// <summary>/// 职务/// </summary>public Position[] Positions { get; set; }}

分开以后,虽然代码增多了,但每个类的作用就单一了,用户就是用户,人员就是人员,职务分出来当其扩展时其他类型也不受影响。

方法:

越往下层,单一职责的把握越困难,特别是在写一个方法的时候,单一的这个单位很模糊,怎么就算单一?

比如写一个发送数据模块,主要分部分:组织数据,发送数据,也就对应两个方法BuildData,SendData,可能在组织数据时发现,有些数据得作转换,比如时间,类型等,这时可以在BuildData里作转换,当然也可以把转换这部分抽离出来,组成一个TransformData,纠结的是,有时转换数据只要一行代码,如果按单一职责思想应该分离出来,但看到分离的代码觉得差强人意,有没有一个标准呢?

这里我给出我自己的标准(仅代表自己的认识):

1、在纠结一个方法要不要拆开时,第一考虑是业务的单一性

2、有些业务之间当前状态统一的,要联想下一步状态,或下一阶段,这种状态是否持续(不要关心这个状态在现实中什么时间到来)

3、多用一些经典的设计模式来让方法彼此隔离,互不干扰

单一职责在.NET中相关推荐

  1. 设计模式的七大设计原则:其一:单一职责原则

    单一职责原则: 单一职责原则注意事项和细节: 1.降低类的复杂度,一个类只负责一项职责 2.提高类的可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单 ...

  2. 设计模式中遵循的原则:单一职责、开发-封闭、依赖倒转

    设计模式中遵循的原则:单一职责.开放-封闭.依赖倒转 单一职责原则 一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这 ...

  3. 前端中会用到的设计模式之单一职责原则

    1:设计模式应用不应用,取决于对现在和未来判断后的取舍.没必要用尽量不用! 2.设计模式的目的是  减少复杂度(一个函数中包含的功能个数), 降低耦合度(一个对象与其他对象的关系个数).耦合度不能为0 ...

  4. 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~三 分部类是否破坏了单一职责...

    一 DBContext的构造方法,方法的重载 二 DBContext实例中,表实体对象是怎么被加入的 三 分部类是否破坏了单一职责 四 分部方法从另一方面定义了类型的操作规范 五 LINQ实体类中对属 ...

  5. 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...

    2019独角兽企业重金招聘Python工程师标准>>> 单一职责模式: 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成. ...

  6. C# 实例解释面向对象编程中的单一职责原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  7. php 单一职责,读懂 SOLID 的「单一职责」原则

    这是理解SOLID原则中,关于单一职责原则如何帮助我们编写低耦合和高内聚的第二篇文章. 单一职责原则是什么 之前的第一篇文章阐述了依赖倒置原则(DIP)能够使我们编写的代码变得低耦合,同时具有很好的可 ...

  8. 设计模式 之 设计的 六大原则(1)单一职责原则

    由于这些原则性东西 属于概念东西,就不具体以代码描述了.以下是摘自网上和自己的一些理解 首先了解一些 面向对象的特性: 面向对象 有 三大基本特征:封装 ,继承, 多态. 封装: 也就是把客观事物封装 ...

  9. 1.单一职责原则(Single Responsibility Principle)

    1.定义 就一个类而言,应该仅有一个引起它变化的原因. 2.定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作. 3.优点 类的复杂 ...

最新文章

  1. python这个软件学会能做什么工作-万万没想到,学会Python即使不做程序员都能月入过万!...
  2. 玩转NumPy——split()函数使用详解
  3. idea创建文件自定义注释
  4. 17_android下xmlpull解析
  5. 利用原生js做数据管理平台
  6. android过滤数字,android – GPS卫星数量和位置过滤
  7. 用于 Keras 用户使用的 TensorFlow.js layers API
  8. 在HTML5 canvas里用卷积核进行图像处理
  9. siamese改进_[CVPR2019]我对Siamese网络的一点思考(SiamMask)
  10. DWM1000 收发RXLED TXLED控制代码修改
  11. Kinetics-400数据集介绍
  12. Linux系统Ubuntu下部署Tomcat
  13. ESET ESS 激活码
  14. 你知道现在有多少AI开放平台吗?
  15. Linux之CentOS tar压缩与解压命令大全
  16. 八皇后问题(详解带注释)
  17. WeTest全球化服务,为使命召唤手游质量保驾护航
  18. 你所不知的有趣投影方法
  19. 什么是档案级光盘?它的寿命是多少年?
  20. 一千座5G工厂的花苞

热门文章

  1. 利用解构赋值获取后端特定字段数据
  2. segnet 编译与测试
  3. C# winform 窗体接收命令行参数自动登录进行系统,模拟600个WCF客户端的并发压力测试...
  4. [zz]WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
  5. Teams的Incoming Webhook
  6. YouTube键盘快捷键:速查表
  7. 使用Ubuntu的公用文件夹轻松地在计算机之间共享文件
  8. MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排
  9. “数据门”事件频发 如何避免人为因素导致数据泄露?
  10. 8-Python3从入门到实战—基础之数据类型(集合-Sets)