【问题标题】:Should an object know how to add itself to a data source?对象是否应该知道如何将自己添加到数据源?
【发布时间】:2012-01-25 14:28:51
【问题描述】:

我有一组对象,它们将从数据源一中读取并写入数据源二。

创建 IAddableToDataSourceTwo 接口之类的东西很诱人:

public interface IAddableToDataSourceTwo
    function addToDataSourceTwo(connection As DataSource2Connection) as Boolean

public class customer implements IAddableToDataSourceTwo
    public function addToDataSourceTwo(connection as DataSourceConnection) as Boolean
        insertSQL = "insert into customers values....."
        return connection.nonQuery(insertSQL)

但是,这似乎是一个滑坡。对象是否应该知道如何将自己添加到数据源?

另一种选择是做这样的事情......

public class DataSource2Writer()
    public function writeCustomer(connection, customer as Customer)
        insertSQL = "insert customer into customers values....."
        return connection.nonQuery(insertSQL)

   public function writeInvoice(connection, invoice as Invoice)
        insertSQL = "insert into Invoices values....."
        return connection.nonQuery(insertSQL)

这似乎少了很多 OO,但更安全地将客户对象与数据源解耦。

建议?

【问题讨论】:

  • 这是一个很好的问题,但似乎更多的是活跃记录和贫血域之间的讨论......

标签: oop


【解决方案1】:

在我看来,不,因为它违反了Single Responsibility Principle。但是,您的建议类似于 Active Record 模式。我想这取决于你的立场:SRP。

我经常问自己“一封信(或电子邮件)应该知道如何发送自己吗?”。答案始终是否定的。您通常会使用“LetterSender”类来执行此操作。或者,在您的情况下,是“CustomerDataMapper”。

【讨论】:

  • 我同意。在 OO 的早期,我们尝试将各种职责添加到对象本身中。我们制造了一些真正的混乱。仅供参考: OO 范例 ad adserdum 的一个很好的例子是 OS/2 的 Workplace Shell (WPS)。有人记得那件事吗?
猜你喜欢
  • 2023-01-12
  • 2011-05-07
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多