public class ScheduleRatesController
{
protected CoreDataManager dataManager;
public ScheduleRatesController()
{
dataManager = new CoreDataManager();
}
// testing
public ScheduleRatesController(CoreDataManager manager)
{
dataManager = manager;
}
public virtual void GetTranQuotesToFillRatesAndPayments(ref List<int> ids)
{
ids.AddRange(new List<int>());
}
}
所以为了给你们一些背景知识,我们将一个数据库查询拆分成一堆不同的查询,我们希望子类基本上每个都为它们的 GetTranQuotesToFillRatesAndPayments()
方法进行数据库调用表示它的特定查询。
您在上面看到的是我拥有的基类。我将这两个方法设为 virtual
,因为我计划让子类覆盖它们以执行它们自己的操作。所以一个可能是这样的:
public override void GetTranQuotesToFillRatesAndPayments(ref List<int> ids)
{
ids.AddRange(dataManager.GetLoanTranQuotes());
}
等等。我的问题是,这是执行此类模式的最佳/最干净的方法吗?
调用它的代码将包含一个巨大的过滤 ID 列表,它需要通过调用每个类调用 GetTranQuotesToFillRatesAndPayments()
来填充它。如果这没有意义,请告诉我。我有点厌烦了,因为我需要调用相同的方法 6 次,每次都在不同的类上。我认为这本身可能很困惑,即使它的目标是让它变得干净。我不想在调用方有这样的东西:
List<int> ids = new List<int>();
ScheduleRatesController controller = new LoanController();
controller.GetTranQuotesToFillRatesAndPayments(ref ids);
controller = new TradeController();
controller.GetTranQuotesToFillRatesAndPayments(ref ids);
等等
如果您需要更多背景或信息,请告诉我。
谢谢。
最佳答案
几个设计备注:
使用
ref
关键字通常表示设计问题,应避免使用。无需使用ref
传递引用值关键字(任何List<T>
总是通过引用传递)。没有它,您的程序也能正常工作。比将您的列表传递给该方法更好的想法是从该方法返回您的数据,并允许调用者决定如何处理它。也许您只想在程序的其他地方找到一个值,而创建一个新列表是一种矫枉过正的做法。此外,您应该尝试向每个类 (Single Responsibility Principle) 添加尽可能少的功能,并且您的类现在负责获取数据并决定如何存储数据。
命名:你的方法名真的很复杂。此外,名称“ Controller ”通常不代表负责获取数据的对象。
另一方面,您有一个
CoreDataManager
类 ( btw, Manager is a bad suffix for any class ),它似乎包含一堆返回各种数据的方法。需要什么ScheduleRatesController
然后?它只将此复制到列表吗?业务逻辑应该与您的数据访问层分开。您应该考虑使用存储库模式或类似模式(例如,检查 this answer ),以确保您的数据类仅从数据库中获取数据。
如果您有多个类需要实现某个契约,请首先创建它们需要实现的接口(interface)。这个时候不要考虑重用代码。例如,您的代码强制所有子类使用 CoreDataManager
,而有一天可能会发现某个“ Controller ”可能需要由不同的对象组成。
关于c# - 重构为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882259/