2013-07-23 60 views
0

如果您需要通過私有方法修改數據,組織代碼的首選方法是什麼?如何正確組織類代碼?

例如,是它更好地做到這一點:

private String data1; 

callMethod(data1); 

private void callMethod(String stuff) { 
    // Do stuff to data1 
} 

或者這樣:

private String data1; 

callMethod(); 

private void callMethod() { 
    // Do stuff to data1 
} 

我已經看到了它在各種不同的方式做,我想明白了什麼自從我是新興的發展中國家以來,這是行業標準的最佳實踐。

+1

如果在函數中更改它,第一個數據會保持不變,第二個更改原始數據。所以這取決於你想要什麼。 – Tdelang

+0

@Tdelang如果不重新分配'data1',則第二種方法不一定會更改'data1'。 – Thomas

+0

對不起,我可能不清楚,「如果你改變它在你的功能」我的意思是重新分配它。 – Tdelang

回答

3

如果數據對於對象是私有的,則該方法可以完全訪問它。您不應該通過它。

對象將狀態和行爲封裝到單個軟件模塊中。操作應該操縱狀態。

+0

所以在理論上,私人方法通常不需要論證? –

+0

我不確定這是100%準確。如果我有一個有兩個字段的類,讓我們說'amount1'和'amount2',並且需要對兩者執行相同的操作,可以使用具有參數的私有方法。他正在談論的不是私人的方法 –

1

如果您知道這個參數是類私有成員,我沒有看到使用參數創建私有函數的要點。如果函數是特定的,並且其結果取決於成員狀態,那麼我總是會選擇第二個選項。

1

這實際上取決於數據,方法和你正在嘗試做什麼。換句話說,這是該課程設計的一部分。

這個私有方法如何修改數據?如果它只執行data1字段的特定計算,那麼您可以簡單地使用callMethod()

如果在另一方面你callMethod()也許是類(也許可以在兩個不同的領域data1data2進行同樣的計算)內的小工具的話很有道理不具有兩種不同的方法,但該成員傳遞給被修改爲一個參數。

如果你有一個具體的例子,然後我們也許可以提供更多的幫助

1

這是沒有意義的內部傳遞一個參考,如果該方法已經知道它必須訪問的成員。

class FooHolder { 
    private Foo foo; 

    private void ensureInitialized() { 
     if (foo == null) 
      foo = new Foo(); 
    } 

    public Foo getFoo() { 
     ensureInitialized(); 
     return foo; 
    } 
} 

但是,如果您可以通過這種方式防止代碼重複,那麼這樣做有時候很有用。這些內部實用方法有時可能是靜態喜歡這裏:

class FooAndBar { 
    private List<Foo> foos; 
    private List<Bar> bars; 

    public void addFoo(Foo foo) { 
     foos = ensureList(foos); 
     foos.add(foo); 
    } 

    public void addBar(Bar bar) { 
     bars = ensureList(bars); 
     bars.add(bar); 
    } 

    // assume this method is not generically useful and therefore not better off in a utility class 
    private static <T> List<T> ensureList(List<T> list) { 
     return list != null ? list : new ArrayList<T>(); 
    } 
} 

有時他們不能/不應該

class FooFoos { 
    private final Map<String, List<Foo>> fooMap = new HashMap<String, List<Foo>>(); 
    private List<Foo> getListForKey(String key) { 
     List<Foo> list = fooMap.get(key); 
     if (list == null) { 
      list = new ArrayList<Foo>(); 
      fooMap.put(key, list); 
     } 
     return list; 
    } 

    public void addFoo(String key, Foo foo) { 
     getListForKey(key).add(foo); 
    } 
    public List<Foo> getList(String key) { 
     return getListForKey(key); 
    } 
} 

注意getListForKey不通過一個參考fooMap。沒有必要,因爲那部分已經很清楚了,並且在每種方法中輸入它只會混淆代碼。

如果您可以通過這種方式實現更少的代碼重複和某些內部封裝,請將引用傳遞給您的私有方法。但是如果這會導致更多的代碼,那麼不要這樣做,因爲每個方法都必須重新指定引用。

另請注意,通過方法進行的大量功能內部封裝意味着您應該考慮將該功能重構爲另一個類。對於最後一個例子,考慮使用/創建類似MultiMap

+0

非常感謝這個答案!它爲我清理了很多。 –