【问题标题】:Advise on object-oriented design面向对象设计的建议
【发布时间】:2010-01-05 15:58:01
【问题描述】:

我需要一些有关 OOD 查询的帮助。

假设我有以下Customer 类:

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

这是客户相关数据的简单占位符。接下来是CustomerFactory,用于获取客户:

public static class CustomerFactory
{
    public static Customer GetCustomer(int id)
    {
        return null; // Pretend this goes off to get a customer.
    }
}

现在,如果我想编写一个名为 UpdateCustomer(Customer customer) 的例程,有人可以建议我可以将这个方法放在哪里吗?

显然我不想使用 Customer 类,因为这会违反 SRP(单一责任原则),我也不认为将方法附加到 CustomerFactory 类是一个好主意,因为它的唯一作用是从数据库中获取客户。

所以看起来我需要另一个课程,但我不知道给它起什么名字。

干杯。 贾斯。

【问题讨论】:

  • 供将来参考 - 没有必要将此问题标记为社区 wiki :-)

标签: oop


【解决方案1】:

你所说的工厂根本就不是工厂。这是一个存储库。

Factory 处理基于某些参数集共享公共接口或类层次结构的各种类的实例化。

Repository 处理数据的检索和管理。

存储库中肯定包含UpdateCustomer(Customer customer) 方法以及GetCustomer(int id) 方法。

【讨论】:

  • 啊,太好了。这就是我把自己弄得一团糟的地方,我把类命名为 CustomerFactory,而不是 CustomerRepository。这似乎已经更好了。
【解决方案2】:

在创建 存储库 的过程中,您可以少花钱多办事。做这样的事情:

public interface ICustomerRepository
{
    Customer SelectCustomer(int id);

    void UpdateCustomer(Customer customer);

    void DeleteCustomer(int id);

    void CreateCustomer(Customer customer);
}

然后创建此接口的具体实现(该接口实际上只是因为针对接口进行编程是一种很好的做法 - 不过,您可以跳过它,尽管我建议您保留它)。

【讨论】:

    【解决方案3】:

    您的 UpdateCustomer 例程不会放在您的 DAL(数据访问层)中。您应该定义一个类来处理对数据库的插入或更新,然后将客户对象传递给它。

    您可以编写 DAL 类来处理所有这些,但我认为将其存储在您的 CustomerFactory 类中没有任何问题,尽管如上所述它并不是真正的工厂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      相关资源
      最近更新 更多