Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构为子类_C#_Design Patterns_Inheritance_Refactoring_Subclass - Fatal编程技术网

C# 重构为子类

C# 重构为子类,c#,design-patterns,inheritance,refactoring,subclass,C#,Design Patterns,Inheritance,Refactoring,Subclass,等等。我的问题是,这是执行这种模式的最好/最干净的方法吗 调用它的代码将包含一个巨大的过滤id列表,它需要通过调用每个类调用GetTranQuotesToFillRatesAndPayments()来填充这些id。如果这不合理,请告诉我。我有点被这样一个事实弄晕了,我需要调用同一个方法6次,每次调用不同的类。我认为这可能是混乱的本身,即使它的目标是使它干净。我不想在呼叫端出现这样的情况: public override void GetTranQuotesToFillRatesAndPaymen

等等。我的问题是,这是执行这种模式的最好/最干净的方法吗

调用它的代码将包含一个巨大的过滤id列表,它需要通过调用每个类调用
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
    始终通过引用传递)。如果没有它,您的程序将同样有效

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

  • 命名:您的方法名称非常复杂。此外,名称“controller”通常不表示负责获取数据的对象

  • 另一方面,您有一个
    CoreDataManager
    class(),它似乎包含一组返回各种数据的方法。那么,
    ScheduleRatesController
    需要什么?它是否只将此复制到列表中

  • 业务逻辑应该与数据访问层分离。您应该考虑使用存储库模式,或类似(例如,检查),以确保数据类只从DB获取数据。

  • 如果您有几个类需要实现某个契约,请从创建它们需要实现的接口开始。此时不要考虑重用代码。例如,您的代码强制所有子类使用
    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;
    });