替代的代码实现方式

时间:2010-05-17 12:51:37

标签: c# .net

标题并不完全有意义,但我不会分享其他名称。我稍后写了TOC Generation代码。基于此,我正在编写代码来检查重复项。代码如下

curNumber = getTOCReference(selItem.SNo, IsParent);
CheckForDuplicates(curNumber, IsParent,out realTOCRef);
curNumber = realTOCRef;

CheckForDuplicates的代码是

        ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber);

        if (curItem != null)
        {
            curNumber = this.getTOCReference(curNumber, !IsParent);
            CheckForDuplicates(curNumber, IsParent,out realTOCRef);
        }
        else
        {
            realTOCRef= curNumber;
        }

这段代码的作用是,它获取TOC并尝试查找它是否已存在于ObjectListView中,并在存在现有TOC时获得新的TOC。一旦确定生成的TOC不在列表中,它就将其存储在realTOCRef中并将其发送回主调用代码。

我用“out”来返回最后生成的TOC,这是我不想做的事情。我这样做的原因是在生成非重复TOC之后,返回没有返回到调用代码,而是循环通过先前的实例然后它返回。当循环返回时,要返回的TOC也被重置。

我将不胜感激。

2 个答案:

答案 0 :(得分:2)

当您有一个out参数时,通常可以使用该值作为方法的返回值来删除它。用返回值替换out参数如下所示:

String CheckForDuplicates(String curNumber, bool IsParent) 
{
    ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber);

    if (curItem != null)
    {
        String newNumber = this.getTOCReference(curNumber, !IsParent);
        curNumber = CheckForDuplicates(newNumber, IsParent);
    }
    // else - curNumber is correct - not a duplicate
    return curNumber;
}

至于设计,我觉得这段代码应该是你getTOCReference的一部分,这样客户就不必担心重复数据删除了 - 将重复数据删除作为getTOCReference基本功能的一部分是有意义的。 。它没什么复杂的 - 只需要一点点重命名和一些胶水:

  • getTOCReference重命名为getNextTOCReference,因为它确实是这样做的 - 找到接下来的TOC值,而不检查重复项。
  • 创建一个新方法GetNextAvailableTOCRefernece。对我来说GetTOCRefernece意味着要检索某种已保存的状态,并且多次调用将返回相同的值。这不是它的作用,所以新名称清楚地说明了。它看起来像这样:

(基本上是你在页面顶部给出的代码,重构为使用返回值,包含在方法中。)

String GetNextAvailableTOCReference(String curNumber, bool IsParent) 
{
   String newNumber = GetNextTOCRefrence(curNumber, IsParent);
   return CheckForDuplicates(newNumber, IsParent);   
}

通过这些更改,您需要新参考时调用getNextAvailalbeTOCreference,并确保它是唯一的(没有重复项。)

我已经保留了代码风格 - 我同意你可以更加一致,并为某些逻辑提供注释 - 特别是getTOCReference,因为根据方法参数,它会做4种不同的事情。当然还有单元测试,这样你就可以确定它能做到你说的那样!

答案 1 :(得分:0)

我不确定你在找什么。

我认为你正在寻找类似追随者的东西。

现有电话:

CheckForDuplicates(curNumber, IsParent,out realTOCRef);
curNumber = realTOCRef;

必填电话:

curNumber =CheckForDuplicates(curNumber, IsParent);

如果是,只需将代码更改为以下即可。

        ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber);

        if (curItem != null)
        {
            curNumber = this.getTOCReference(curNumber, !IsParent);
            return  CheckForDuplicates(curNumber, IsParent);
        }
        else
        {
            return curNumber;
        }