|
查看: 1700|回复: 19
|
关于global variable 和local variable..
[复制链接]
|
|
|
发表于 5-11-2007 09:39 PM
|
显示全部楼层
时常有人说global variable 是evil的,因为他让你的function不能独立。。
但我觉的要看情形。 用的适合的话也无妨。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 5-11-2007 09:42 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 6-11-2007 11:07 AM
|
显示全部楼层
举例:
Global Variable 定义在整个应用系统 Application 都可以读取的,比如 系统使用者编号,使用者名,菜单项目选项,输入表颜色,其他系统的设定等等。
gcUserID = 99
gcUserName = "System Administrator"
gcMenuOption1 = .T.
gcFormAForeColor = "0,0,0/255,255,255"
gcFormABackColor = "0,0,0/128,128,128"
Local variable 多用于函数内,例如以下两个函数都用到 RadiusX。
Function SinX( DegreeX )
Local RadiusX
RadiusX = DegreeX / 360
Return Sin( RadiusX )
Function CosinX( DegreeX )
Local RadiusX
RadiusX = DegreeX / 360
Return Cosin( RadiusX )
虽然以上两者函数都同样有应用 RadiusX,但函数内的变数却各不受影响。
[ 本帖最后由 白日梦 于 6-11-2007 11:08 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 6-11-2007 06:15 PM
|
显示全部楼层
如果你用太多 global var, 你的function, 以后就很难reuse..
试想看,如果sin(x)有用global var,当你或其它programmer用sin(x)的时候,突然杀出个 variable undefined... 是不是很奇怪?
function 都应该behave 像个independent component, 丢Input as parameters, 然后有output, 它的内建怎样跑用的人不需知道。。 所以少用global var
用global var 比较适合用在app specific 的routine. |
|
|
|
|
|
|
|
|
|
|
发表于 6-11-2007 09:21 PM
|
显示全部楼层
global variable在multi-threading application里会把你给毁了,因为multi-threaded的app很难debug.
你有个global variable 叫 X, 你哪一个thread曾经动过这个X,还有在用这个X的时机对还是不对等都会叫人头痛.
我可以不用就不用. |
|
|
|
|
|
|
|
|
|
|
发表于 7-11-2007 09:35 AM
|
显示全部楼层
小章鱼一般都不用 Global Vars ,因为现在都要 OO 的吧。
感觉 OO 最好就是 class 里的 Vars 全由 class 自己修改,需要给外部修改的就用 get set 或 method
所以也用不上 Global 了。
小章鱼是用递归法,只是比较麻烦。
所以懒惰的时候就用 Global 了 |
|
|
|
|
|
|
|
|
|
|
发表于 7-11-2007 01:02 PM
|
显示全部楼层
原帖由 sson 于 7-11-2007 09:35 AM 发表 
小章鱼一般都不用 Global Vars ,因为现在都要 OO 的吧。
感觉 OO 最好就是 class 里的 Vars 全由 class 自己修改,需要给外部修改的就用 get set 或 method
所以也用不上 Global 了。
小章鱼是用递归法, ... 我虽然也是有用(PHP)OO 但是有时候还是逼着用 GLOBAL VAR 。。。。 还是章鱼大哥厉害啊。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 12-11-2007 03:33 PM
|
显示全部楼层
原帖由 vampcheah 于 7-11-2007 01:02 PM 发表 
我虽然也是有用(PHP)OO 但是有时候还是逼着用 GLOBAL VAR 。。。。 还是章鱼大哥厉害啊。。。
不敢当……
小章鱼鲜少做网页程式,不过感觉网页程式应该不可能不用 Global Vars ,因为网页程式不像一般程式只有一个 Entry Point |
|
|
|
|
|
|
|
|
|
|
发表于 12-11-2007 09:18 PM
|
显示全部楼层
原帖由 sson 于 7-11-2007 09:35 AM 发表 
小章鱼一般都不用 Global Vars ,因为现在都要 OO 的吧。
感觉 OO 最好就是 class 里的 Vars 全由 class 自己修改,需要给外部修改的就用 get set 或 method
所以也用不上 Global 了。
小章鱼是用递归法, ...
虾米素递归法? |
|
|
|
|
|
|
|
|
|
|
发表于 20-11-2007 06:11 PM
|
显示全部楼层
其實我認爲global variable 與 local variable都各有所長,都各有它們存在的必要。
雖然OO強調encapsulation,自然有它的好處。但是如果全盤用OO,那麽會很tedious。
比如一個共同的資源(Common resource),如:某塊記憶体、文檔指針、系統當前的狀態、系統的錯誤訊息、一些全局的綫程(Thread/Task) 等等,這些得用global variable不可。
不然進入某個物件(object)時就的浪費一些變量/程碼來帶入。
比如:
class CSystemStatus
{
public:
int mode;
int errorcode;
....
};
CSystemStatus MASTER, PCA, PCB, PCC;
如果說MASTER是全局的系統狀態,但是一旦在某処要使用PCA,PCB或PCC時,就得把MASTER的質料拷貝進去。變成
PCA.mode=MASTER.mode;
PCA.errorcode=MASTER.errorcode;
當然可以編一個 =operator 將它簡化。但是在效率(efficiency)方面而言,就沒那麽好了。
要用global,local或encapsulated,就看個人編程的習慣,喜好與經驗了。
[ 本帖最后由 Sunyata 于 20-11-2007 06:31 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 20-11-2007 06:18 PM
|
显示全部楼层
也可以用pointer to a struct 带入。。
此struct 可能有一系列的 pointer to 你要的resources, 例如,hdc,fp, 等等。。 |
|
|
|
|
|
|
|
|
|
|
发表于 20-11-2007 06:43 PM
|
显示全部楼层
原帖由 tensaix2j 于 20-11-2007 06:18 PM 发表 
也可以用pointer to a struct 带入。。
此struct 可能有一系列的 pointer to 你要的resources, 例如,hdc,fp, 等等。。
使用指針(pointer)是一個方法,但前提就是,那早已有一個global的存在了。
一個程序始終得還須要有global的存在。
global variable使我們容易與方便的帶到別的module去。 |
|
|
|
|
|
|
|
|
|
|
发表于 20-11-2007 08:11 PM
|
显示全部楼层
我尽量不用global , 就算是整个程序要用到的变量, 把它encapsulate 在singleton class 里, 防止被有问题的代码覆盖了原本的值。
除了定值 constant , 个人觉得不要用全局变量(global variable) , 因为在现在的PC 都朝向多核心/微机 (multi-core/processor) 发展, 全局变量(global variable) 将是一个除错大灾难。 |
|
|
|
|
|
|
|
|
|
|
发表于 20-11-2007 08:56 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 21-11-2007 12:31 AM
|
显示全部楼层
其實singleton class或者global variable對電腦而言都是一樣的,都是memory而已。
singleton class也只是把global variable歸類去一個class,是使人們容易閲讀代碼。
但它始終還是一种global variable。
在C/C++/assembly語言裏,除了#define,EQU外,任何memory都能夠直接或間接的(間接是指有bug的pointer)被更改的。singleton,protected, private,static,constant 也不例外,因爲它們只是對compiler有用而已,但對那些已經正在運行的程序,是完全沒有保障的,尤其是有臭蟲(bug)的程序。
如果有一個永不變的定值,我個人不會使用變量(variable)或constant,通常會用#define。
現代新的編程語言越來越Object Oriented了。不是我那C語言的年代了,感覺越來越複雜化。不像C與匯編語言(assembly)了,注重效率與速度。這也與越來越先進的電腦技術/速度,儲存量息息相關。
我個人認爲,電腦程序越簡單越好。其實只要去到machine level,embeded,system,越複雜越人性化(user friendly,high level),電腦的負擔就越大,消耗也越大,效率與速度相對的也會降低了。
[ 本帖最后由 Sunyata 于 21-11-2007 12:54 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 21-11-2007 12:36 AM
|
显示全部楼层
原帖由 神仙祖宗 于 20-11-2007 08:56 PM 发表 
请问,俺用static class,与singleton比较有什么好处坏处?尤其是在在multi-threading application里?
另外,俺理解的global variable就相等于global constant,就只在程序初始化时赋予值,使用过程中并 ...
static class?你應該是應用java或C#吧?
如果在C/C++,是定值的話,我會使用#define。
因爲不論global variable或global constant都是浪費memory的(對我而言 )。
在多綫程程序裏(multi-threading) ,不是memory,class,object或language的問題,
重要的是你對你使用語言的駕駛程度與系統的認識有多純熟,還有你編程的技巧與功夫。
[ 本帖最后由 Sunyata 于 21-11-2007 01:07 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 21-11-2007 11:35 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 24-11-2007 05:46 PM
|
显示全部楼层
突然想到一个必须用global的例子
就是比如说,我要在这个msgHandler 里,去 access 某某instance,但我又不能把它pass 进来。。。。
LRESULT CALLBACK msgHandler(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
...
case WM_LBUTTONUP:
fireBullet(bullet_index++ % MAXBULLET);
//printf("%d %d \n ", player->width, player->height);
break;
...
...
default :
return DefWindowProc(hwnd,msg,wp,lp);
}
[[i] 本帖最后由 tensaix2j 于 24-11-2007 05:50 PM 编辑 [/i]] |
|
|
|
|
|
|
|
|
|
|
发表于 24-11-2007 08:22 PM
|
显示全部楼层
想提出我对于OOP的global variable的概念。
我认为Global Variable最重要的不是用或不用,或者是否为CONSTANTS, object... 最重要的是为每个GV定义一个Scope,然后用不同的container管理。、
举个例子,我的房子是我的主程序,我就叫它House; 我的房子内有许多书本Book,我要怎样用最快的方法找到我要的书呢?要是我的书本毫无规律地放在房子内,要管理起来真的是很麻烦...
比较好的办法就是建立书架BookShelf还有一个图书管理员BookManager
- BookManager mgr = House.getBookManager(); // 一个House只有一个BookManager,用静态getBookManager()传回。
- List<Book> relatedBooks = mgr.find("Ajax in Action",BookManager.ANDY_BOOKSHELF); // Manager可以管理一个以上的BookShelf
复制代码
在现实情况,
Java内,传回保安管理的方法....
- System.getSecurityManager();
复制代码
SecurityManager是归于System scope,一些关于保安的变量和方法都归于它的管理之下。
所以我认为global variable只是一个概念,即在一个定义的scope内任何object都可以access的静态或衡量variable。 |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|