2011-04-15 58 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 
} 
相关问题