使用变量的一般事项

数据认知

轻松掌握变量的定义

事实上,这是个简单的任务,可能大部分人觉得它过于简单,并不需要单独来讲这个。
然而,创建变量的确占去了你很多时间。
因此养成一个良好的习惯会为你再整个项目周期内省去很多时间和麻烦。
隐式声明
定义:在使用一个未声明变量的时候,编译器会自动为你声明该变量(取决于你的编译器设置)。
隐式变量声明对于任何一种语言来说都是最具危险的特性之一。
*在项目中,当你绞尽脑汁想要明白变量`acctNo`的值为什么不正确,最终却发现是不慎将`acctNo`
写成`acctNum`,而又将`acctNum`重新初始化为0时,你会有多沮丧。
如果所用的语言不要求对变量预先声明,你就会很容易犯这一类的错误*

如果你使用的编程语言支持隐式声明该怎么办呢?下面给出一些建议。

  1. 关闭隐式声明

  2. 声明全部的变量

  3. 遵循某种命名规则

  4. 检查变量名

变量初始化原则

	不合理地初始化数据是产生变成错误的常见根源之一。
	掌握一些能够避免初始化问题的行之有效的方法能帮助我们节省很多调试时间。
	不恰当的变量初始化所导致的一系列问题都源于变量的默认初始值与你的预期不同。以下行为都会产生此类问题。
	1.  从未对变量赋值。它的值知识程序启动时变量所处内存区域的值。
	2. 变量值已经过期。变量在某个地方曾经被赋值,但该值已经不再有效。
	3. 变量的一部分被赋值,而另一部分没有。

下面给出一些避免产生初始化错误的建议。

  1. 在声明变量的时候初始化
    float studentGrades[MAX_STUDENTS] = {0.0}
    
  2. 在靠近变量第一次使用的位置初始化它
Visual Basic示例:糟糕的初始化



Visual Basic示例:良好的初始化

  1. 理想情况下,在靠近第一次使用变量的位置声明和定义该变量
Java示例:良好的初始化
int accountIndex = 0;
// code using accountIndex
...
double total = 0.0;
// code using total
...
boolean done = false;
//code using done
while (!done) {
...
}

  1. 在可能的情况下使用final或者const

  2. 特被注意计数器和累加器

  3. 在类的构造函数里初始化该类的数据成员

  4. 检查是否需要重新初始化

  5. 一次性初始化具名常量,用可执行代码来初始化变量

  6. 使用编译器设置来自动初始化所有变量

  7. 利用编译器的警告信息

  8. 检查输入参数的合法性

作用域

定义:指的是变量在程序内的可见和可引用的范围。一个作用域很小的变量只能在程序的很小范围可见,一个作用域大的变量则在程序的很多地方都是可见的。

使变量引用局部化

一般来说,把对一个变量的引用局部化,即把引用点尽可能集中在一起总是一个很好的做法。衡量一个变量的不同引用点的靠近程度的一种方法是计算该变量的跨度。

尽可能缩短变量的存活时间

与变量跨度相关的 一个概念是“存活时间”,即一个变量存在期间所跨越的语句总数。变量的存活时间开始于它的第一条语句,结束于引用它的最后一条语句。

测量变量的生存时间
减小作用域的一般原则
  1. 在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始初始化这些变量
  2. 直到变量即将被使用时在为其赋值
  3. 把相关语句放到一起
  4. 把相关语句组提取成单独的子程序
  5. 开始时采用最严格的可见性,然后根据需要再扩展变量的作用域

持续性

持续性是对一项数据的生命期的另一种描述。它具有多种形态:

  1. 特定代码段或子程序的生命期。
  2. 只要你允许,它就会持续下去。
  3. 程序的生命期。
  4. 永远持续。

为了避免上述问题,可以采取以下措施

  1. 在程序中加入调试代码或者断言来检查哪些关键变量的合理取值
  2. 准备抛弃变量时给他们赋上
  3. 编写代码时
  4. 养成在使用所有数据之前生命和初始化

绑定时间

把变量和它的值绑定在一起的时间;这一绑定是发生在编写代码的时候还是在编译程序时?是在程序加载的时候还是运行的时候?仰或其他时间

在这里插入图片描述
总结:

  1. 编码时(使用神秘数值)
  2. 编译时(使用具名常量)
  3. 加载时(从Windows注册表、Java属性文件等外部数据源中读取数据)
  4. 对象实例化时(例如在每次窗体创建的时候读取数据)
  5. 即时(例如在每次窗体重绘的时候读取数据)

采用越晚的绑定时间会越有利。通常而言,你把绑定时间定义得越晚,你的代码里就包含了越多的灵活性。

数据类型和控制结构之间的关系

数据类型和控制结构之间以一种定义明确的方式相互结合,下面将介绍数据和控制流之间的常规关系做一个概要性的分析。

在这里插入图片描述

序列型数据翻译为程序中的顺序语句

在这里插入图片描述

选择性数据翻译为程序中的分支语句

在这里插入图片描述

迭代型数据翻译成程序中的循环结构

在这里插入图片描述

为变量指定单一用途

通过使用一些巧妙的方法,可以给一个变量赋予多种职责。不过最好不要这样使用,应该尽量保持变量单一用途,也就是一个变量只干一件事。

下面用代码给出一些事例

C++示例:同一变量用于两种用途-------糟糕的实践

// Compute roots of a quadratic equation.
//This code assumes that (b*b-4ac) is positive
temp = Sqrt(b*b -4*a*c);
root[0] = (-b + temp) / (2 * a);
root[1] = (-b - temp) / (2 * a);
....
// swap the roots
temp = root[0];
root[0] = root[1];
root[1] = temp;

改进后的代码

C++示例:两个变量用于两种用途-------良好的实践

// Compute roots of a quadratic equation.
//This code assumes that (b*b-4ac) is positive
discriminant = Sqrt(b*b -4*a*c);
root[0] = (-b + temp) / (2 * a);
root[1] = (-b - temp) / (2 * a);
....
// swap the roots
oldRoot = root[0];
root[0] = root[1];
root[1] = oldRoot;

避免让代码具有隐含含义:把同一变量用于多个用途的另外一种方式是当变量代表不同事物时让其具有不同的取值集合。

  1. 变量pageCount的取值可能表示已打印纸张的数量,除非它等于-1,在这种情况下表明有错误发生;
  2. 变量customerId可能代表某个客户账号,除非它的取值大于500000,在这种情况下,你通过减去500000来得到过期账户的号码;
  3. 变量bytesWritten可能表示写入输出文件的字节数,除非它的取值为负,在这种情况下它表示的是用于输出的磁盘驱动器的号码。

最后,确保使用了所有已声明的变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值