在类中频繁传递变量时确保干净代码的最佳模式

时间:2013-06-12 13:09:48

标签: c#

假设我有一个有许多方法的课程 - 一些是私人的,一些是公开的。

在其中一个公共方法中,我创建了一个对象列表。然后将其用于许多其他方法,这些方法只是被抽象出来以使代码更简单。

所以我可能会:

public class MyClass
{
    public void CreateList()
    {
        List<MyClass> MyList = new List<MyClass>();
        ... populate list

        DedupeList();
        ValidateList();
    }

    void DedupeList()
    {
        // do something using MyList
    }

    void ValidateList()
    {
        // do something using MyList
    }
}

我想知道在这种情况下最好的方法是什么。

  1. 使CreateList()创建的列表成为类级变量;
  2. 将列表参数传递给每个子方法。

2 个答案:

答案 0 :(得分:2)

好的,这取决于你想要达到的目标以及你的课程责任。

如果你的类代表了一个真实的东西,代表你的域的一部分,并且具有状态,那么你的私有方法就会对该状态起作用,因此我会选择前者。

所以

public class Basket
{
  private IList<string> Contents;
  public Basket()
  {
     Contents = new Contents(); 
  }

  public void Add(string Item)
  {
     Contents.Add(Item);
  }

  public void Empty()
  {
    Contents.Clear(); 
  }
}

这是一个陈腐的例子,但我能想到的一切。

但是,如果您的类不表示具有状态的对象,例如下面的计算器接受一些输入,则对其进行操作,并返回它而不存储任何内容,则后者更好。

也就是说,还有其他一些考虑因素,例如保持代码清洁和易于阅读(优先级列表应该非常高),限制传递的参数数量(任何超过三个通常被认为是凌乱的) 。下面我将选择传递参数的示例。

public class InvestmentCalculator
{
    pubilc IEnumerable<Stock> CalculateInvestmentValue(IEnumerable<Stock> Stocks)
    {
       foreach (var stock in stocks)
       {
          var itemValue = GetSotckValueFromMarket(stock);
          stock.UpdateValue(itemValue)
          AddProjection(stock);
       }
    }

    public decimal GetStockValueFromMarket(Stock stock)
    {
      //Do something
    } 

    public decimal AddProjection(Stock stock) 
    {
      //Do something    
    }

}

我希望这有助于

答案 1 :(得分:0)

这取决于列表的含义。你必须找到一些答案。它应该是类的一部分还是只是一个临时变量应该只是在方法调用中生存?这是班级行为的一部分吗?线程怎么样?即使您可能需要重新考虑DedupeListValidateList方法是否必须属于此类,或者它们是否值得单独使用?

我建议你阅读Kent Beck撰写的“实施模式”和Robert C. Martin撰写的“清洁代码”。对于这些小而频繁的案例,有很多非常有用的提示。