C# 对';成功';算作;变量的双重使用;?
我读过一篇文章,一个变量不能做一件以上的事情。重载一个变量来做一件以上的事情是不好的 因此,我最终编写了如下代码:(使用C# 对';成功';算作;变量的双重使用;?,c#,C#,我读过一篇文章,一个变量不能做一件以上的事情。重载一个变量来做一件以上的事情是不好的 因此,我最终编写了如下代码:(使用customerFound变量) 但在内心深处,我有时想这样编写代码:(没有customerFound变量) 这个秘密的欲望会让我成为一个邪恶的程序员吗 (即,第二种情况真的是糟糕的编码实践吗?我认为您误解了建议。在这种情况下,您仅将变量用于一个目的—存储正在搜索的客户。您的逻辑检查是否找到了客户,但不会更改变量的用途 “不要在一件事情上使用变量”的目标是“temp”变量,它在
customerFound
变量)
但在内心深处,我有时想这样编写代码:(没有customerFound
变量)
这个秘密的欲望会让我成为一个邪恶的程序员吗
(即,第二种情况真的是糟糕的编码实践吗?我认为您误解了建议。在这种情况下,您仅将变量用于一个目的—存储正在搜索的客户。您的逻辑检查是否找到了客户,但不会更改变量的用途
“不要在一件事情上使用变量”的目标是“temp”变量,它在函数过程中存储十种不同事情的状态。我认为第二种情况比第一种情况好。在我的书中,检查一个变量是否为NULL并不构成一个完整的其他用法。第二种情况更好,因为您已经在第一种情况下复制了代码,您必须在其中设置标志和变量。如果您遇到另一种情况,即设置了客户,但忘记设置标志,则很容易出错。您正在询问并演示两种不同的东西
何时使用给出的第一个代码变体:
如果即使找到对象,也可以有空值,并且需要区分是否实际找到客户,那么应该使用2变量变量 在第二段代码中,foundCustomer的空值表示未找到任何客户。这听起来完全合情合理,我不认为这是对变量的双重用途。 < P>我认为如果你把你的任务建立成其他开发者容易理解的简单代码,如果你把信标变成了1985的一组严格规则,你就会找到自己的方式。 有许多实践来自于旧式的程序开发,在这些实践中,例程更可能是单一的、非常长的。我们仍然可以从中学习,不要误会,但是我们有许多新的策略来处理复杂度,并创建人类可读/自我描述代码,所以对我来说,这应该是一个硬而快的规则,充其量似乎已经过时了
也就是说,我可能会将这段代码重构成两到三个较小的方法,然后变量重用问题可能就会消失。:) >个人,我会考虑将其重构为查找和检查客户的方法,从而显著地减少该块长度。比如:
Customer foundCustomer = null;
if (!this.TryGetLoadedCustomer(out foundCustomer))
foundCustomer = this.FindCustomer();
if (foundCustomer != null)
{ // ...
也就是说,在这两种情况下,您使用foundCustomer
变量都是为了一个目的。它被用于多个地方,但它只用于一个目的——跟踪正确的客户
如果您打算像上面那样使用代码,我个人更喜欢第二种情况而不是第一种情况,因为在任何情况下都可能需要空检查。我会使用第二种版本,但我不确定您的示例是否很好,因为我认为它没有做两件事。检查变量是否为空是标准做法。我认为第二个选项很有意义。如果没有变量,为什么还要浪费它呢 但在foreach声明中,如果找到客户,我会添加一个中断
在我看来,第二种方法也更好。我想说第一种方法实际上是错误的,因为你有两个相互依赖的变量,给你冗余的信息。这就造成了它们不一致的可能性-您可能会犯错误,让
customerFound
betrue
,但foundCustomer
benull
。那你觉得怎么样?这种状态最好是不可能达到的。我的观点正好相反。实际上,您正在添加额外的代码行以实现相同的结果,这使得您的第一个代码示例更容易出错,也更难维护
我同意这个共识,你正在做正确的检查,对一些可怕的事情,比如:
float x;
x=37; // current age
if (x<50) {
x=x/10; // current height
if (x>3) {
x=3.14; // pi to the desired level of precision
}
}
if (x==3.14) {
// hooray pi for everyone old enough
}
else {
// no pi for you youngster!
}
这意味着一旦你有了一个已加载的客户,你就再也不会搜索另一个了。我猜您删掉了一些方便的代码来制作一个示例,如果是这样的话,请忽略注释的这一部分!;-) 第二个代码段很好,只是可以用LINQ表达式替换foreach,以使事情更整洁。显然存在一个漏洞,如果您输入第一条路径,并且CustomerIdtOfId值不等于currentCustomer.ID,您将不会设置foundCustomer,但我认为这是您逻辑设计的一部分。这并不比BitVector32更糟糕+1质疑传统智慧,即使你对传统智慧的理解是错误的;)不,那很好,除非你在“如果”语句中赋值。让它=而不是=你就是g
Customer foundCustomer = null;
if (!this.TryGetLoadedCustomer(out foundCustomer))
foundCustomer = this.FindCustomer();
if (foundCustomer != null)
{ // ...
float x;
x=37; // current age
if (x<50) {
x=x/10; // current height
if (x>3) {
x=3.14; // pi to the desired level of precision
}
}
if (x==3.14) {
// hooray pi for everyone old enough
}
else {
// no pi for you youngster!
}
if (customerIDToFind = currentCustomer.ID)
{
foundCustomer = currentCustomer;
}
else {
// foundCustomer remains null
}
if (!foundCustomer) {
// always true when currentCustomer.IsLoaded
}