为"成功"检查null是否算作"双重使用变量"?

Vac*_*ano 21 c#

我已经读过一个变量永远不应该做多件事.重载变量以执行多个操作是不好的.

因此,我最终编写如下代码:(使用customerFound变量)

bool customerFound = false;
Customer foundCustomer = null;
if (currentCustomer.IsLoaded)
{
    if (customerIDToFind = currentCustomer.ID)
    {
        foundCustomer = currentCustomer;
        customerFound = true;
    }
}
else
{
    foreach (Customer customer in allCustomers)
    {
        if (customerIDToFind = customer.ID)
        {
            foundCustomer = customer;
            customerFound = true;
        }
    }
}
if (customerFound)
{
    // Do something
}     
Run Code Online (Sandbox Code Playgroud)

但在内心深处,我有时想写这样的代码:(没有customerFound变量)

Customer foundCustomer = null;
if (currentCustomer.IsLoaded)
{
    if (customerIDToFind = currentCustomer.ID)
    {
        foundCustomer = currentCustomer;
    }
}
else
{
    foreach (Customer customer in allCustomers)
    {
        if (customerIDToFind = customer.ID)
        {
            foundCustomer = customer;
        }
    }
}
if (foundCustomer != null)
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

这个秘密的欲望会让我成为一个邪恶的程序员吗?

(即第二种情况是非常糟糕的编码习惯吗?)

Har*_*lby 52

我想你误解了这个建议.在这种情况下,您仅将变量用于一个目的 - 存储要搜索的客户.您的逻辑检查是否找到了客户,但未更改变量的用途.

"不要将变量用于多个事物"是针对诸如"临时"变量之类的事情,它们在函数过程中存储十种不同事物的状态.

  • ++这是一个问题,在汇编语言中,寄存器被用作变量,它们的含义可以改变.这也是Fortran中的一个典型问题,例如,采用矩阵平方根的子程序可能会覆盖原始,迫使您使用一个矩阵变量作为两种含义,具体取决于位置.男孩,这很烦人. (2认同)

Bri*_*ndy 10

你问的是并展示了两件不同的东西.

  1. 你在问什么:对2个不同的东西使用相同的变量.例如,使用单个双变量存储用户的年龄以及他的身高.
  2. 您要演示的内容:将2个变量用于相同目的.

我更喜欢你的第二个代码变体,你有1个变量而不是2个共同依赖.第一段代码可能会有更多问题,因为您有更多的状态可以设法表示同样的事情.

我认为你要问的根本事情是:使用魔术值而不是单独的变量是否可以?这取决于你的情况,但如果你保证魔法值(在这种情况下为null)不能用于表示其他任何东西,那么继续.


当您使用您提供的第一个代码变体时:

如果即使找到对象也可以使用空值,并且您需要区分实际查找客户与否,那么您应该使用2变量变量.

  • @shahkalpesh:不,它不相同,在这种情况下,bool意味着显示无效的解析异常.你不能依赖一个神奇的数字,但如果它返回int?那么它会有可比性.它在其他层面上也有所不同. (2认同)

Ree*_*sey 5

就个人而言,我会考虑将其重构为查找和检查客户的方法,从而大大减少此块长度.就像是:

Customer foundCustomer = null;
if (!this.TryGetLoadedCustomer(out foundCustomer))
    foundCustomer = this.FindCustomer();

if (foundCustomer != null)
{ // ...
Run Code Online (Sandbox Code Playgroud)

话虽如此foundCustomer,在这两种情况下,你都将这个变量用于一个目的.它被用于多个地方,但它用于一个目的 - 跟踪正确的客户.

如果您要使用上面的代码,我个人更喜欢第二种情况而不是您的第一种选择 - 因为在任何情况下都可能需要进行空检查.


Cla*_*diu 5

在我看来,第二种方式也更好.我会说第一种方法实际上是错误的,因为你有两个相互依赖的变量,并为你提供冗余信息.这将打开他们是不一致的可能性-你可以犯了一个错误,并有customerFound可以true,但foundCustomernull.在那种情况下你是做什么的?这个州最好不可能达到.