《代码大全》三:变量

作用域

    尽可能减小作用域

    把对某一变量的引用集中放置。(研究人员认为把对某一变量的访问放得越近,那么对阅读者精神压力也就越小)

持久性

赋值时间 越是晚给变量赋值,代码的灵活性便越大。

功能单一

使用数据时通常考虑的问题

    一般数据

        是否变量的作用域尽可能的小。

        变量集中使用

        每个变量有且只有一个功能

        每个变量明确好定义

        每个变量都用到了

全局变量

    全局变量在程序中的任何地方都可以进行存取。即使使用全局变量是没有危险的,使用它也绝非最好的编程

方法。

  伴随全局变量的常见问题

    如果不加选择的使用全局变量,或者不使用热门就翻到很不方便,那你可能没有充分意识到信息隐蔽和模块化的好处。

最好尽可能使用子程序和模块。

    对全局数据的疏忽改变。

    全局变量会损害模块性和可管理性。

    全局数据妨碍重新使用新的代码。

怎么样降低全局数据带来的危险

    1)先使所有变量成为局部的,然后再根据需要把其中某一些改为全局。

    2)区分全局和模块。

    3)建立使你一眼即可识别出全局变量的命名约定。(C# 采用微软命名,如 mTestId)

    4) 不要通过庞大的数据放入庞大的变量,同时又到处传递它来掩盖你使用了全局变量的事实。

把什么都放入一个巨大的结构,可能从字面上满足了避免使用全局变量这准则,但这只是表面文章,事实

上这样做,得不到任何真正模块化的好处,如果你使用了全局便利的话,那就分开使用它,不要企图用臃肿

的数据结构来掩盖它。

    5)用存取子程序来代替全局数据

      优点:可以对数据进行集中控制,如果你以后找到了更合适的数据结构,那么不必再每一处涉及到

数据的地方都进行修改,而只修改存取子程序就可以了,修改的影响可以被限制在存取子程序的内部。

       怎样存取子程序:将数据隐含在模块中,编写可以使你访问并修改的子程序,数据所在模块之外的子程序要求存取数据时,

应让它通过存取子程序而不直接存取模块内的数据。比如,假设有一个状态变量你可以通过两个存取子程序GetStatus(),SetStatus()来对

其进行存取操作。

       不要把所有的全局数据都放在一个模块:如果你把所有的全局数据都归成一个大堆,并编写对其存取的子程序,的确可以消除右

全局数据带来的问题,但同时也抛弃了信息隐蔽和抽象数据类型所带来的优点。编写存取子程序之前,应

先考虑一下每一全局数据应属于哪一个模块,然后把这个全局数据,相应的存取子程序和其关联的子程序

放入那个模块。

        把对数据的所有存取保持在同一抽象水平上:如果你用了某一存取子程序对某一数据进行了一项操作,那么

对这一数据的其他操作也应通过存取子程序来实现。比如若是通过存取子程序来从数据结构总读取数值的,那么对该数据结构的

写操作也应通过子程序来实现。

        

    小结:

      使用数据时通常要考虑的一些问题

        I.一般数据

          是否使变量的作用域尽可能的小。

          是否把对变量的使用集中到了一起。

          每个变量是否仅有且只有一个功能。

          每个变量的含义都是明确的嘛,保证每个变量都没有隐含的意义。

          每一个变量都被用到了嘛。

        II.全局变量

          是否在迫不得已的情况下,才使某些变量成为全局的。

          命名约定对全局,模块,局部变量进行了区分。

          是否说明了所有全局变量。(写注释)

          程序中应该不含有伪全局变量(庞大而臃肿的数据结构)

          是否用子程序代替全局数据。

          是否存取子程序和数据组织层模块而不是随意归成一堆的。    

          所有相互有联系的存取子程序,其抽象程度都是一致的。

        尽量减少变量的作用域。

        把对变量的引用集中到一起,应尽量使用变量成为局部或者模块的,避免使用全局变量。

        使每个变量有且仅有一个功能。

        并不是因为全局数据危险才去使用它们,之所以避免用它是因为可以用更好的技术代替它。

        如果全局数据确实不可避免的话,应通过存取子程序来对其进行存取操作。存取子程序不仅具备全局

变量和功能,而且可以提供更多额功能(C# 属性的使用)。

  

        

        

      

        

  

原文地址:https://www.cnblogs.com/u3ddjw/p/9567135.html

时间: 2024-10-16 04:43:04

《代码大全》三:变量的相关文章

从零开始学JavaScript三(变量)

一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义变量时要使用var操作符 如: var message; /*定义一个名为message的变量,该变量可以用来保存任何值,未初始化的变*量会保存一个特殊的值-undefined */ 二.局部变量 可以声明变量里同时初始化 function test(){ var message='hello'; //定义局部message变量,并初始值为hello a

PHP不用第三变量交换2个变量的值的解决方法

以前做过一道php面试题是这样的:不使用第三个变量实现交换两个变量的值.一般都是借助第三个中间变量来实现原来两个变量的值交换,但是这道题却要求不能使用中间变量,这对于初学者来说也算是一个难题了.网上找到的几种方法总结如下: 复制代码 代码如下: //字符串版本 结合使用substr,strlen两个方法实现 $a="a";$b="b";echo '交换前 $a:'.$a.',$b:'.$b.'<br />';$a.=$b;$b=substr($a,0,(

JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, b, c] = [1, 2, 3]; 如果解构不成功,对应的变量就会赋值undefined. let [x, y, ...z] = ['a']; x // "a" y // undefined z // [] 另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组.这种情况

(三)变量和运算符

JAVA基础(三) --变量和运算符 一.数据的类型 Java的基本数据类型有四种: 整数类型.小数(浮点)类型.布尔类型.字符类型. 二.整数类型 当有变量被定义时,就会被分配到内存中去.比如int a=4;内存中就有一块地方,用来存放a的值.那值具体是多大的地方用来存放a呢?这就跟整数的类型有关了. Byte 占一个字节 表示的范围-128~127 即-2^7~2^7-1 Short 占两个字节 表示的范围-32768到32767 即-2^15~2^15-1 Int 占四个字节 表示的范围-

Python(三) 变量与运算符

一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1,   a='1',   a=(1,2),   a={1,2} 三.值类型与引用类型 int  str  tuple(不可改变)   值类型 list  set   dict(可变)   引用类型 id()  显示变量的内存地址 四.列表的可变与元组的不可变 a=(1,2,3,[4,5,8])   a[3][2]=8 a[3][2]='8' 

(三)变量和常量

常量 JS中的常量类型主要包括字符串常量,数值常量,布尔常量,null和undefined等. 变量 JS变量的命名必须以字母或下划线开始.后可跟下划线或者数字,但不能使用特殊符号. JS变量的作用域有全局和局部之分,变量同名时,局部作用域优先于全局作用域. 加深数据类型的理解

不用第三变量交换数值

最近碰到一个面试题是关于变量替换,a= 2,b=5,替换之后b=2,a=5;当时觉得应该是利用编译器的临时变量来搞定,其实不然,结果就是我没做出来,尤其人家的标题写的"初级",瞬间觉的自己能力不行啊. 回来之后才想起来这个是C语言时候交过的: 1 int a = 2,b=5; 2 a = b + a; 3 b = a - b; 4 a = a - b; 是不是很简单呢,郁闷,当时怎么没想到呢,这几天邪门的很啊. 如果只是上面的那也就不说了,主要是想总结下这种满足交互原则的方法,貌似只要

C#之不借助第三变量交换两变量值

源码: int n1=10, n2=20; n1 = n1 - n2;   // -10 n2 = n1 + n2;  //  10 n1 = n2 - n1;  //   20

201603061528_《Javascript交换两个变量值(不借用第三变量)》

/*================================= @DESC:Exchange two value without third var. @AUTHOR: Not me. @DATE:2016-3-6 15:33 ==================================*/ var a = "Apple"; var b = "Banana"; var a = [b, b = a][0]; alert(a); //Banana

(转)交换两个变量的值,不使用第三个变量的四种法方

通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用.在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法). 上面的算法最大的缺点就是需要借助一个临时变量.那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用