单一项原则

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

上周改一个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共同作用的结果.

之前不知道在哪里(知乎?)看过一篇文章说的好像是关于"最强大脑"(吕飞龙用声音吹破玻璃杯)的,说这个人可以通过口吹气把玻璃杯吹破 ,表演时第一次没有成功,他要求再试一次,并且提出用自己的手拿着玻璃杯.有一个教授站出来不同意他用手接触玻璃杯,解释说如果他用手接触玻璃杯的话,就会对结果有干扰.

到底是吹破的,还是捏破的呢?

因为有两个因素,所以不确定是哪个在起作用.所以这是不符合单一项原则的.但是现场的嘉宾竟然同意了吕飞龙的(扯淡的)要求,唉,真理经常站在少数人一边.那个正直的教授竟然被人骂....

总结:我们在思考问题的时候,也要充分利用单一项原则,这样我们的思路就会豁然开朗,也更容易抓住主要(关键)因素.

 

posted @ 2015-05-24 22:24  黄威  阅读(227)  评论(0编辑  收藏  举报