2013-01-31 118 views
4

我想知道以下哪種模式被認爲是更「正確」的。類方法:以私有方法傳遞私有數據字段

第一個示例通過調用一個隱式接受參數的void成員函數來設置私有數據成員長度的值。 第二個示例通過將其分配給顯式接受參數的成員函數的返回值來設置長度的值。

看起來,第二種方法使代碼更清晰,因爲您知道私有成員何時以及如何設置, 第一種方法需要跟蹤代碼來驗證指定值的方式和方式。第二種方法 也似乎可以更好地重用,因爲它可以在任何類/上下文中運行(因爲參數和返回類型是顯式的)。

第一種方法更快,如果在整個班級中使用(用於私人成員功能)可以節省一些編碼,但是我不知道這是否會讓我受到影響?

謝謝你的洞察力併爲我解決這個問題。

class MyDataType 
{ 
    private int length; 
    private string content; 
    private char[] buffer; 

    public MyDataType(str) 
    { 
     content = str; 

     calculateLength(); 

     buffer = new char[length+1]; 

     for(int i=0; i < length; i++) 
     buffer[i] = content[i]; 

     buffer[i] = NULL; 
    } 

    private void calculateLength() 
    { 
     int i = 0; 

     while(content[i++] != NULL) {} // i know, buffer overflow... 

     length = i; 
    } 
} 

class MyDataType 
{ 
    private int length; 
    private string content; 
    private char[] buffer; 

    public MyDataType(str) 
    { 
     content = str; 

     length = calculateLength(content); 

     buffer = new char[length+1]; 

     for(int i=0; i < length; i++) 
     buffer[i] = content[i]; 

     buffer[i] = NULL; 
    } 

    private int calculateLength(string s) 
    { 
     int i = 0; 

     while(s[i++] != NULL) {} 

     return i; 
    } 
} 
+0

爲什麼第二個方法在第二個例子中不是靜態的,即似乎沒有使用類中的任何其他變量? – KingCronus

+0

這僅僅是我爲了爭辯而鞭撻的一個例子。所以,通過問我是否靜態(這是,我想這可能是),你是否暗示第一個例子是正確的?只是B/C方法可能是靜態的,應該是? – samosaris

+0

在你的第一個例子中,你有getLength方法設置私有成員變量並且不返回任何東西。通常getX方法應該返回X.也許它應該被重命名。 – Tom

回答

2

就可讀性和靈活性而言,第二個例子勝出。

使用第二個示例的好處是,您基本上只是將構造函數中的一些工作委託給方法。如果有人調用私有calculateLength()方法而不希望實例變量發生變化,這很容易閱讀,並且在將來不會輕易破解。

在第一個示例中,calculateLength()方法正在以不透明的方式對構造函數對成員變量進行操作,這使得它的可讀性更低,並且更容易因上述方式而變得脆弱。

+0

最近這種情況經常出現,而且很急,我一直在用例子的格式。它只是看起來錯誤和骯髒。不過,我想在這裏得到普遍的一致意見。謝謝,非常感謝。 – samosaris

+0

哦,這是一個關於意外狀態變化的真正好處。我一直在思考專用單用途功能,但是好的代碼可以在多個地方重複使用,並且一定會出現(一個私人成員可能因爲不同的原因在兩個不同的地方輕鬆使用)。 – samosaris

+0

現在我回想起來,我認爲我一直在使用示例1的主要原因是b/c說你喜歡5+數據成員,所有私有數據成員都需要設置一些數據。它真正簡單,只需編寫一個無效的SetData()函數而不是SetData(ref List a1,ref List a2,...) – samosaris

0

爲什麼不嵌入getLength()功能內容到構造,並同時做複製?你會爲自己節省另一個循環。 除此之外,我很確定這並不重要。只要順着流程走,從一個方法開始,然後在將來如果你覺得合適,就修改。

+0

這不是真正的代碼,而是一個例子來說明我的問題的要點。 – samosaris

+1

在使用大型系統時,您需要考慮未來的變化。您必須做出設計決定,以便稍後在系統中簡化更改。今天它正在寫一種方法,然後它變成一個類,然後它變成一個包。一旦變得足夠大,改變基本課程中的東西就會破壞其他許多課程,這使得返回和重構成爲一種痛苦。 – Raufio

1

我會說第二個更合適,但第一個作品。

通常getter是公共的,在一個類的任何地方你可以訪問一個私有變量,在同一個類中獲得一個私有或受保護的變量的getter沒有任何意義。如果它受到保護,您可以將功能傳遞給班級的子類。

這取決於你想對變量做什麼。如果該值不會改變,我只需將private calculateLength()方法移到構造函數中。如果你必須重新計算它,那麼我想我可以看到無效或私人在做幾乎相同的事情。我覺得第二個更清晰,因爲你確切知道calculateLength()方法正在返回的位置,但是在第一個方法中,它根本不知道它是否在做任何事情。做第二件事更好。

+0

...我的不好,我改變了getLength()計算長度(),因爲它不是一個吸氣劑,而是一個內部實用方法。絕對誤導,謝謝指出。 – samosaris