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

本文关键字:代码 确保 模式 最佳 变量 | 更新日期: 2023-09-27 18:18:15

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

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

所以我可能有:

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. 给每个子方法传递一个参数。

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

好的,这取决于你想要实现什么以及你的类的职责是什么。

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

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    
    }
}

我希望这对你有帮助

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

我建议你阅读Kent Beck的《实现模式》和Robert C. Martin的《干净代码》。对于这种小而常见的情况,有很多非常有用的提示。