在方法中修改变量是不好的做法吗?

本文关键字:方法 修改 变量 | 更新日期: 2023-09-27 17:50:11

哪种方法风格更好?在方法中修改变量通常是不好的做法吗?

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";
}

在方法中修改变量是不好的做法吗?

有时候两种风格都有意义。例如,如果您只是设置名称,那么您可能会使用第一种样式。不要将对象传递给方法来改变一个东西,而只是检索一个东西。作为附带的好处,这种方法现在更易于重用。你可以把它想象成得墨忒耳定律或最少知识原理。

在其他情况下,可能需要根据用户输入执行批量更新。如果您正在显示一个人的属性并允许用户进行修改,也许您可以将该对象传递给单个方法,以便所有更新都可以在一个地方应用。

我认为当方法不改变传递的对象时,代码更清晰易读。特别是传递对象的内部字段。
这有时可能是需要的。但一般情况下我会避免使用。

根据评论更新(好点)

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

另外,为了提高可读性,您可以在person类中添加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
}

您正在使用属性访问数据,这在技术上是通过方法。你担心的是访问iVar或内部变量的属性。允许访问iVar通常是不好的原因是因为任何人都可以在没有您的知识或未经您的许可的情况下修改变量,如果它通过方法(属性),您可以在获取或设置消息时拦截消息,或者阻止它被读取或写入,因此通常被认为是最佳实践。

我同意Ron的话。尽管您的特定示例可能会因为发布原因而稍微做作,但我将为Name设置一个公共getter和一个私有setter。将名称传递给构造函数,name属性将在那里设置,但之后不能再修改。

例如:

public class Person
{
    public string Name { get; private set; }
    public Person( string name)
    {
        Name = name;
    }
}