Project1

标题: 类变量相比全局变量有什么优点和缺点? [打印本页]

作者: 喵呜喵5    时间: 2013-11-7 17:32
标题: 类变量相比全局变量有什么优点和缺点?
对于类变量的使用目前一知半解所以想问问,相比全局变量,类变量有什么优点?又有什么缺点?啊,使用前必须预先定义那个不算……
作者: 345912390    时间: 2013-11-7 18:00
全局变量一般用来定义一个常量,方便在各个类中引用,也方便修改,不过有要适可而止.在一个工程中不要定义太多,那样会很零乱.
局部变量很少用于定义常量,方便在各个类中即使同名也量不同,便于理解脚本意思.在调用里就显得有点局限性!
作者: 喵呜喵5    时间: 2013-11-7 18:05
345912390 发表于 2013-11-7 18:00
全局变量一般用来定义一个常量,方便在各个类中引用,也方便修改,不过有要适可而止.在一个工程中不 ...

既然如此的话实例变量和全局变量就够用了啊,为什么还需要一个类变量呢?
作者: satgo1546    时间: 2013-11-7 19:26
实例变量是在每一个实例中,而类变量和全局变量差不多,但是作用域不同。类变量作用域较小。
作者: 喵呜喵5    时间: 2013-11-7 20:01
satgo1546 发表于 2013-11-7 19:26
实例变量是在每一个实例中,而类变量和全局变量差不多,但是作用域不同。类变量作用域较小。 ...

既然如此的话为什么要使用类变量呢?既然全局变量和类变量差不多的话……
作者: 魔潘安    时间: 2013-11-7 23:40
本帖最后由 魔潘安 于 2013-11-7 23:41 编辑

【全局變量】在任何地方可以呼叫的到
雖然權限很大,但也要謹慎使用
因為變量名稱不可以相同
有可能你的程式碼有這個名稱
我的程式碼也剛好有這個名稱
那麼我們的程式碼就會起衝突
故全局變量越少,衝突的機會越小

【類別變量】只有該類別可以呼叫(而且僅有一個!?)
該類別不管實作幾次
每個實體都共用這個類別變量

【實例變量】是每當類別被實作的時候就會賦予實體一個
每個實體都有一個相同名稱的該變量
但是分開儲存的
不會互相影響

【區域變量】則是在該區域中才能存活
生命週期很短
用來暫時性帶入某些值去運算
可以有效簡潔程式碼

每種變量都有它的特性
當然只用全局和區域變量也可以寫出程式碼
只是把適合的變量放在適合的位置會更好
這點等到你寫的熟練了就會自然體悟

以上是個人見解...
有錯的話,還請海涵...
作者: 喵呜喵5    时间: 2013-11-8 00:01
魔潘安 发表于 2013-11-7 23:40
【全局變量】在任何地方可以呼叫的到
雖然權限很大,但也要謹慎使用
因為變量名稱不可以相同

那么相比全局变量类变量有什么优势吗?
你的说明中说全局变量的缺点是名称不能重复
相同的类的类变量名称可以相同么?
作者: 魔潘安    时间: 2013-11-8 00:45
全局變量的優勢在於任何地方都可以呼叫的到
同樣的也是他的缺點「唯一性」
整個程式架構中就只能有這麼一個名稱
不然他不知道你想要呼叫誰

而類別變量顧名思義就是指在該類別生存
這個類別中可以有一個叫做「喵呜喵5」的變量
另一個類別中也可以有一個叫「喵呜喵5」的變量

作者: 喵呜喵5    时间: 2013-11-8 01:48
@魔潘安
就是说类变量的唯一优势就是没那么容易重复咯?
那么类变量完全没有意义啊,全局变量遵循一定原则命名的话同样基本不会发生重复的情况,比如 $喵呜喵5_当天的日期_变量名 这样……
作者: 魔潘安    时间: 2013-11-8 02:59
本帖最后由 魔潘安 于 2013-11-8 03:02 编辑

嗯~~你要這麼說也是可以的~~
但變數命名通常還是以清楚扼要的描述會比較好
這樣別人看你的程式碼便能一看就懂
(當然我知道你只是舉例)

我一開始是學 Java 語言的
在 Java 中沒有像 Ruby 一樣有這麼方便的全局變量可以使用
所以有些東西是必須仰賴類別變量的

至於 Ruby 我懂得沒有你多 (我還借用了你的某些腳本呢!!)
所以我也不知道怎麼比較出兩者個使用時機
(我沒寫過甚麼大型的程式碼,所以經驗沒那麼豐富)
只知道規則要越嚴謹越好

哈~很抱歉沒解決你的疑惑~
讓我們等待其他高手來為我們解答吧!!


PS. 屍體未命名 很棒的解謎遊戲!!
作者: 亿万星辰    时间: 2013-11-8 07:41
类变量的用途,比如统计这个类当前存活有多少个对象之类怪怪的功能~
作者: 熊喵酱    时间: 2013-11-8 08:44
本帖最后由 76213585 于 2013-11-7 19:44 编辑

可能是空間的差別?
全局變量的話要記住很久
類變量的話會清除

@喵呜喵5
我沒記錯的話是在此class結束時
像是:
RUBY 代码复制
  1. class Panda
  2.   def intialize(string)
  3.      @string = string
  4.      p @string
  5.   end
  6. end#這裡會清掉@string

作者: 喵呜喵5    时间: 2013-11-8 12:08
76213585 发表于 2013-11-8 08:44
可能是空間的差別?
全局變量的話要記住很久
類變量的話會清除

@@string 何时会清除?
作者: 无脑之人    时间: 2013-11-8 12:30
本帖最后由 无脑之人 于 2013-11-8 12:31 编辑

根据在下的理解,全局变量是整个程序都可能使用,而且不方便通过方法传递的变量,他和常量是有本质区别的【常量理论上是不应该修改的】
比如$game_player储存了几乎所有的玩家位置信息,可以在任何需要判定位置的地方使用
不过滥用全局变量是非常不好的行为,对于这个不想多说
而类变量的适用范围相对小一些,他可以在类里面以及所有类的实例里面使用,也就是说,她是类与实例之间沟通的桥梁,最常用的应该是拿类变量来做默认值
@Shadow
举例:
  1. class Font
  2.   @@shadow=true
  3.   def shadow=(shadow) ; @shadow=shadow ; end
  4.   def shadow ; @shadow ||= @@shadow ; end
  5.   def self.default_shadow=(shadow) ; @@shadow=shadow ; end
  6.   def self.default_shadow ; @@shadow ; end
  7. end
复制代码
这样就实现了控制阴影的默认值的效果【当然VA如何实现的我不清楚,XP我是这么写的反正
值得注意的是,类变量必须定义了初始值才可以使用,见上例   
作者: 熊喵酱    时间: 2013-11-8 12:45
本帖最后由 76213585 于 2013-11-7 21:53 编辑
喵呜喵5 发表于 2013-11-7 21:08
@@string 何时会清除?


class結束在class對應的end
像是
  1. class Panda
  2. end
复制代码
中的end就是class的結束
  1. class Panda
  2.   def initialize(string)
  3.      @string = string
  4.      p @string
  5.   end
  6. end
复制代码
的話
def跟第一個end就是判定成一起
而剩下的end就是class結束時  也就是清理的時候

然後做實驗的話就是
  1. class Panda
  2.   def initialize(string)
  3.      @string = string
  4.      p @string
  5.   end
  6. end
  7. p @string
复制代码
就是在class後再試試看是否為nil  是或不是代表什麼乃應該知道


@喵呜喵5  
(我只是個渣.......)
不過我試了一下  的確兩個都是會在class結束後清掉
作者: 喵呜喵5    时间: 2013-11-8 12:46
无脑之人 发表于 2013-11-8 12:30
根据在下的理解,全局变量是整个程序都可能使用,而且不方便通过方法传递的变量,他和常量是有本质区别的【 ...

滥用全局变量的缺点是什么呢?类变量使用要赋值调用不方便,如果全局变量的缺点仅仅是重复性比较高的话那么类变量根本就没什么优点了啊……
作者: 喵呜喵5    时间: 2013-11-8 12:58
76213585 发表于 2013-11-8 12:45
class結束在class對應的end
像是中的end就是class的結束的話
def跟第一個end就是判定成一起

请问一下实验方式?
作者: 熊喵酱    时间: 2013-11-8 13:03
喵呜喵5 发表于 2013-11-7 21:58
请问一下实验方式?
  1. class Panda
  2.   def initialize(string)
  3.      @string = string
  4.      p @string
  5.   end
  6. end
  7. Panda.new("Panda!!!")
  8. p @string
复制代码
以及
  1. class Panda
  2.   def initialize(string)
  3.      @@string = string
  4.      p @@string
  5.   end
  6. end
  7. Panda.new("Panda!!!")
  8. p @@string
复制代码

作者: 喵呜喵5    时间: 2013-11-8 13:19
76213585 发表于 2013-11-8 13:03
以及

class Panda
@@var = 0
def initialize
p @@var += 1
end
end
@a = Panda.new
@b = Panda.new
作者: deeg    时间: 2013-11-8 16:38
本帖最后由 deeg 于 2013-11-8 16:55 编辑

雖然我不是很懂程式語,但是希望這篇能對喵大有所幫助

函數的副作用
http://zh.wikipedia.org/wiki/%E5 ... F%E4%BD%9C%E7%94%A8

類變數
http://baike.baidu.com/view/2893749.htm

Ruby中全局变量,实例变量,局部变量,类变量,Symbol对比
http://blog.csdn.net/kunshan_shenbin/article/details/7271899
作者: 晴兰    时间: 2013-11-9 04:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 无脑之人    时间: 2013-11-9 12:34
反正尽量少用全局变量【不要问为什么
类变量用处本来就不大,我反正是除了默认值之外没用过它【一个默认值就一个全局变量的话不嫌蛋疼?
子类和模块共享类变量这个涨姿势了,回去看看有什么应用
作者: 余烬之中    时间: 2013-11-9 12:50
本帖最后由 余烬之中 于 2013-11-9 13:07 编辑

类方法可以访问类变量,不可以访问实例变量

类变量提供类的各实例之间的数据共享,同时对外隐藏

个人见解
——————————
就像C++里的静态成员 @喵呜喵5




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1