【问题标题】:OOP splitting a class into creation and usageOOP 将类拆分为创建和使用
【发布时间】:2013-05-26 14:02:53
【问题描述】:

如果这很重要,我正在使用 PHP,并且我使用名为 Product 的类来跟踪产品。 构造函数接受一个参数,即产品的 id。然后构造函数进入数据库并获取产品的所有信息并设置该实例的所有属性。完成所有操作后,用户可以调用 save() 函数,新信息将更新数据库中的产品

如果产品的 id 在构造函数中设置为零,那么产品类会理解这是一个新产品,并且不会获取任何变量。它允许您设置所有变量并验证它们。然后,当您调用 save() 函数时,它会创建产品并将产品的 id 设置为数据库中行的新 id。

我面临的问题是,如果产品正在创建并且由于没有 ID 而尚未保存,则无法调用某些函数。所以现在每次调用某些函数时,我都必须检查 ID > 0。

我想知道将类拆分为仅用于创建的类和用于使用现有产品(例如 Product 和 CreateProduct)的类是否是个好主意。这样做的好处是 Product 类可以始终假定产品已经创建,因此我不必检查它,并且所有验证方法都可以移动到单独的类并更好地管理。

只是想听听一些意见和任何建议。 谢谢, 亚历克斯

【问题讨论】:

  • 我认为在其他语言中这只是两个不同的构造函数,一个提供 ID,另一个不提供。
  • 如果您确定无论如何都会以某种方式保存产品实例,您不能通过在构造函数中插入一个空行来在数据库中保留 ID 吗?然后在“保存”方法中,您实际上会进行数据库更新,无论产品是否是新创建的。这样,任何构造的产品都可以确保有一个 ID(这通常是使用构造函数 = 来获得一个“安全”使用的对象)。
  • (可能在暂时的软件对象和持久的数据库驻留“对象”之间存在混淆。尽管软件对象是某种东西,但两者在物理上和概念上是分开的数据库驻留对象的“分身”。)
  • @darma - 其他可能的原因之一是新对象在创建持久身份之前可能被“放弃”,并且不想在这样一个蒸发的实体上“浪费”ID . (我目前正在从事的项目是,呃,Avovk 的分身。)
  • 阅读本文时我想到的是“按合同设计”,您的新产品可能会抛出异常,您可以将其包裹在产品或其他任何外观的后面......但这一切都取决于您正在尝试构建(保持简单)。尽管如此,我认为这是一个开放式的讨论,这不是 SO 的目的......所以这个问题很可能很快就会结束。没关系。

标签: oop design-patterns constructor


【解决方案1】:

简而言之,是的,我相信是的。听起来一般行为听起来像是未保存产品成为产品子类的候选者,但这也很大程度上取决于产品是否在脚本执行过程中定期从已保存转换为未保存。在这种情况下,您可以通过始终让 $product->save() 返回正确的对象实例来解决此问题。

一般来说,您也可以从这种模式中受益,因为将来如果您添加某种 Product::find($id) 方法,您可以根据从数据库加载的数据返回一个更具体的子类,或者在 0 的情况下,返回一个CreateProduct

我的学校认为,通过数据库 ID 初始化类通常是一种尴尬的做法,同时会为可能具体的东西创建分支逻辑。 “id是否存在?如果id不存在我会抛出异常吗?如果id不存在,我是否将id设置为null?”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多