坚守一个目标---科里定律

原创 2013年12月05日 14:07:33
在“Outliving the Great Variable Shortage”(应对变量短缺)一文中,Tim Ottinger提到了“科里定律”(Curly’s Law):

一个变量应该代表一样东西,并且只能代表一样东西。它不应该在一种情况下代表这个意思,而在另一种情况下又代表不同的意思。它不能一次代表两样东西。它不能既是地板蜡,又是甜点上的打顶。它应该只有一个含义,并且自始至终只有一个含义。

在1991年上映的喜剧《城市乡巴佬》中,伟大的已故演员Jack Palance扮演了一位白发斑斑的牛仔Curly Washburn。科里定律便出自电影里的这一小段对话:

《城市乡巴佬》(CitySlickers)是一部关于人生、牛仔和中年危机的喜剧片。三个面临中年危机的纽约都市人,面对破裂的婚姻、乏味的工作和一成不变的生活,决定暂时抛开烦恼,到大西部加入从墨西哥到科罗拉多的“赶牛队”,体验儿时当牛仔的梦想。结果,三人在“赶牛队”的生活并不如西部电影中那般浪漫刺激,最后他们体验出:“做一个真正成熟的成人,并不是一件容易的事。”——译者注


Curly:你知道人生的秘密是什么吗?

Curly(竖起了一根手指):就是这个。

Mitch:你的手指?

Curly:一个目标。就一个目标。你须坚持这个目标,心无旁骛。

Mitch:但是,这个目标是什么呢?

Curly(笑):这就是你要去寻找的。

科里定律:坚守一个目标。这个定律在现代软件开发的几个核心原则中都有体现:

·       Don’t Repeat Yourself(DRY,即避免重复):如果你有多种方式来表达同一件事情,总有一天,这两种或者三种不同的表达方式会失去同步。即使没出现这种情况,当你需要做点什么改动时,你一定会因为要同时维护它们而感到头痛不已。改动总是会发生的。如果你想让软件保持灵活并易于维护,避免重复是非常重要的。

·       Once And Only Once(OAOO,即唯一一次):每个行为的声明应当发生一次,并且只发生一次。当你重构代码的时候,如果这不是主要的目标,至少也应该是主要目标之一。设计的目标是为了消除重复的行为声明,方法是通过合并或者使用统一的抽象来替代多个相似的实现。

·       Single Point Of Truth(SPOT,即单点真理):重复会造成不一致,并以一种微妙的方式破坏代码,因为在你需要修改所有的重复代码时,你可能只改了其中的一部分。这常常意味着,你没有好好地考虑代码的组织结构。每当你看到有重复代码的时候,你要知道那是一个危险信号。复杂是一种成本,不要加倍付出。

尽管科里定律完全适用于标准化和去除冗余,但“坚守一个目标”与上面的“每件事只做一次”的不同表述比起来,两者之间存在着细微的差别。科里定律更为深入,而Bob Martin将其称为“单一职责原则”(Single Responsibility Principle,简称SRP):

单一职责原则指的是,就一个类而言,应该仅有一个引起它变化的原因。举例来说,看下面的这个类:

Class Employee

{

             Public MoneycalculatePay()

             Public void save()

             Public StringreportHours()

}

这个类违反了单一职责原则,因为下面3个原因都会引起它的改变:

1.               薪酬的计算规则;

2.               数据库结构;

3.               报告时间的字符串格式。

我们不希望一个类受到3个完全不相干的因素影响。我们不希望每次报告的格式发生改变的时候,或者数据库管理员变更数据库结构的时候,再或者管理人员调整薪酬的计算方法的时候,这个Employee类总是要跟着改变。我们更希望把这些功能分拆到不同的类中,这样的话,他们就可以各自独立地变化。

科里定律告诉我们的是,要为每段代码选择单一而清晰的目标——坚持只做一件事。这一点已经很清楚了。但是,至于选择一个目标,你实际上要排除很多很多你可能做的其他事情。科里定律同时也告诉我们,要有意识地选择你的代码不做什么。这比选择做什么要难得多,因为它与软件开发者与生俱来的全能癖好格格不入。它可能意味着要把代码打散,违反传统的OOP规则,或者引入重复代码——我们的前进方式是“退一步,进两步”。

总之,每一个变量,每一行代码,每一个函数,每一个类,每一个项目都应该坚持一个目标。遗憾的是,我们通常要等到最后结束的时候才会发现那个目标。

每周一本书之《Python大战机器学习:数据科学家的第一个小目标》

数据科学家可谓是当下炙手可热的职业,机器学习则是他们的必备技能。机器学习在大数据分析中居于核心地位,在互联网、金融保险、制造业、零售业、医疗等产业领域发挥了越来越大的作用且日益受到关注。 Pyt...
  • qq646748739
  • qq646748739
  • 2017年04月20日 23:58
  • 3636

一个牛人给java初学者的建议

给初学者之一:浅谈java及应用 学java不知不觉也已经三年了 从不知java为何物到现在一个小小的j2ee项目经理 虽说不上此道高手,大概也算有点斤两了吧 每次上网,泡bbs逛论坛,没少去java...
  • XinTeng2012
  • XinTeng2012
  • 2014年12月25日 11:43
  • 6150

SAP FI中配置“特别总帐标志” SGL

在SAP中,特别总账科目其实就是在做客户或供应商的帐时,如不希望入到统驭科目下,就可以利用特别总账标识(SGL)入到预设的特别总帐下,这时候这笔帐目就跑到相应的特别总账下,查看时和统驭科目相同。特别总...
  • Trassion
  • Trassion
  • 2013年11月11日 08:42
  • 14024

javascript函数科里化

函数科里化(Currying)是指是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。 下面的这个函数就是函数科里化的一个很好...
  • zp1996323
  • zp1996323
  • 2015年09月15日 18:07
  • 390

数学之美系列 二十三 输入一个汉字需要敲多少个键 — 谈谈香农第一定律

今天各种汉字输入法已经很成熟了,随便挑出一种主要的输入法比十几年前最好的输入法都要快、要准。现在抛开具体的输入法,从理论上分析一下,输入汉字到底能有多快。 我们假定常用的汉字在二级国标里面,一共...
  • RFC2008
  • RFC2008
  • 2012年05月02日 12:29
  • 386

数学之美系列 二十三 输入一个汉字需要敲多少个键 — 谈谈香农第一定律

如果我们把汉字组成词,再以词为单位统计信息熵,那么,每个汉字的平均信息熵将会减少。这样,平均输入一个字可以少敲零点几次键盘。不考虑词的上下文相关 性,以词为单位统计,汉字的信息熵大约是8 比特作用,也...
  • u010555682
  • u010555682
  • 2014年07月15日 14:58
  • 460

js科里化和反科里化总结

科里化,它用于创建已经设置好了一个或多个参数的函数。函数科里化的基本方法和函数绑定是一样的:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回的函数还需要设置一些传入的参数。 what?...
  • xiongzhengxiang
  • xiongzhengxiang
  • 2012年12月30日 09:01
  • 1378

一个非常好的目标规划课件

  • 2010年04月11日 23:50
  • 313KB
  • 下载

一个最简单的木马源代码和生成的目标文件

  • 2010年04月29日 22:08
  • 29KB
  • 下载

[Android][同一对象不同实例同步操作一个目标]

  • 2017年03月18日 16:58
  • 4.05MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:坚守一个目标---科里定律
举报原因:
原因补充:

(最多只允许输入30个字)