【问题标题】:Which design pattern should i use for a dynamic report generator?我应该为动态报告生成器使用哪种设计模式?
【发布时间】:2014-04-01 14:09:26
【问题描述】:

我是设计模式的新手。即使研究了很多,我也无法理解何时应该使用哪种设计模式。我的问题是:在 Web 应用程序上下文中,我应该使用哪种设计模式来实现如下所示的报告生成器?

==================================================== =====
报告类型:         | '选择列表'在这里 |
报告子类型:   | 另一个选择'列表' |

过滤器:                &nbsp| 多选,多过滤参数 | ==================================================== =====

报告类型和子类型允许用户生成多种报告,一种与另一种不同,但过滤器对所有报告都是相同的(但并非所有过滤器值都将被使用或对所有报告都有效)。我正在使用 C#。我查看了有关选择设计模式的另一个问题,但没有成功。我应该使用哪种设计模式? 在此先感谢各位:D。 (注意:我问这个问题是为了学习)

【问题讨论】:

  • 为什么你认为这可以通过设计模式来解决?您在不知道自己需要它的情况下像流行语一样使用它。
  • 正在尝试编写 Web 或桌面应用程序?
  • 我正在研究设计模式,并尝试将它们应用到我的实际应用程序中。我不是想解决任何问题,只是理解。
  • 这是一个网络应用程序
  • 另一种选择是使用现有的报告软件。例如如果您使用的是 SQL Server,它会提供 Reporting Services (SSRS)。 SSRS 有一个 Web 控件,您可以将其放在 Web 表单上,这使您可以轻松地从数据库中进行报告。但是,它确实将您绑定到您可能不想要的特定解决方案中......

标签: c# design-patterns


【解决方案1】:

设计模式并非旨在让您选择一个用于应用程序。设计模式是有用的工具,可以帮助您构建构成应用程序的组件。最好的方法是开始开发你的应用程序,无论你发现你的代码在哪里变得笨拙或难以理解,看看你从模式中学到了什么,看看是否有一些想法可以帮助改进你的代码。随着经验的积累,您会发现您自然而然地使用模式来避免代码问题。

【讨论】:

    【解决方案2】:

    我同意这里所有的 cmets 的观点,即设计模式本身并不是一个目标,它们是一个工具。你的助教/教授把错误的想法放在你的脑海里,让你觉得给定的任务需要给定的设计模式。

    除此之外……

    为自己实现一个Factory。您的工厂将生成可用 IReport 的列表,并可能返回一些关于它们的元数据。

    public class ReportData{
    }
    
    public class ReportResult{
    }
    
    public class ReportOptions{
    }
    
    public class ReportSubtype{
    }
    
    public interface IReport{
      string Name{get;}
      string[] ReportSubtype{get;}
      string[] ReportOptions {get;}
    
      ReportResult GetReport(ReportData data, ReportSubtype subtype, ReportOptions options);
    }
    
    public class ReportSample: IReport{
      //.... your implementation
    }
    
    public static class ReportFactory{  
    
      private IReport[] _reports = null; // cache the instances - optional
    
      public static IReport[] GetAvailableReports(){
        if (_reports==null)  // static definition can be replaced with dynamic loading
           _reports = new IReport[]{
                        new ReportSample(),
                      };
    
        return _reports;
      }
    }
    

    【讨论】:

    • 我部分不同意。在学习的时候“试验”一下设计模式是很好的,因为它们不是微不足道的。请参阅books.google.ca/… 另一方面,Stackoverflow 并不是一个向初学者提出设计模式实验问题的好地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多