Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对';成功';算作;变量的双重使用;?_C# - Fatal编程技术网

C# 对';成功';算作;变量的双重使用;?

C# 对';成功';算作;变量的双重使用;?,c#,C#,我读过一篇文章,一个变量不能做一件以上的事情。重载一个变量来做一件以上的事情是不好的 因此,我最终编写了如下代码:(使用customerFound变量) 但在内心深处,我有时想这样编写代码:(没有customerFound变量) 这个秘密的欲望会让我成为一个邪恶的程序员吗 (即,第二种情况真的是糟糕的编码实践吗?我认为您误解了建议。在这种情况下,您仅将变量用于一个目的—存储正在搜索的客户。您的逻辑检查是否找到了客户,但不会更改变量的用途 “不要在一件事情上使用变量”的目标是“temp”变量,它在

我读过一篇文章,一个变量不能做一件以上的事情。重载一个变量来做一件以上的事情是不好的

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

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

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


(即,第二种情况真的是糟糕的编码实践吗?

我认为您误解了建议。在这种情况下,您仅将变量用于一个目的—存储正在搜索的客户。您的逻辑检查是否找到了客户,但不会更改变量的用途


“不要在一件事情上使用变量”的目标是“temp”变量,它在函数过程中存储十种不同事情的状态。

我认为第二种情况比第一种情况好。在我的书中,检查一个变量是否为NULL并不构成一个完整的其他用法。第二种情况更好,因为您已经在第一种情况下复制了代码,您必须在其中设置标志和变量。如果您遇到另一种情况,即设置了客户,但忘记设置标志,则很容易出错。

您正在询问并演示两种不同的东西

  • 您要问的是什么:对两种不同的事情使用相同的变量。例如,使用单个双变量存储用户的年龄和身高
  • 您演示的内容:使用两个变量实现相同目的 我更喜欢您的第二个代码变体,您有1个变量,而不是2个相互依赖的变量。第一段代码可能会有更多的问题,因为您需要管理更多的状态来表示相同的事情

    我认为你要问的根本问题是:使用一个神奇的值而不是一个单独的变量可以吗?这取决于你的情况,但是如果你保证魔法值(在本例中为null)不能用其他方式来表示其他任何东西,那么就继续吧


    何时使用给出的第一个代码变体:


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

    在第二段代码中,foundCustomer的空值表示未找到任何客户。这听起来完全合情合理,我不认为这是对变量的双重用途。

    < P>我认为如果你把你的任务建立成其他开发者容易理解的简单代码,如果你把信标变成了1985的一组严格规则,你就会找到自己的方式。 有许多实践来自于旧式的程序开发,在这些实践中,例程更可能是单一的、非常长的。我们仍然可以从中学习,不要误会,但是我们有许多新的策略来处理复杂度,并创建人类可读/自我描述代码,所以对我来说,这应该是一个硬而快的规则,充其量似乎已经过时了


    也就是说,我可能会将这段代码重构成两到三个较小的方法,然后变量重用问题可能就会消失。:)

    >个人,我会考虑将其重构为查找和检查客户的方法,从而显著地减少该块长度。比如:

    Customer foundCustomer = null;
    if (!this.TryGetLoadedCustomer(out foundCustomer))
        foundCustomer = this.FindCustomer();
    
    if (foundCustomer != null)
    { // ...
    
    也就是说,在这两种情况下,您使用
    foundCustomer
    变量都是为了一个目的。它被用于多个地方,但它只用于一个目的——跟踪正确的客户


    如果您打算像上面那样使用代码,我个人更喜欢第二种情况而不是第一种情况,因为在任何情况下都可能需要空检查。

    我会使用第二种版本,但我不确定您的示例是否很好,因为我认为它没有做两件事。检查变量是否为空是标准做法。

    我认为第二个选项很有意义。如果没有变量,为什么还要浪费它呢

    但在foreach声明中,如果找到客户,我会添加一个中断


    在我看来,第二种方法也更好。我想说第一种方法实际上是错误的,因为你有两个相互依赖的变量,给你冗余的信息。这就造成了它们不一致的可能性-您可能会犯错误,让
    customerFound
    be
    true
    ,但
    foundCustomer
    be
    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!
    }
    

    这意味着一旦你有了一个已加载的客户,你就再也不会搜索另一个了。我猜您删掉了一些方便的代码来制作一个示例,如果是这样的话,请忽略注释的这一部分!;-)

    第二个代码段很好,只是可以用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 
    }