[英]How to properly organize class code?
如果您需要通過私有方法修改數據,則在類中組織代碼的首選方式是什么?
例如,這樣做是否更好:
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
}
我已經看到它以多種方式完成,並且我試圖了解什么是行業標准的最佳實踐,因為我是發展中國家的新手。
如果數據是對象專有的,則該方法具有對其的完全訪問權限。 您不必傳遞它。
對象將狀態和行為封裝到單個軟件模塊中。 操作應操縱狀態。
如果您知道此參數是類private成員,那么我看不到使用參數來實現私有功能的意義。 如果功能是特定的,並且其結果取決於成員狀態,那么我將始終選擇第二個選項。
它實際上取決於數據,方法和您要執行的操作。 換句話說,這是該類設計的一部分。
此私有方法如何修改數據? 如果它執行僅對data1
字段有意義的特定計算,則可以簡單地使用callMethod()
。
另一方面,如果您的callMethod()
可能是該類內的一個小工具(也許可以對兩個不同的字段data1
和data2
進行相同的計算),則沒有兩個單獨的方法,而是傳遞要修改的成員是有意義的作為爭論。
如果您有一個具體的示例,那么我們可能會提供更多幫助
如果該方法已經知道它必須訪問的成員,則在內部傳遞引用是沒有意義的。
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的內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.