使用 get 时更改对象状态
Change object state when using get
您好,当我发现这个时,我是在微软网站上阅读的,有人可以解释为什么这是糟糕的编程,因为我看到它是用更少的代码行做更多的事情。 Ps我还是菜鸟类...
使用get访问器来改变对象的状态是一种糟糕的编程风格。例如,以下访问器会在每次访问数字字段时产生更改对象状态的副作用。
private int number;
public int Number
{
get
{
return number++; // Don't do this
}
}
当然...
大多数开发人员将 Get 读取为只读操作,阅读您的代码的人不会期望 Get 属性 会修改任何数据。这是一种约定,但仔细想想,它是有道理的 - 它有助于我们所有人理解彼此的代码。
在您引用的示例中,一种方法是将其分为两个调用 - 一个 get,然后是一个 set 来增加变量...另一种方法是实现一个方法来增加变量和 return结果。
如您的示例所示,让我们假设一种情况。
您正在开发一个 API,其中您提供了限制用户使用的 collection(Number) 的大小,但您允许用户查看有多少 contents/items collection.
现在一个人必须在三个不同的地方得到计数——在那种情况下,每次他得到它时你都在增加数字,那是绝对错误的。
希望你明白了,为什么它是一种糟糕的编程风格。
在 get 访问器上修改对象的状态有完全正当的理由,这就是允许这样做的原因(例如,出于统计目的):
例如:
private int _timesMyCustomerWasAccessed;
private Customer _myCustomer;
public Customer MyCustomer
{
get
{
_timesMyCustomerWasAccessed++;
return _myCustomer;
}
}
也就是说,对对象进行状态更改通常会影响如何从外部观察此对象(如果更改适用于完全相同 属性).
这是一个语法问题:get 访问器不应该有副作用,因为它们看起来很奇怪并且使代码难以理解。
在您的示例代码中。想象一下这段代码访问 属性:
Console.Write(String.Format("{0} {1} {2},
myObject.Number,
myObject.Number,
myObject.Number));
输出将是:
0 1 2
如果您尝试阅读该代码,除非对象的副作用已被完美记录,否则您认为 myObject.Number
每次都会给出不同结果的原因是什么?
对于你的特殊情况,如果你有一个方法会更有意义:
public int GetNumberAndIncrease()
{
return number++;
}
当您阅读该代码时:
Console.Write(String.Format("{0} {1} {2},
myObject.GetNumberAndIncrease(),
myObject.GetNumberAndIncrease(),
myObject.GetNumberAndIncrease()));
只需阅读该代码即可完全理解输出
您好,当我发现这个时,我是在微软网站上阅读的,有人可以解释为什么这是糟糕的编程,因为我看到它是用更少的代码行做更多的事情。 Ps我还是菜鸟类...
使用get访问器来改变对象的状态是一种糟糕的编程风格。例如,以下访问器会在每次访问数字字段时产生更改对象状态的副作用。
private int number;
public int Number
{
get
{
return number++; // Don't do this
}
}
当然...
大多数开发人员将 Get 读取为只读操作,阅读您的代码的人不会期望 Get 属性 会修改任何数据。这是一种约定,但仔细想想,它是有道理的 - 它有助于我们所有人理解彼此的代码。
在您引用的示例中,一种方法是将其分为两个调用 - 一个 get,然后是一个 set 来增加变量...另一种方法是实现一个方法来增加变量和 return结果。
如您的示例所示,让我们假设一种情况。
您正在开发一个 API,其中您提供了限制用户使用的 collection(Number) 的大小,但您允许用户查看有多少 contents/items collection.
现在一个人必须在三个不同的地方得到计数——在那种情况下,每次他得到它时你都在增加数字,那是绝对错误的。
希望你明白了,为什么它是一种糟糕的编程风格。
在 get 访问器上修改对象的状态有完全正当的理由,这就是允许这样做的原因(例如,出于统计目的):
例如:
private int _timesMyCustomerWasAccessed;
private Customer _myCustomer;
public Customer MyCustomer
{
get
{
_timesMyCustomerWasAccessed++;
return _myCustomer;
}
}
也就是说,对对象进行状态更改通常会影响如何从外部观察此对象(如果更改适用于完全相同 属性).
这是一个语法问题:get 访问器不应该有副作用,因为它们看起来很奇怪并且使代码难以理解。
在您的示例代码中。想象一下这段代码访问 属性:
Console.Write(String.Format("{0} {1} {2},
myObject.Number,
myObject.Number,
myObject.Number));
输出将是:
0 1 2
如果您尝试阅读该代码,除非对象的副作用已被完美记录,否则您认为 myObject.Number
每次都会给出不同结果的原因是什么?
对于你的特殊情况,如果你有一个方法会更有意义:
public int GetNumberAndIncrease()
{
return number++;
}
当您阅读该代码时:
Console.Write(String.Format("{0} {1} {2},
myObject.GetNumberAndIncrease(),
myObject.GetNumberAndIncrease(),
myObject.GetNumberAndIncrease()));
只需阅读该代码即可完全理解输出