【问题标题】:OO Design - Reduce a Long List of MethodsOO 设计 - 减少一长串方法
【发布时间】:2010-05-04 21:47:39
【问题描述】:

我有一个简单的应用程序,可以将数据从 XML 文件加载到数据库。

public class EmployeeLoader()  
{ 
   public void LoadEmpoyees()
   {...}

   public void LoadSalaries()
   {...}

   public void LoadRegistrationData()
   {...}    

   public void LoadTaxData()
   {...}
}

拥有多个“加载”方法是否是个好主意,因为这看起来像我对 tweney Load 方法的代码味道?如果是这样,如何使我的代码更具可读性?
每个Load方法都通过repository将数据加载到数据库中对应的表中?

【问题讨论】:

  • 如果您的代码的目的是将数据从 XML 加载到数据库中,那么这不是什么大问题。我不得不问的一件事 - 是否有另一个使用相同实体的应用程序?如果是这样,您为什么不使用它的 DAL 来适当地访问数据库或 XML 文件?如果有其他应用同时命中这两个来源,请使用每个来源的 DAL,并定义一个您填充然后转储的实体类型。

标签: c# database design-patterns


【解决方案1】:

实际上,像这样将其分解为命名良好的步骤是非常易读的。

见这篇文章:http://www.codinghorror.com/blog/2008/07/coding-without-comments.html

【讨论】:

    【解决方案2】:

    最大的问题是这些方法是否都必须公开。理想情况下,您会想要一个类似于单个公共 Load 方法的东西,该方法通过调用所有私有 Load* 方法从数据库中加载所有内容。

    【讨论】:

      【解决方案3】:

      将它们分开使其比使用大量样板来管理不同场景的加载方法更具可读性

      你会有类似的东西

      public void Load() {
        if (condition1 that makes me know I'm loading an employee) {
          //whatever applies to this condition
        }
        if (condition2 that makes me know I'm loading salaries) {
          //whatever applies to this condition
        }
        if (condition3 that makes me know I'm loading registrationData) {
          //whatever applies to this condition
        }
        if (condition4 that makes me know I'm loading taxData) {
          //whatever applies to this condition
        }
      }
      

      呃。

      即使这些方法做了非常相似的事情,最好将它们分开并调用相似的方法。这样,如果有什么变化,它会很容易重构 =)。

      最后,如果类变得太大(职责太多),您可能会考虑分成更多职责更具体的类。

      【讨论】:

        【解决方案4】:

        向用户提供一个名为“Load()”的单一曝光点怎么样/想要实现这个外部暴露的调用。

        【讨论】:

          【解决方案5】:

          我假设加载的数据将保存在本地字段/字典中,然后由另一种方法使用。

          如果是这种情况,您可以根据需要延迟加载值。

          public class EmployeeLoader
          {
          
              private List<String> _Employees = null;
              public List<String> Employees
              {
                  get
                  {
                      if (_Employees == null)
                      {
                          LoadEmployees();
                      }
                      return _Employees;
                  }
              }
          
              private void LoadEmployees()
              {
                  //Load Data
              }
          }
          

          作为补充,您仍然可以使用单个 Load() 方法将值强制加载到这些支持字段中。

          【讨论】:

            【解决方案6】:

            根据实现的不同,您也许可以将它们压缩为单个 Load 方法,或至少更少的加载方法。代替许多 LoadX() 方法,它可以变成一个或几个 Load(X x) 方法吗?例如:

            public class EmployeeLoader()  
            { 
               public void Load(string pTableName)
               {...}
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-26
              • 1970-01-01
              • 2021-10-22
              • 1970-01-01
              • 2011-01-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多