单一项原则(单因素原则)真的很有用,特别是用于找出问题的根源.
上周改一个bug,bug的现象是:
在火狐中,打开界面(当然是公司产品的界面,不便给出地址),点击导航项时,除了打开导航的模块,同时会打开一个空白的页面.
我是怎么解决这个bug的呢?
我找到导航的那段代码,以及相应的事件处理的js,copy到一个简单的html页面中.
如下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="jquery-1.11.1.js"></script> <script type="text/javascript"> $(function(){ if($("#intro").length > 0){ $('#intro').click(function(){ window.open("http://hw1287789687.iteye.com/"); }); } }) </script> </head> <body> <a id="intro" href="javascript:void(0)" target="_blank">功能介绍</a> </body> </html>
首先,我想到的是要在火狐上重现.于是很容易地重现了.
然后我就试图找原因,不断的尝试,因为就这个简单的页面,没有其他因素的干扰,所以很快就找到了原因和解决方法.
注意:以上的bug在chrome中无法重现,必须在火狐中才能重现.
请问,我为什么不深入产品的代码中去找原因呢?
(1)如果使用产品的代码找原因,首先我得让它在我本机运行起来,光搭建环境就很费劲,麻烦!
(2)不便于测试,因为产品的代码很多,功能模块多,比较庞大,刷新一下页面就得两三秒,问题是大部分资源的请求与这个bug一毛钱关系都没有;
(3)干扰因素比较多,不确定是这个模块的问题,还是那个模块抽筋.而我把关键代码抽出来,思路就很清晰了,影响的因素就只有一个了.这就是我要说的单一项原则.
单一项原则,核心思想就是无论在什么情况下,都必须保证只有一个因素在影响,或者说只有一个变量.必须是一次方程,不是二次方程(初中数学里面的).
x+3的结果就只与x有关,如果它的结果增加了10,我们就能够确定是x增加了10,因为它的结果只与x有关系.
x+y+3的结果同时与x,y有关,如果它的结果增加了10,我们无法判断是x的影响还是y的影响,抑或是x,y共同作用的结果.
之前不知道在哪里(知乎?)看过一篇文章说的好像是关于"最强大脑"(吕飞龙用声音吹破玻璃杯)的,说这个人可以通过口吹气把玻璃杯吹破 ,表演时第一次没有成功,他要求再试一次,并且提出用自己的手拿着玻璃杯.有一个教授站出来不同意他用手接触玻璃杯,解释说如果他用手接触玻璃杯的话,就会对结果有干扰.
到底是吹破的,还是捏破的呢?
因为有两个因素,所以不确定是哪个在起作用.所以这是不符合单一项原则的.但是现场的嘉宾竟然同意了吕飞龙的(扯淡的)要求,唉,真理经常站在少数人一边.那个正直的教授竟然被人骂....
总结:我们在思考问题的时候,也要充分利用单一项原则,这样我们的思路就会豁然开朗,也更容易抓住主要(关键)因素.
参考:http://hw1287789687.iteye.com/blog/2310000
相关推荐
面向对象设计的主要任务就是类的设计,不少面向对象(OO)的先驱和前辈已经提出了很多关于类的设计原则,用于指导OOP,其中就包括类设计的五项基本原则。 1.单一职责原则(Single Resposibility Principle,SRP) ...
1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责. 2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:继承与派生的规则.(子类可替换父类) 3、依赖倒转原则【DEPENDENCE INVERSION ...
1、 IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle) 定义 就一个类而言,应该仅有一个引起它变化的原因。 定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个...
SOLID设计原则该存储库包含面向对象编程的五项SOLID设计原理的示例。 这些示例是用Java编写的。 每个示例都有一个“好”和“坏”版本,分别用来证明遵守和违反该原则。 单一责任原则开/关原则里斯科夫替代原则接口...
解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。说到单一职责原则,...
4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。 接口隔离原则 1)客户端不应该依赖它不需要的接口,即一...
这违反了单一职责原则,因为它做得太多了。 理论上的解释是,改变一个班级的原因只有一个。 这意味着我们应该从小处着手。 每个复杂的问题都不能轻易地作为一个整体来解决。 将问题分解为更小的子
4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。 接口隔离原则 1)客户端不应该依赖它不需要的接口,即一...
java版五子棋源码 ...单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则 迪米特法则 合成复用原则 1.1.单一职责原则 1.1.1.基本介绍 一个类只应负责一项职责。 1.1.2.应用实例 package ...
JavaScript中的单一责任原则处理模块的内聚性。 它指出函数和类只能有一项工作。 以与src / Operations的Difference为例,如下所示: function Difference ( a , b ) { return a - b ; } 这是一个用于减法的...
技术规格依赖倒置原则单一责任原则不变的对象外入内TDD安装本指南假定安装了Java 8的计算机。 如果未安装Java 8,请访问并确保已安装Java 8,然后再继续。 外部依赖关系通过gradle包装器进行管理。 因此,要编译项目...
1.单一职责原则 对类来说,一个类应该只负责一项职责。如果一个类负责多项职责,可分解多个类来完成。 2.接口隔离原则 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上。分解成多个...
面向对象设计模式有五项原则和一条规则。SOLID原则和DP规则。 (在对象设计模式中存在的是大原则和一个法则。SOLID原则和DP法则。) SRP(单一职责原则) (单一职责) OCP(Open Close Principle):启用热插拔,提高...
单一责任原则(SRP) 一个班级只有一个改变的理由。 班级应负一项责任。 如果在描述您的课程时使用“和”一词,则可能不遵循该原则。 开闭原则(OCP) 软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以...
[S]:单一责任原则“一个类应该只负责一个职责,也就是说,只有对软件规范的一部分进行更改才能影响该类的规范。” [O]:开闭原理“软件实体应该开放以进行扩展,而封闭以进行修改。” [L]:李斯科夫替代原则...
在最简单的情况下,你可以调用单一的方法去解析这个 Servlet Request,然后处理选项列表,并应用到你的应用程序。另一方面,你可能决定自定义FileUpload,实现对选项列表中个别项完全控制。例如:你可以将内容注入到...
SRP单一责任原则 “一个班级应该只负一个责任。” 客户对象仅负责执行它。 DIP依赖关系逆转原理 “程序员应该依靠抽象的弧线,而不是具体的弧线。 依赖注入是遵循此原理的一种方法。” 示例代码) AppConfig创建...
:warning: 该存储库只是一个纯粹的示例,而不是样板(因为我们已经有一段时间没有更新其依赖项了) :magnifying_glass_tilted_left: 在这里,您会发现: 重要学习! 0。 :exclamation_question_mark: 您应该开发...