面向对象编程的六大原则(1)--单一职责原则

gongbj 2019-05-15 20:18:00 阅读数:20 评论数:0 收藏数:0

什么是单一职责

  单一职责原则(Single responsibility principle,简称SRP),顾名思义,是指一个类或者一个模块应该有且只有一个职责,它是面向对象编程六大原则之一。

单一职责的粒度

  单一职责的粒度,可以是某个方法、某个类、某个程序包甚至某个功能、某个模块(甚至某个系统),每一个层次上都可以进行单一职责设计。下面来举个例子说明一下:

  模块级别:某购物平台,包含如下几个模块:用户模块、商品模块、订单模块、库存模块、运输模块、支付模块,每一个模块都已本身的职责:用户模块负责用户相关的功能,商品模块负责商品的管理等等;

  功能级别:在模块内部,比如用户模块,根据用户相关职责划分,又划分为用户管理、注册、登录等不同的功能,他们的职责也都是各不相同的;

  程序包级别:在用户管理中,又可以根据层次不同划分为持久化层、业务逻辑层、UI层,其中每一层基本上就是一个程序包,持久化层负责数据持久化相关(和数据库打交道,数据的CRUD(增删改查)),业务逻辑层负责用户管理相关的业务逻辑(比如修改密码),UI层负责用户界面交互;

  类级别:在持久化层内部,又可以根据职责不同划分为:数据库连接类(负责数据库连接的构造)、持久化类(负责数据的CRUD操作)、数据缓存类(负责数据缓存的处理)等;

  方法级别:在持久化类中,又可以划分为查询数据方法(负责查询数据)、检索数据方法(负责检索数据)、新增数据方法(负责插入数据)、 删除数据方法(负责删除数据)、修改数据方法(负责修改数据)。有些复杂场景,甚至建议增删改查每一个逻辑都放到不同的类中;

  方法级别二:在查询数据方法中,又可以根据查询的逻辑步骤划分为不同的二级方法:解析查询条件方法、构造Sql方法、执行Sql方法、构造返回实体方法;每个方法可以借着这个思路再往下细化;

单一职责的优点

  1. 增强功能的稳定性
    单一职责能够增强功能稳定性、健壮性,适应程序的变化,避免修改一段逻辑时,对其他逻辑造成影响。例如:一个类或者一个方法,承担了多个职责:职责A、职责B、职责C...职责N。如果在维护过程中,修改之职责A对应的逻辑,就很有可能对职责B、C等其他职责逻辑造成影响,最终不利于功能的稳定性。
  2. 提升复用能力
    使用单一职责,有一某一个类或者方法都是对应的它本身的唯一职责,已经是实现某个职责的最小粒度,所以它可以提供给任何需要该职责地方调用,从而提升了复用能力。
  3. 降低程序复杂度
    由于单一职责原则是根据职责来设计,每一个类或者方法只实现某一特定的逻辑,粒度划分的合适的话,每一个类基本上只有几行、至多几十行代码,程序复杂度会被大大降低;
  4. 提升可读性
    每一个程序包、类、方法职责明确后,我们在阅读代码时,我们可以通过方法名就能知道某个方法是干什么的(可以不用知道具体的细节),它内部用到的方法是干什么的,有助于我们在某一层次上思考代码逻辑是否正确、完整,而不用受某一具体细节逻辑的影响。

 具体实践

  在用户管理持久化层,如果要适配不同类型的数据库(比如要支持SqlServer、Oracle、MySql等),不同类型的数据库,其语法结构都有一些差异,比如插入数据方法,插入sql的语法是不同的。我们可能按照如下代码实现:

  以下是用户信息的结构:

 

    public class UserInfo
    {
        public string ID { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
    }

 

  以下是用户持久化的新增数据方法:

  

    public class UserDac
    {
        Database GetDatabase()
        {
            /*获取Database连接的逻辑*/
        }

        //新增用户
        public void AddUser(UserInfo userInfo)
        {
            Database db = GetDatabase();
            string insertSql = string.Empty;
            switch (db.DbType)
            {
                case DBType.SqlServer:
                    insertSql = "Sql A";
                    break;
                case DBType.Oracle:
                    insertSql = "Sql B";
                    break;
                default:
                    throw new NotSupportedException("DBType");
            }
            db.ExecuteSql(insertSql); 
        }
    }

  在上面的例子中,我们看似应该是一个比较简单并且合理的结构。但是假如有以下需求场景:

    1、我的业务中添加了新的字段,需要修改 InsertSql(在Sql中添加新字段部分);

    2、我需要添加一种新的数据库类型支持(假如需要支持开源的MySql),新的数据库类型中,Sql语法也是不相同的;

  两个场景都需要修改以上的代码,这说明上面这段代码承担了两个职责,违背了单一职责原则。

  从上面的方法中,我们可以看到 ,上面方法承担了两个职责:拼接插入Sql;适配不同的数据库类型。我们可以按照如下方式进行修改(修改中用到了设计模式中的策略模式)。

   用户信息的结构不变:

 

    public class UserInfo
    {
        public string ID { get; set; } public string Code { get; set; } public string Name { get; set; } }

   第一步:我们添加一个获取Sql的策略,如下结构:

    public interface IUserSqlStrategy
    {
        string GetInsertSql(UserInfo userInfo);
    }

  第二步:我们添加SqlServer的策略实现:

    public class SqlServerUserSqlStrategy : IUserSqlStrategy
    {
        public string GetInsertSql(UserInfo userInfo)
        {
            return "Sql A";
        }
    }

  第三步:相应的,我们添加Oracle、MySql的的实现类:

    public class OracleUserSqlStrategy : IUserSqlStrategy
    {
        public string GetInsertSql(UserInfo userInfo)
        {
            return "Sql B";
        }
    }

    public class MySqlUserSqlStrategy : IUserSqlStrategy
    {
        public string GetInsertSql(UserInfo userInfo)
        {
            return "Sql C";
        }
    }

  第四步,我们添加策略工厂,来根据不同的数据库类型获取不同的策略实现:

    public class UserSqlStrategyFactory
    {
        public static IUserSqlStrategy GetUserSqlStragety(DBType dbType)
        {
            switch (dbType)
            {
                case DBType.SqlServer:
                    return new SqlServerUserSqlStrategy();
                case  DBType.Oracle:
                    return new OracleUserSqlStrategy();
                case DBType.MySql:
                    return new MySqlUserSqlStrategy();
                default:
                    throw new NotSupportedException("DBType");
            }
        }
    }

  最后,执行插入逻辑中,调用策略工厂获取策略,然后根据相应的策略获取不同的Sql实现:

    public class UserDac
    {
        Database GetDatabase()
        {
            /*获取Database连接的逻辑*/
        }

        //新增用户
        public void AddUser(UserInfo userInfo)
        {
            Database db = GetDatabase();
            var strategy = UserSqlStrategyFactory.GetUserSqlStragety(db.DbType);
            string insertSql = strategy.GetInsertSql(userInfo);
            db.ExecuteSql(insertSql); 
        }
    }

  以上是所有的代码实现,通过策略模式,将不同数据库类型的实现拆分到不同的策略实现类中,这样拼接插入Sql逻辑与适配不同数据库逻辑两个职责拆分开来。

 总结

  通过单一职责原则,将程序实现拆分到不同的类(或者方法)中,这样,以后的变化都只影响要修改的主责,而不会影响到其他职责,最终达到提升稳定性的目的。


版权声明:本文为[gongbj]原创文章
转载请带上:http://copyfuture.com/blogs-details/b727ec722a5ea070d82c2f9574541b97
或:https://www.cnblogs.com/silencer/p/10812466.html


  1. 人和人,靠缘分;心和心,靠真诚
  2. 游戏bug还是官方默认?一键进入日服,竟发现这么多的福利!
  3. 在Airtest中如何使用无线模式控制手机
  4. 刘亦菲被玩坏了?他们几个也难逃此劫!
  5. 单源最短路径算法——Bellman-ford算法和Dijkstra算法
  6. 香港银行开户过程需要注意些什么
  7. 微服务:如何优雅的使用Mybatis
  8. 汽车质量被投诉排行榜出炉,前10名中合资品牌占9个
  9. 六大设计原则(三)DIP依赖倒置原则
  10. Google Doodle向日本发明家Seiichi Miyake致敬
  11. Vue 基础篇
  12. 为什么有的夫妻会有“夫妻相”,夫妻相从何而来,原因就“三点”
  13. 底部盘整三年之久,刚刚月线反转,被忽视的医疗设备翻倍股
  14. 大白话5分钟带你走进人工智能-第二节概率基础及高斯分布
  15. 欧盟第一强国:应该搞一款“欧洲航母”!问:内陆国该不该掏钱?
  16. 旅途骗术大起底
  17. 物理学家终于揭开β衰变谜题!
  18. 科普| 90条旅行冷知识,第一条就中枪!
  19. 只要799,华为路由新品搞定你家中WiFi信号差的问题
  20. 汉大司马大将军——卫青
  21. 一套UI与后台并重的.net通用权限开发框架
  22. FMDB 使用注意点
  23. 餐饮行业正在经历大的变革,你知道吗?
  24. 特斯拉股价的我靠时刻
  25. Python基础面试,看这篇文章画重点吧,Python面试题No1
  26. 围城倒下后的马竞,剩下来的还有什么?
  27. 怎样创建“情绪清单”来缓解拖延症
  28. 3.19股市要闻:突发,又1家公司遭证监会调查,4股拟10送5以上
  29. Js面试题(三)--js点击弹出对应序号
  30. 阿莱格里:我们在合适的比赛中输球 早说过不能每场赢
  31. 为什么说日军是战术上的高手,也是战略上的傻子?
  32. 全球前五的两大速运巨头联手,会给快递行业竞争格局带来哪些变化
  33. 太阳系边缘有一股神秘的力量,将旅行者一号拉回,它会是什么?
  34. v-if与v-show的使用
  35. 微软收购开源初创公司CitusData 强化云业务对抗亚马逊
  36. 华为4G路由器2评测B311As-853
  37. 女人不管是奔几,美都在骨不在皮,如何根据骨骼类型来穿衣
  38. 人民海军70年,这些主要标志你都知道吗?
  39. CentOS命令行与shell操作(linux系管与运维二)
  40. 营收大增147%,出海巨头触宝的APP集团军是怎么炼成的?
  41. Scala语言笔记 - 第二篇
  42. 苏大强保姆来头不小,石天冬跟班意外走红,都挺好不愧为宝藏剧组
  43. “没人带孩子”怎么办?国办出台指导意见
  44. 如何写出一篇好博客
  45. 为什么软件公司宁愿花15k招一个应届生,也不愿给老程序员加5K工资
  46. 报告:英国脱欧影响不小 但欧洲金融业已准备就绪
  47. 比特币冲破7500美金,是牛市前兆,还是昙花一现?
  48. 年纪大了,是否该往管理方向转型?
  49. LOL-LCK:尺帝杀疯了!GEN爆冷打破GRF不败金身
  50. Python turtle绘图实例分析
  51. 历史科普——1900年美国对中国领土的觊觎
  52. .NET高级代码审计(第一课)XmlSerializer反序列化漏洞
  53. 未来决定你人生高度的,是你的学习力
  54. django-文件上传Media url的配置
  55. 美媒评出火箭队历史最佳阵容,太强!太完美!
  56. 常规赛MVP继续在队中 新疆男篮3外援备战季后赛
  57. 梁实秋:人生不过如此而已
  58. 曝尤文决定今夏不去美国!担心C罗因"性侵案"被拘留
  59. 谷歌开发者工具实用小技巧
  60. 38岁柳岩近照曝光,网友懵了:看半天没认出
  61. 地球自转了45亿年的时间,那么地球自转的动能来自于哪里?
  62. 仗义豪气的“摇滚老炮”臧天朔, 他的朋友圈究竟有多强大?
  63. .Net 4.0 延迟初始化:Lazy
  64. 朗读者“精选”85句语录!
  65. 注解的详细入门
  66. 杭州首家A股上市独角兽,每日互动开盘涨幅高达43.12%
  67. 第二章 3. 同态与同构,直积群
  68. 福布斯全球亿万富豪榜出炉:宣布离婚的他仍是首富!
  69. 生育对女性的事业究竟造成多大影响?
  70. KVM网络模式设置
  71. 北方多地将迎今年首轮高温天 局地最高温或破37℃
  72. 于谦:人生就是玩儿着过
  73. 楼市熄火之后,大规模的资金正加速流向这一未来潜力行业!
  74. 专访英特尔无人机负责人:未来五年内将会出现飞行汽车
  75. 2018爆款假货!你身边有多少?!
  76. 建图教育:一建“泄题”还是被“神押题”掀开传说中的一建铂金书
  77. 教育成网易裁员重灾区 但丁磊发力教育的雄心未改变
  78. 9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】
  79. Effective Java 第三版——57. 最小化局部变量的作用域
  80. 欧战奇葩!1.8亿欧劲旅完爆俄超豪门,西甲保级队冲击欧联杯冠军
  81. 又挖出了个日本绝美县城,一直到5月都有花海大片,国内3h直飞
  82. 去美国游玩需要注意这些事项 我们一起来看看
  83. 成为人群中最亮的星,你“配”吗?
  84. 深入理解.sync修饰符
  85. 迪丽热巴已成立自己的工作室,看到名字后,网友:杨幂没白疼你
  86. 初探奥尔良(Orleans)
  87. PJzhang:计算机本地密码提取工具LaZagne
  88. 死磕 java并发包之LongAdder源码分析
  89. [JLOI2016] 成绩比较
  90. Django uwsgi Nginx 的生产环境部署
  91. 中国自主研发太阳能无人机 可连续飞行数月 理论上可“无限”续航
  92. RNG遭RW爆冷!无忌天秀VN笑了!UZI前后表情真实!记得:不敢相信
  93. 你曾后悔过吗?
  94. 大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Core 实例练习
  95. 为什么分分钟被爆头?APEX英雄4大骚操作解读
  96. 人生的路,还得自己走,你不努力,谁帮你也没有用
  97. Web存储及文件拖拽
  98. LOL:再见!熊猫TV正式宣布关闭服务器
  99. 深度|挺过创新困境:微软正经历“纳德拉复兴”
  100. 提起菲律宾就知道菲佣?你知道菲律宾船员去年带回家多少钱吗?

  1. Python开发:部分第三方库无法在线安装解决方法(949)
  2. [Swift]LeetCode325. 最大子数组之和为k $ Maximum Size Subarray Sum Equals k(779)
  3. Matlab 2019a 安装包下载以及安装和激活(719)
  4. 仅限Edge和Chrome访问 全新网页端Skype应用上线(686)
  5. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点(684)
  6. C#读取excel文件提示未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序(663)
  7. 【预警通告】Weblogic反序列化远程代码执行漏洞(640)
  8. Visual Studio 2019 正式发布,重磅更新,支持live share(599)
  9. 【预警通告】Apache Tomcat远程代码执行漏洞CVE-2019-0232(573)
  10. 网上赌博平台维护审核提不了款怎么办?(535)
  11. React 与 React-Native 使用同一个 meteor 后台(529)
  12. Sublime Text3 最新版3207 安装及破解(458)
  13. Visual Studio 2019 正式发布(389)
  14. [翻译] Visual Studio 2019: 极速编码. 智能工作. 创造未来.(388)
  15. 刘强东身边的CXO还有谁“幸存”(373)
  16. 舍命生子产妇吴梦丈夫怒斥:没抢肺源不是精神分裂,网友断章取义(371)
  17. Confluence SSRF及远程代码执行漏洞处置手册(370)
  18. 机器学习 ML.NET 发布 1.0 RC(369)
  19. 阿里巴巴2018年纳税516亿元 同比增40%(369)
  20. K8s集群安装--最新版 Kubernetes 1.14.1(338)
  21. 雷军清华演讲实录:小米9年的创新、变革与未来(333)
  22. 小米手机卖不动了?(327)
  23. F#周报2019年第14期(317)
  24. 积分一样却选手下败将出战国际赛,《最强大脑》云队选手被坑了?(300)
  25. 《最强大脑》要垮?桑洁魏坤琳出轨细节被扒,戚薇才是神助攻(257)
  26. 华电教授孙玉兵被指与昔日同学共同学术造假,多所高校调查(251)
  27. F#周报2019年第15期(249)
  28. 日本明仁天皇退位,日本“平成”年代结束(246)
  29. linux系统安装cdcfordb2udb(241)
  30. Oracle甲骨文大规模裁员,你背离时代就会被淘汰(240)
  31. 他联系叙恐怖分子“卖军火”,称能搞到2000枚导弹,关键时刻中国警察出手(237)
  32. 魔兽世界:8.15搏击俱乐部坐骑获取流程 鳄鱼布鲁斯坐骑(236)
  33. 针对django2.2报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: ill....(235)
  34. 女友被曝插足许志安郑秀文婚姻 知情人透露马国明已下定决心分手(232)
  35. SQL简介及MySQL的安装目录详解(229)
  36. 为什么国内汽车用沥青阻尼片,而欧洲主机厂却用树脂?(229)
  37. 视觉中国深夜道歉:全面配合监管部门彻底积极整改(228)
  38. 谁是苏小明饭局爆粗偷拍者?知情人称另有其人(224)
  39. 迪玛希好惨!昨晚《歌手》为声入人心男团帮帮唱,却再被指控侵权(223)
  40. NodeJs之邮件(email)发送(222)
  41. 市值暴跌90%,世界零售巨头申请破产战胜了所有对手却输时代(221)
  42. 函数防抖,与函数节流(220)
  43. 机器学习基石笔记:01 The Learning Problem(217)
  44. 深度学习python的配置(Windows)(215)
  45. [深度应用]·实战掌握Dlib人脸识别开发教程(213)
  46. 许志安出轨视频系蓄谋偷拍?司机被曝收40万装红外摄像头(210)
  47. Google AI 系统 DeepMind 高中数学考试不及格(210)
  48. 干货!21部漫威电影观影顺序指南,在《复联4》之前赶紧补齐!(209)
  49. 赌命生子九个月后,吴梦离世:前半辈子任性了,我用生命买单(206)
  50. 威廉王子出轨凯特王妃闺蜜? 外媒称婚外情致兄弟反目(203)
  51. spring-cloud-sleuth+zipkin源码探究(203)
  52. WebGL three.js学习笔记 纹理贴图模拟太阳系运转(201)
  53. 新更新kb4493472导致无法正常开机(195)
  54. 杜敬谦死因疑曝光!或因他这一特殊的训练方式,泳迷高呼孙杨退役(191)
  55. AntDesign Form表单字段校验的三种方式(189)
  56. 韦杰落网,金诚集团终局(188)
  57. 华为推出方舟编译器 称可提升安卓系统效率(186)
  58. 山东庆云民企3000亩土地被贱卖 国企接盘拟转性(185)
  59. 《权力的游戏》龙妈有那么多爱她的人,为什么最终会选择琼恩雪诺(182)
  60. 张无忌为什么爱上她?陈钰琪版赵敏终于给答案了(181)
  61. “国防”靠美国? 韩国瑜=马英九2.0? 走着瞧(180)
  62. Python破解Wifi密码思路(180)
  63. 直认与老公感情淡了!27岁TVB上位女星:我们不是好熟(179)
  64. CUBA Studio 8.0 发布,企业级应用开发平台(179)
  65. 张丹峰出轨最新锤来了!毕滢的朋友圈简直刷新下限啊!(177)
  66. 拿着普通员工超300倍的工资裁员800人,这家游戏公司CEO引发员工不满|一周新闻(177)
  67. Github 上 Star 最多的个人 Spring Boot 开源学习项目(177)
  68. 币安称 4000 万美元比特币被盗(175)
  69. 使用 C 语言实现一个 HTTP GET 连接(175)
  70. AntD框架的upload组件上传图片时遇到的一些坑(175)
  71. 不要996!程序员创建955.WLB不加班公司名单,GitHub周榜第二(174)
  72. Codejam Qualification Round 2019(174)
  73. 《跃迁-成为高手的技术》之联机学习(173)
  74. Weblogic CVE-2019-2647等相关XXE漏洞分析(173)
  75. python爬虫重定向次数过多问题(172)
  76. simulink创建简单模型(172)
  77. 强大的jQGrid的傻瓜式使用方法。以及一些注意事项,备有相应的引入文件。(170)
  78. [NewLife.XCode]高级查询(168)
  79. Algolia使用教程 , 超详细傻子看都会(166)
  80. Delphi 开发微信公众平台 (二) 用户管理(165)
  81. 核心算法缺位,人工智能发展面临“卡脖子”窘境(165)
  82. 只需知道电话号码 即可监控任意一部手机,获取位置,太可怕(163)
  83. 范斯晶对祖母的称呼很意外,范志毅很心疼,缺少母爱的孩子不容易(162)
  84. 如何定位前端线上问题(如何排查前端生产问题)(162)
  85. 告诉你去越南芽庄必带回的好东西(161)
  86. 双双出轨!许志安劈腿马国明港姐女友,二人被拍16分钟激吻超20次(160)
  87. 数学家发现完美的乘法(160)
  88. 定义工作,解读自我——IT帮2019年2月线下活动回顾(160)
  89. 百度网盘下载神器 PanDownload v2.0.9(破解版、不限速)(159)
  90. 高管被警方带走背后:巧达科技操盘2亿人简历生意(159)
  91. 吹爆惠英红,《铁探》这位霸道总警司超带感!真乃港剧罕见大女主(156)
  92. vue生成图片验证码(156)
  93. 三国正史第一猛将:一人单挑数千人,不是吕布也不是关羽(154)
  94. 从0到1上线一个微信小程序(154)
  95. FreeSql 如何现实 Sqlite 跨库查询(154)
  96. 向佐的弟弟叫向佑,网友:那郭碧婷生的孩子叫什么?(153)
  97. [Node.js] 3、搭建hexo博客(153)
  98. spring-boot-2.0.3不一样系列之源码篇 - pageHelper分页,绝对有值得你看的地方(153)
  99. TensorFlow从1到2(十)带注意力机制的神经网络机器翻译(152)
  100. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的(152)

  1. MySQL 事务
  2. [Inside HotSpot] Serial垃圾回收器 (二) Minor GC
  3. 老婆举报医生老公“收药品回扣”:他出轨并要求离婚 官方已介入调查
  4. 实验吧简单的sql注入3
  5. 死磕 java同步系列之自己动手写一个锁Lock
  6. [NOI2006] 网络收费
  7. 线性基的小证明...
  8. 从语言设计的角度探究Java中hashCode()和equals()的关系
  9. C# 多线程小试牛刀
  10. Python基础:输入与输出(I/O)
  11. link-1-STL 标准模板库
  12. mysql--浅谈多表查询1
  13. 进击JavaScript核心 --- (1)基本数据类型
  14. 大数据技术之_24_电影推荐系统项目_07_工具环境搭建(具体实操)
  15. 前端限制显示的文本字数的几种方法——不换行与换行
  16. 【实验吧】该题不简单——writeup
  17. 反向传播算法
  18. =、==、===、equals()的区别
  19. GitHub 推出开发者赞助项目
  20. 剑指Offer的学习笔记(C#篇)-- 从上往下打印二叉树
  21. argparse 在深度学习中的应用
  22. 张云雷复出?西城区文旅局:德云社在辖区内演出未发现违法违规问题
  23. Maven安装与配置
  24. acWing 825. 排队购物
  25. ajax&&jquery
  26. 苏联攻击机的悲壮行动,明知德军战机拦截,仍在无护航状态下出击
  27. 华为的5G技术,源于这种数学方法
  28. 一站式自动化测试平台 http://www.Autotestplat.com
  29. RabbitMQ总结
  30. 第九组 通信3班 063 自反ACL
  31. 短线还有最后一跌?大V们表示:反弹近了!(5月23日)
  32. 第九组 通信3班 063 OSPFv2与OSPFv3综合实验
  33. C# IE选项 - 重置IE
  34. Spring_数据校验和自定义检验规则
  35. 谈谈Java的string为什么是不可变的
  36. OFFICE 365 A1 Plus账号注册
  37. 初学python—做一个数组的增删改查操作
  38. oc工程中oc、swift混编代码打包成静态framework踩坑笔记
  39. 阿里云推“智能秒停系统”:50秒内短信通知 再不怕吃罚单
  40. 今天购买了一个云服务器
  41. 神奇!乌鸦竟然会传达悲观和怀疑情绪 还会对同伴“冷嘲热讽”
  42. 数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例
  43. 点击事件的坐标计算(client || offset) +(X || Width || Left) 各种排列组合别绕晕
  44. windows下dubbo-admin2.6.x之后版本的安装
  45. linux 之基本命令学习总结
  46. 传祺难续“传奇”?销量暴跌超4成 加价卖车被“断裂门”尽毁
  47. 香港豪门后宫持续曝光:他用选美比赛“选妃”,与几万女星交往
  48. 小窥React360——用React创建360全景VR体验
  49. Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
  50. .Net Core下使用RabbitMQ比较完备的两种方案(虽然代码有点惨淡,不过我会完善)
  51. “80后”女博士已任团中央书记处书记
  52. 杨元庆:现在是联想的最好时刻 我们四大战役全部打了胜仗
  53. Java开发环境的搭建(JDK和Eclipse的安装)
  54. oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词
  55. 机构风向标:外资出逃超500亿 美的集团等白马股表现欠佳
  56. 跟踪记录ABAP对外部系统的RFC通信
  57. c++11多线程详解(一)
  58. 小蓝杯,跌破发行价了
  59. [NewLife.XCode]百亿级性能
  60. 33岁何洁商场走穴被曝光,路人镜头下的她与精修图差别好大
  61. 途牛第一季度净亏损2240万美元 同比亏损幅度扩大
  62. 00 | Two Sum
  63. 智能威胁分析之图数据构建
  64. 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
  65. Neo4j 第六篇:Cypher语法
  66. Java微信公众平台开发(三)--接收消息的分类及实体的创建
  67. Java8 中的 Optional
  68. 如何显示超大图像(3)
  69. 贵州检察机关依法对袁仁国决定逮捕
  70. 有关xerospolit运行报错问题的有效解决方案
  71. ADO学途 one day
  72. Linux 中 ip netns 命令
  73. Python爬虫之设置selenium webdriver等待
  74. BSOJ1040 -- 【练习题目】美元DOLLARS
  75. 外媒:稀土是中国手中的一张王牌
  76. sql server添加sa用户和密码
  77. 深入理解JVM的类加载
  78. querySelector和getElementById之间的区别
  79. 简说设计模式——观察者模式
  80. 扰动函数和拉链法模拟HashMap的存储结构
  81. 东芝中国:“上海东芝公司”不存在 未停止与华为的合作
  82. 彭于晏马思纯主演张爱玲这部小说,却被说更适合演《骆驼祥子》?
  83. 停止向华为供货?东芝辟谣回应
  84. 云米第一季度净利润5310万元 同比增长68%
  85. 贪吃的古蛙,古生物学家发现亿年前两栖动物之间战争
  86. APICloud发布低代码开发平台 效率提升30%至60%
  87. Golang 读写锁RWMutex 互斥锁Mutex 源码详解
  88. shell初级-----数据呈现方式
  89. 白玉兰入围名单公布!《知否》《都挺好》上榜,还有这部豆瓣3分剧
  90. 深网 | 京东618接入快手、抖音 实现“即看即买”
  91. 解决 APP启动白屏黑屏问题
  92. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群
  93. 浏览器与服务器通信技术——jsonp
  94. 【刷题笔记】LeetCode 606. Construct String from Binary Tree
  95. 央行副行长刘国强:应对汇率波动经验丰富,政策工具储备充足
  96. 部署Azure Log Analytics
  97. 计算机基础--http的基础整理和巩固
  98. 章子怡:女人四十,不止表面风光
  99. 直击|对话杨元庆:希望今年创最好盈利 要震慑住谣言
  100. 微软通过合作为美国270万农村退伍军人提供高速宽带服务