佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

搜索
查看: 1700|回复: 19

关于global variable 和local variable..

[复制链接]
发表于 5-11-2007 09:07 PM | 显示全部楼层 |阅读模式
比如说global variable在programming里是属于整个application都可以用的
然后local variable是给某些function或者script用的
然后我有很多function是用同样的variable,这样为什么不要把那个Local variable放去global variable呢?
不要放去global的原因和好处是什么?..谢谢

[ 本帖最后由 isaac_yap 于 5-11-2007 09:09 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

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

使用道具 举报

 楼主| 发表于 5-11-2007 09:42 PM | 显示全部楼层
原帖由 tensaix2j 于 5-11-2007 09:39 PM 发表
时常有人说global variable 是evil的,因为他让你的function不能独立。。
但我觉的要看情形。 用的适合的话也无妨。


可以举个例子给我参考吗?
谢谢你
回复

使用道具 举报

发表于 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的时机对还是不对等都会叫人头痛.

我可以不用就不用.
回复

使用道具 举报

Follow Us
发表于 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 。。。。 还是章鱼大哥厉害啊。。。
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
原帖由 jangancari 于 20-11-2007 08:11 PM 发表
我尽量不用global , 就算是整个程序要用到的变量, 把它encapsulate 在singleton class 里, 防止被有问题的代码覆盖了原本的值。

除了定值 constant , 个人觉得不要用全局变量(global variable) , 因为在 ...


请问,俺用static class,与singleton比较有什么好处坏处?尤其是在在multi-threading application里?

另外,俺理解的global variable就相等于global constant,就只在程序初始化时赋予值,使用过程中并不会去改变其值,这和你们所说的“被有问题的代码覆盖了原本的值”有什么相关呢?因为在整个过程中,不会有“global var = xxx”的代码出现啊???

回复

使用道具 举报

发表于 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 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
原帖由 Sunyata 于 21-11-2007 12:36 AM 发表


static class?你應該是應用java或C#吧?
如果在C/C++,是定值的話,我會使用#define。
因爲不論global variable或global constant都是浪費memory的(對我而言 )。
在多綫程程序裏(multi-threading) , ...

不管是不是浪费memory,在你开的那个主程序(form)已经是一个global constant料
回复

使用道具 举报

发表于 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
  1. BookManager mgr = House.getBookManager();  // 一个House只有一个BookManager,用静态getBookManager()传回。
  2. List<Book> relatedBooks = mgr.find("Ajax in Action",BookManager.ANDY_BOOKSHELF); // Manager可以管理一个以上的BookShelf
复制代码

在现实情况,

Java内,传回保安管理的方法....
  1. System.getSecurityManager();
复制代码

SecurityManager是归于System scope,一些关于保安的变量和方法都归于它的管理之下。

所以我认为global variable只是一个概念,即在一个定义的scope内任何object都可以access的静态或衡量variable。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2026 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 12-5-2026 06:38 AM , Processed in 0.071019 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表