簡體   English   中英

如何正確組織類代碼?

[英]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()可能是該類內的一個小工具(也許可以對兩個不同的字段data1data2進行相同的計算),則沒有兩個單獨的方法,而是傳遞要修改的成員是有意義的作為爭論。

如果您有一個具體的示例,那么我們可能會提供更多幫助

如果該方法已經知道它必須訪問的成員,則在內部傳遞引用是沒有意義的。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM