2011-06-10 49 views
1

我有一個公共方法,它使用一個變量(只在公共方法的範圍內)我作爲參數傳遞,我們將調用A,此方法多次調用一個私有方法這也需要參數。初始化成員變量的方法,而不是構造函數

目前我每次都傳遞參數,但它看起來很奇怪,做這個類的成員變量還是不確定是否它初始化了方式的好處而不必通過呢?

簡化的僞代碼:

public_method(parameter a) 
    do something with a 
    private_method(string_a, a) 
    private_method(string_b, a) 
    private_method(string_c, a) 

private_method(String, parameter a) 
    do something with String and a 

其他信息:參數是一個只讀擁有超過100項映射和現實中我將調用private_method約50倍

回答

2

我自己也有同樣的問題。
我在3種不同的環境中以不同的方式實現它,以便親身體驗使用3種不同策略的結果,請參見下文。

請注意,我是一種程序員,對代碼進行了許多更改,總是試圖改進它。因此,我只爲適合修改的代碼解決問題,readbale,你會稱之爲「靈活」代碼。我只爲非常明確的代碼解決。

實驗之後,我來到了以下結果:

  1. 傳遞一個作爲參數是完全確定的,如果你有一個或兩個 - 短號碼 - 這種價值的。通過參數具有非常好的可見性,清晰度,清晰的傳遞線,清晰可見的生命週期(初始點,破壞點),易於修改,易於追蹤。
    如果這些值的數量開始增加到> = 5-6個值,我將切換到下面的#3。

  2. 通過類成員傳遞值 - 對我的代碼的清晰度沒有好處,最終我擺脫了它。它使代碼不太清晰。代碼變得混亂。我不喜歡它。它沒有優勢。

  3. 作爲替代(1)和(2),我採用了內部類方法,在這種情況下,當這樣的值大於5(這會導致太長的參數列表)。
    我將這些值打包成小的內部類,並通過引用將此類對象作爲參數傳遞給所有內部成員。
    一個類的公共函數通常會創建一個Inner類的對象(我稱之爲Impl或Ctx或Args)並將其傳遞給私有函數。
    這結合了arg傳遞的清晰度和簡潔性。這是完美的。

好運

Edit

Consider preparing array of strings and using a loop rather than writing 50 almost-identical calls. Something like char *strings[] = {...} (C/C++)

+0

即使我打電話方法50+次? – zode64 2011-06-10 18:39:00

+0

正確地說,如果方法需要超過5-6個參數,那麼最好將它們作爲表示參數的另一個類的實例傳遞。 – 2011-06-11 02:40:45

+0

@whatsthebeef。你在說源代碼中的50個地方嗎?或在呼叫發生時運行時發生50多次事件? – Andrei 2011-06-11 08:26:15

2

這真的取決於你的用例。 'a'代表你的應用程序/對象關心的狀態嗎?那麼你可能想讓它成爲你的對象的一員。評估大局,在設計結構時考慮維護和可擴展性。

1

如果您的參數a是您自己的類的一個類,您可以考慮將private_method作爲變量a的公共方法。

否則,我不認爲這看起來很奇怪。如果你只需要一個函數,將它作爲你的類的私有變量將是愚蠢的(至少對我來說)。然而,如果你需要它20次,我會這麼做:P或者更好,只要讓'a'成爲你自己需要的某個功能的對象。

+0

其實我需要調用它20倍以上,仍不能確定使它成爲一個成員變量,但+1建議把它作爲我自己的一個對象,在這種情況下,它是一個相當獨立的組件之間共享的地圖,所以我不想讓它們都需要共享對象,但這是未來的計劃 – zode64 2011-06-10 18:33:11

1

一個方法理想情況下不應該超過7個參數。使用大於6-7的參數數通常表明設計有問題(7個參數是否表示嵌套類的對象?)。

至於你的問題,如果你想讓參數僅用於私有方法之間傳遞,而不需要參數與對象的當前狀態(或有關對象的某些信息)有任何關係,那麼建議您不要這樣做。

從性能角度來看(內存消耗),引用參數可以作爲方法參數傳遞,而不會對內存消耗產生任何顯着影響,因爲它們是通過引用而不是按值傳遞的(即數據的副本是未創建)。對於可以組合在一起的少量參數,您可以使用struct。例如,如果參數表示一個點的座標爲xy,則將它們傳遞給一個單一的Point結構。

底線
問自己這個問題,確實爲成員代表關於對象的任何信息(數據)正在製作的參數? (數據可以是狀態或唯一標識信息)。如果他的問題的答案是明確的否,那麼不要將該參數作爲班級成員加入。

更多信息

相關問題