2011-04-15 74 views
1

哪種方法更好? 修改方法中的變量通常是不好的做法嗎?修改方法中的變量是不好的做法嗎?

public class Person 
{ 
    public string Name { get; set;} 
} 

//Style 1 
public void App() 
{ 
    Person p = new Person(); 
    p.Name = GetName(); 
} 
public string GetName() 
{ 
    return "daniel"; 
} 

//Style 2 
public void App() 
{ 
    Person p = new Person(); 
    LoadName(p) 
} 
public void LoadName(Person p) 
{ 
    p.Name = "daniel"; 
} 

回答

3

有些時候,這兩種風格可能是有意義的。例如,如果你只是簡單地設置了名字,那麼也許你會選擇第一種風格。不要將一個對象傳遞給一個方法來改變一件事,只需檢索一件事。這種方法現在更具可重用性,因爲它是一種副作用。把它想象成得墨忒耳定律或最少知識原則。

在其他情況下,也許你需要根據用戶輸入做批發的更新。如果您正在顯示某人的屬性並允許用戶進行修改,那麼可以將該對象傳遞給一個方法,以便所有更新都可以應用到一個位置。

兩種方式都可以在不同的時間保證。

2

我認爲當方法不改變傳遞的對象時,代碼更清晰易讀。尤其是傳遞對象的內部字段。
這可能有時需要。但總的來說,我會避免它。

更新基於評論(好點)

+2

值得一提的證明是通過引用傳遞兩種輸出方式,沒有什麼。引用類型被使用,是的。引用的副本按值傳遞。這和C#中的「通過引用傳遞」有着根本的區別。 – 2011-04-15 05:22:22

0

我和Ron同意。儘管你的特定示例可能因爲發佈原因而稍微設計一些,但我會爲Name提供一個公共getter,並且會有一個私有setter。將名稱傳遞給構造函數,Name屬性將在那裏設置,但之後不能再進行修改。

例如:

public class Person 
{ 
    public string Name { get; private set; } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 
+0

所以如果一個人在法律上改變他或她的名字,也許結婚了,這不能用你建議的對象模型來表示嗎? – 2011-04-15 05:24:23

+0

它可以,如果你添加一個方法來改變名稱,我會假設如果你改變名稱,那麼更多的不僅僅是改變名稱。 – Phill 2011-04-15 05:28:41

+0

@Phill,一種改變名字的方法,聽起來像一個二傳手。我們在C#中有成語。 ;)不僅如此,答案的文字暗示了施工後不可變性。一個人的本性是可變的。 – 2011-04-15 05:36:40

0

您正在訪問使用屬性這在技術上是由方法中的數據。你擔心的是訪問iVar或內部變量的屬性。有理由認爲,允許訪問iVar通常是不好的,因爲任何人都可以在您不知情的情況下或未經您的許可修改變量,如果它通過方法(屬性),您可以在獲取或設置時攔截消息,或防止它被讀取或寫入,因此通常被認爲是最佳實踐。

1

我同意安東尼的回答。 There are times when both styles may make sense.

此外,更多的可讀性,你可以親身類中添加LoadName功能。

public void App() 
{ 
    Person p = new Person(); 
    p.LoadName(); //If you need additional data to set the Name. You can pass that as Parameter 
} 
相關問題