2017-07-24 42 views
-1

使用本地或全局變量更好嗎?我們假設談論2000多行android(java)服務類,並且所有服務都在處理'請求'對象和類似的共享對象。如果我將所有東西都放在本地(保留在函數內部),我需要每次都傳遞很多變量,或者多次覆蓋相同的函數。我需要確保對象和子對象不是null。使用本地或全局變量更好嗎

如果我在全局範圍內創建一些變量(整個班級),我可以共享它們,在功能中使用它們。我認爲這會讓一切變得更容易。

在函數內部定義變量或全局定義有什麼好處和壞處。在實踐中,並在理論上(可讀性等)。

有沒有建議的方法?

謝謝。

+2

這是一個容易的。全局幾乎總是一個錯誤,會以意想不到的方式咬你。另外,將* values *傳遞給函數是Java所做的。 –

+0

「如果我在全班範圍內創建一些變量」 - 類中的普通字段不是大多數程序員使用該術語的「全局」方式。如果你提供[mcve]展示*完全*你的意思是「使某些變量成爲全局」,你可能會有更好的運氣。 – CommonsWare

+0

根據這一思想領域是邪惡的,應該避免? – efekctive

回答

6

永遠比全球更喜歡本地。如果您需要將數據作爲多個參數傳遞,那就這樣做。然後你明確地說出你的函數依賴於哪些數據。有太多的參數肯定是個問題,但是把它們中的一部分作爲全局變量不是答案。

如果您依賴全局變量,那麼可能並不清楚某些數據來自何處。如果全局變量是可變的,那麼當你開始嘗試調試一個難題時,你就會一團糟,因爲當某些全局變量被修改時,它可能並不明顯。

注意儘管不可變常量全局變量並不壞。如果你有許多功能需要的常量(比如PI),那麼使其成爲全局是有意義的。不變的常量不會因上面提到的缺點而受到影響,因爲它們不能改變。

0

這一切都取決於變量的範圍。如果您覺得某個變量會通過傳遞各種函數來獲取多個值,則使用局部變量並在函數調用中傳遞它們。 如果您覺得某個需要使用的變量將具有固定值,則將其聲明爲全局變量。

2

看你自己:

你寫了2000+行的服務類。你完成了這個項目很酷! 一個月後,您收到了一個錯誤報告,並返回到服務代碼。您看到func1()使用globalVariabl1。好吧,但現在它的價值呢?它如何改變?在涉及此功能之前,誰改變了globalVariabl1?所有這些突變的序列是什麼?你不知道。要弄明白這一點非常困難。

現在看到這個:你回到你的代碼,並且看到func0()提取一些東西,然後把它作爲參數傳遞給func1(param1)。你清楚地知道數據是什麼,它是如何到達這裏的。

什麼讓你更好的理解?

局部變量 一般來說,它的第二種觀點。局部變量將永遠幫助你。即使你編寫代碼並使用局部變量,調用語句本身也會告訴你這個函數依賴於這個特定的數據。它可以幫助你小心你傳遞的信息。

全局變量 全局變量都還好,當他們所代表的類/對象的state,或者即使他們是常數(這一般應該全部使用大寫字母)。當你只需要經常訪問該值時,它們也可能很好,並且您知道該變量在您使用它時始終會被初始化(例如在onCreate()中初始化它)

+0

一旦你意識到在背景中發生的事情越少,更好,可變的全局變得固有地消極。它很容易調試,一旦你可以確定代碼運行時變量的值是什麼。如果你有東西在不斷變化,調試將變成一場噩夢。我有不好的數據。它從哪裏來的?誰用它修改了全球? – Carcigenicate

+0

@Carcigenicate!這纔是重點。 – ZeekHuge

1

Java中沒有全局變量。你指的是成員變量。基本規則是變量應該有儘可能小的封閉範圍。

0

我知道這個問題已經得到解答,我提出了Carcigenicate的答案。

爲了闡述他的觀點,我建議你嘗試一下測試驅動開發實踐。只要您開始將代碼與單元測試一起編寫,您將會意識到全局變量可能會有多糟糕,並且您會意識到您正在編寫無需進行不必要的依賴注入就無法測試的代碼。

還有一件事。每次開始處理多個線程和併發時,全局變量都是一個巨大的錯誤。這聽起來不像你正在處理的那樣,只要你決定創建一個全局變量,記住它。