科里定律的变量 ( 一 ) - 缘起,透视严重的变量稀缺问题

yufei       6 年, 3 月 前       1220

也许是缘分,看了一篇文章 关于 Python 装饰器,你应该知道的知识 ,然后从该文章的引用链接一路搜索,找到了这篇关于 「 变量的科里定律 」的帖子

原帖为 Outliving the Great Variable Shortage ,不过已经无法访问了,你可以访问 Google 快照

百度了下,发现没人翻译,然后,算了,我还是自己翻译一下吧

对于 Great Variable Shortage ( GVS ) 我不知道该怎么翻译才觉得合适,索性就用 「严重的变量短缺」 作为翻译吧


代码中最令人讨厌的问题之一是多域变量的问题,令人困惑的可读性和可维护性,令人沮丧的测试编写

多域变量的问题

所谓 「 多域变量 」,就是变量跨越多个作用域,或者变量有多个不同的用途

我想应该是有人忘了告诉我即将到来的严重的变量短缺问题,我看到人们在程序中重复的循环使用某个变量,在不同的时间表示不同的事情,或者包含对象的不同状态

比如,我已经在通常用于包含计数的变量中见证了神奇的负值 ( 有时作为计数不存在的指示器,作用类似于 NULL / nil / None )

对于不存在 null 值的编程语言,我还是可以容忍这种情况的

然而,我看到一些使用了多域变量的代码变得那么的不清晰,我认为这可能是一个比元组疯狂更糟糕的问题

遵循科里定律的变量

我有一个规则,我在 OO ( Object Oriented ,面向对象) 和数据库设计中所坚持的,就是 变量应该有一个单一的合理的域 ( domain ) ,也就是所谓的 「 单一职责 」

域 ( domain ) 可以是作用域,也可以是表达的意思的范围,也可以是值的范围,甚至是全部

它可以是一个标志 ( flag ) 或一个计数器,它可以是一个指示器或一个度量器,或者两者都不是,取决于其它东西的状态

这有点像将 「 科里定律 ( Curly ) 」( 单一责任原则 ) 应用于变量

  • 一个变量应该表述一件事,而且只能表述一件事
  • 它不应该同时表述着两件事
  • 它不应该在不同的环境中表述不同的事情,且不应该在不同的作用域中的不同时间点包含了不同意思的值
  • 它应该意味着一件事,并且应该始终意味着这件事

举个形象点的例子,就是说变量不应该既是筷子,又是米饭,因为这两者互不相干

当然了,我可能会被那些致力于较少内存使用的人争锋相对,但,我不会参与,也不会长时间讨论 内存使用 是否值得

使用 C++ 时,我也是 「 位域 ( bitfields ) 」 的快乐倡导者

我并没有过多地使用各种数据打包方案,虽然我认为将多个值压缩到较小的空间是一个合理的选择

不管怎样,我会认为 多用途变量 是一个坏主意,并会损坏任何代码的可读性

多用途变量应该是非常常见的,其实大家心里都有一个能重复使用就重复使用的本能驱动

我建议,在有限的占用空间的情况下,确实会存在 「严重的变量稀缺 ( Great Variable Shortage (GVS) ) 」问题

如果 ( 存在极大的可能性 ) 作者,也就是程序员 绝对必须 ( MUST ) 动态地重新调整变量,以大量的 class/struct 的使用者 ( 不包括那些编写单元测试的人 ) 永远不必知道这项工作正在完成。这些 class/struct 必须将数据打包和变量重新调整作为一个肮脏的秘密

也许在这里应该做出一两条规则形式的强烈声明:

  1. 一个变量应该有一个单一域 ( SINGLE DOMAIN )
  2. 绝不能重复利用变量 ( NEVER GET CAUGHT repurposing a variable )

我们不必尽可能少使用的变量名称,而是应该学会尽量丰富生活:使用所有你想要的变量

以方便阅读为名,不仅仅考虑在给定时间点的每个变量都有一个目的,更应该在我们编写的整个程序中只有一个使用目的

结束语

其实吧,我再想,平衡变量的使用才是最难的,变量多了也不容易记住,变量少了就会滥用

而要兼顾两者,唯一能做的,应该就是感觉功能把一个大的函数拆成很多小的函数,这样就可以尽情的使用变量了

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.