当在类中频繁传递变量时,确保代码干净的最佳模式
本文关键字:代码 确保 模式 最佳 变量 | 更新日期: 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
}
}
我想知道在这种情况下最好的方法是什么。
- 使CreateList()创建的列表成为类级别变量;
- 给每个子方法传递一个参数。
好的,这取决于你想要实现什么以及你的类的职责是什么。
如果你的类代表了一个真实的东西,它代表了你的领域的一部分,并且它有状态,那么你的私有方法就会对那个状态起作用,因此我会选择前者。
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
}
}
我希望这对你有帮助
这取决于列表的含义。你必须找到一些答案。它应该是类的一部分,还是只是一个临时变量,应该只存在于方法调用中?这是课堂行为的一部分吗?穿线呢?甚至您可能会重新考虑DedupeList
和ValidateList
方法是否必须成为该类的一部分,或者它们是否值得单独的类?
我建议你阅读Kent Beck的《实现模式》和Robert C. Martin的《干净代码》。对于这种小而常见的情况,有很多非常有用的提示。