1

假设我有一个包含许多方法的类——一些是私有的,一些是公共的。

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

所以我可能有:

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. 将列表传递给每个子方法的参数。
4

2 回答 2

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    
    }

}

我希望这个对你有用

于 2013-06-12T13:37:58.887 回答
0

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

我建议您阅读 Kent Beck 的“实现模式”和 Robert C. Martin 的“Clean Code”。对于这些小而频繁的案例,有许多非常有用的提示。

于 2013-06-12T13:19:28.143 回答