C# 重构为子类
等等。我的问题是,这是执行这种模式的最好/最干净的方法吗 调用它的代码将包含一个巨大的过滤id列表,它需要通过调用每个类调用C# 重构为子类,c#,design-patterns,inheritance,refactoring,subclass,C#,Design Patterns,Inheritance,Refactoring,Subclass,等等。我的问题是,这是执行这种模式的最好/最干净的方法吗 调用它的代码将包含一个巨大的过滤id列表,它需要通过调用每个类调用GetTranQuotesToFillRatesAndPayments()来填充这些id。如果这不合理,请告诉我。我有点被这样一个事实弄晕了,我需要调用同一个方法6次,每次调用不同的类。我认为这可能是混乱的本身,即使它的目标是使它干净。我不想在呼叫端出现这样的情况: public override void GetTranQuotesToFillRatesAndPaymen
GetTranQuotesToFillRatesAndPayments()
来填充这些id。如果这不合理,请告诉我。我有点被这样一个事实弄晕了,我需要调用同一个方法6次,每次调用不同的类。我认为这可能是混乱的本身,即使它的目标是使它干净。我不想在呼叫端出现这样的情况:
public override void GetTranQuotesToFillRatesAndPayments(ref List<int> ids)
{
ids.AddRange(dataManager.GetLoanTranQuotes());
}
List id=new List();
ScheduleRatesController=new LoanController();
controller.getTranQuotesToFillRates和Payments(参考ID);
控制器=新控制器();
controller.getTranQuotesToFillRates和Payments(参考ID);
等等
如果你需要更多的背景或信息,请告诉我
谢谢。几个设计备注:
ref
关键字通常表示存在设计问题,应避免使用。无需使用ref
关键字传递参考值(任何List
始终通过引用传递)。如果没有它,您的程序将同样有效CoreDataManager
class(),它似乎包含一组返回各种数据的方法。那么,ScheduleRatesController
需要什么?它是否只将此复制到列表中CoreDataManager
,而有一天可能会发现某个“控制器”可能需要由不同的对象组成。使用列表。它基本上是具有以下类型签名的函数列表:
List<int> ids = new List<int>();
ScheduleRatesController controller = new LoanController();
controller.GetTranQuotesToFillRatesAndPayments(ref ids);
controller = new TradeController();
controller.GetTranQuotesToFillRatesAndPayments(ref ids);
现在,您不必依赖于任何特定的继承层次结构。您可以使用函数组合生成整个列表。您想如何使用它?你可以让一个Facade类包装其他对象并公开一个类似的方法。我很难弄清楚你到底想实现什么。我应该做的一个小改动是为“GetTranQuotesToFillRates和Payments”提供一个列表的返回类型,而不是将其作为引用传递。顺便说一下,列表已经是引用类型了,不是吗?你几乎肯定不希望参数eitherOkay上有ref,所以没有ref,这是一个较小的问题。但是@DmitryShkuropatsky——我基本上想使用它,这样每个子类在DB中调用不同的查询,过滤返回的id列表,然后将它们添加到调用类中的我的列表中,这样我在最后就有一个大列表可以使用。JoepGreuter-我基本上是想达到清洁度。好的,这是我们真正需要的过滤分离。我们当然可以使用CoreDataManager作为唯一获取数据的类,但是我们用于获取数据子集的每个过程都需要进行不同的筛选。这有意义吗?@slandau:嗯,不太清楚应该如何过滤它们。如果您发布了几种不同的方法来过滤它们,更好地解释这些类之间的区别,这会有所帮助。如果需要对同一数据应用多个过滤器(如过滤器链),则可以使用以下方法:只需创建代理列表并按顺序应用它们。另一方面,如果您使用的是支持LINQ(EF,NHibernate)的ORM,那么它是完全不同的。好的,所以过滤实际上不是那么清晰。它基本上是使用我们的许多其他业务类来加载给定Id的事务,并删除不应该使用的事务。我们现在正在数据库中执行此操作,但我们希望将其移动到代码中。@slandau:这一部分对我来说并不完全清楚(这就是为什么我提到LINQ):过滤通常最好不在数据库端进行,因为否则您需要将整个集合加载到内存中,这就违背了创建数据库的目的。有了适当的SQL索引,在客户端提高效率的可能性很小。EF和NH中的LINQ提供者将编码查询转换为SQL端查询以将其委托给服务器。是的,我的意思是我有点同意。我们的数据库是一个巨大的东西,虽然没有正确地索引,但这是一个较长的项目
List<int> ids = new List<int>();
ScheduleRatesController controller = new LoanController();
controller.GetTranQuotesToFillRatesAndPayments(ref ids);
controller = new TradeController();
controller.GetTranQuotesToFillRatesAndPayments(ref ids);
List<int> MyFunc(List<int> foo);
public List<int> GetAllIds(List<Func<List<int>,List<int>>> functionList) {
var listOfIds = new List<int>();
foreach(var f in functionList) {
listOfIds = f(listOfIds);
}
return listOfIds;
}
functionList.Add(list => {
list.AddRange(dataManager.GetLoanTranQuotes());
return list;
});