c# - 重构为子类

标签 c# design-patterns inheritance refactoring subclass

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);

等等

如果您需要更多背景或信息,请告诉我。

谢谢。

最佳答案

几个设计备注:

  1. 使用 ref关键字通常表示设计问题,应避免使用。无需使用 ref 传递引用值关键字(任何 List<T> 总是通过引用传递)。没有它,您的程序也能正常工作。

  2. 比将您的列表传递给该方法更好的想法是从该方法返回您的数据,并允许调用者决定如何处理它。也许您只想在程序的其他地方找到一个值,而创建一个新列表是一种矫枉过正的做法。此外,您应该尝试向每个类 (Single Responsibility Principle) 添加尽可能少的功能,并且您的类现在负责获取数据决定如何存储数据。

  3. 命名:你的方法名真的很复杂。此外,名称“ Controller ”通常不代表负责获取数据的对象。

  4. 另一方面,您有一个 CoreDataManager类 ( btw, Manager is a bad suffix for any class ),它似乎包含一堆返回各种数据的方法。需要什么ScheduleRatesController然后?它只将此复制到列表吗?

  5. 业务逻辑应该与您的数据访问层分开。您应该考虑使用存储库模式或类似模式(例如,检查 this answer ),以确保您的数据类仅从数据库中获取数据。

如果您有多个类需要实现某个契约,请首先创建它们需要实现的接口(interface)。这个时候不要考虑重用代码。例如,您的代码强制所有子类使用 CoreDataManager ,而有一天可能会发现某个“ Controller ”可能需要由不同的对象组成。

关于c# - 重构为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882259/

相关文章:

c# - SQL Server 批量插入 - "Cannot bulk load. Unknown version of format file"

c# - 在 C# 中创建分部类

c# - 使用反射是一种设计味道吗?

C++模板: one list by class,如何分解代码?

c++ - 安置新的和继承

C++ 奇怪的重复模板模式,语法错误

java - 无法读取java中的继承值

c# - 在 C# .Net 4 中使用哪个 IP 框架(如果有)

design-patterns - 您在使用软件设计模式方面有哪些实践经验?

java - 抽象装饰器类而不是装饰器中的功能