`

单一项原则

阅读更多

单一项原则(单因素原则)真的很有用,特别是用于找出问题的根源.

上周改一个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 

1
0
分享到:
评论

相关推荐

    c++ 面向对象设计五大原则

    面向对象设计的主要任务就是类的设计,不少面向对象(OO)的先驱和前辈已经提出了很多关于类的设计原则,用于指导OOP,其中就包括类设计的五项基本原则。 1.单一职责原则(Single Resposibility Principle,SRP) ...

    24种设计模式C#版

    1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责. 2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:继承与派生的规则.(子类可替换父类) 3、依赖倒转原则【DEPENDENCE INVERSION ...

    IOS设计模式

    1、 IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle) 定义  就一个类而言,应该仅有一个引起它变化的原因。 定义解读  这是六大原则中最简单的一种,通俗点说,就是不存在多个...

    SOLID:SOLID原则通过错误和良好代码示例进行解释

    SOLID设计原则该存储库包含面向对象编程的五项SOLID设计原理的示例。 这些示例是用Java编写的。 每个示例都有一个“好”和“坏”版本,分别用来证明遵守和违反该原则。 单一责任原则开/关原则里斯科夫替代原则接口...

    设计模式六大原则

    解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。说到单一职责原则,...

    java简易版开心农场源码-Design-Patterns:「设计模式」

    4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。 接口隔离原则 1)客户端不应该依赖它不需要的接口,即一...

    餐厅营业查看系统Java源码-solid-principles-and-tdd:我在重构阶段应用SOLID原则的用例集合。重构是使用TDD完成

    这违反了单一职责原则,因为它做得太多了。 理论上的解释是,改变一个班级的原因只有一个。 这意味着我们应该从小处着手。 每个复杂的问题都不能轻易地作为一个整体来解决。 将问题分解为更小的子

    java简易版开心农场源码-Design-Patterns:23种设计模式

    4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。 接口隔离原则 1)客户端不应该依赖它不需要的接口,即一...

    java版五子棋源码-java_design_pattern:图解Java设计模式

    java版五子棋源码 ...单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则 迪米特法则 合成复用原则 1.1.单一职责原则 1.1.1.基本介绍 一个类只应负责一项职责。 1.1.2.应用实例 package ...

    is219project

    JavaScript中的单一责任原则处理模块的内聚性。 它指出函数和类只能有一项工作。 以与src / Operations的Difference为例,如下所示: function Difference ( a , b ) { return a - b ; } 这是一个用于减法的...

    bidder:采用“外部依赖”和“单一责任”原理的实时投标人应用程序,由“外向内TDD”开发

    技术规格依赖倒置原则单一责任原则不变的对象外入内TDD安装本指南假定安装了Java 8的计算机。 如果未安装Java 8,请访问并确保已安装Java 8,然后再继续。 外部依赖关系通过gradle包装器进行管理。 因此,要编译项目...

    java版五子棋源码-DesignPattern:设计模式

    1.单一职责原则 对类来说,一个类应该只负责一项职责。如果一个类负责多项职责,可分解多个类来完成。 2.接口隔离原则 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上。分解成多个...

    飞扬的小鸟java源码解析-java-thoughts:Java大杂烩

    面向对象设计模式有五项原则和一条规则。SOLID原则和DP规则。 (在对象设计模式中存在的是大原则和一个法则。SOLID原则和DP法则。) SRP(单一职责原则) (单一职责) OCP(Open Close Principle):启用热插拔,提高...

    workshop-solid

    单一责任原则(SRP) 一个班级只有一个改变的理由。 班级应负一项责任。 如果在描述您的课程时使用“和”一词,则可能不遵循该原则。 开闭原则(OCP) 软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以...

    SOLID_101:SOLID_101是一个研究项目,旨在使用五种SOLID原理实现几何形状及其属性

    [S]:单一责任原则“一个类应该只负责一个职责,也就是说,只有对软件规范的一部分进行更改才能影响该类的规范。” [O]:开闭原理“软件实体应该开放以进行扩展,而封闭以进行修改。” [L]:李斯科夫替代原则...

    fileupload需要的jar包.zip

    在最简单的情况下,你可以调用单一的方法去解析这个 Servlet Request,然后处理选项列表,并应用到你的应用程序。另一方面,你可能决定自定义FileUpload,实现对选项列表中个别项完全控制。例如:你可以将内容注入到...

    Spring-core-study

    SRP单一责任原则 “一个班级应该只负一个责任。” 客户对象仅负责执行它。 DIP依赖关系逆转原理 “程序员应该依靠抽象的弧线,而不是具体的弧线。 依赖注入是遵循此原理的一种方法。” 示例代码) AppConfig创建...

    shared-react-components-example:共享React组件库的单一存储库的示例!

    :warning: 该存储库只是一个纯粹的示例,而不是样板(因为我们已经有一段时间没有更新其依赖项了) :magnifying_glass_tilted_left: 在这里,您会发现: 重要学习! 0。 :exclamation_question_mark: 您应该开发...

Global site tag (gtag.js) - Google Analytics