Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OOP将类拆分为创建和使用_Oop_Design Patterns_Constructor - Fatal编程技术网

OOP将类拆分为创建和使用

OOP将类拆分为创建和使用,oop,design-patterns,constructor,Oop,Design Patterns,Constructor,如果这很重要的话,我会使用PHP,并使用一个名为Product的类跟踪产品。 构造函数接受一个参数,即产品的id。然后,构造函数进入数据库,获取产品的所有信息,并设置该实例的所有属性。完成所有操作后,用户可以调用save()函数,新信息将更新数据库中的产品 如果产品的id在构造函数中设置为零,那么产品类将理解这是一个新产品,并且不获取任何变量。它允许您设置所有变量并验证它们。然后,当调用save()函数时,它会创建产品,并将产品的id设置为数据库中行的新id 我面临的问题是,如果产品正在创建且尚

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

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

我面临的问题是,如果产品正在创建且尚未保存,则无法调用某些函数,因为它没有ID。因此,每次调用某些函数时,我必须检查ID>0

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

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

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

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


我所在的学校认为,用数据库ID初始化一个类通常是一种笨拙的做法,同时会为一些可能是具体的东西创建分支逻辑。“id是否存在?如果id不存在,是否引发异常?如果id不存在,是否将其设置为null?”

我认为在其他语言中,这可能只是两个不同的构造函数,一个提供id,另一个不提供。如果您确定产品实例无论如何都会被保存,您不能通过从构造函数中插入一个空行在数据库中保留ID吗?然后在“save”方法中,不管产品是新创建的还是未创建的,您都将实际执行db更新。通过这种方式,任何构造的产品都可以确保有一个ID(通常是使用构造函数=来获得一个“安全”使用的对象)。(可能是暂时的软件对象和驻留在数据库中的“对象”之间存在混淆,这是持久性的。虽然软件对象在某种程度上是数据库驻留对象的“翻版”,但这两者在物理上和概念上是分开的。)@darma-在其他可能的原因中,新对象可能在创建其持久性标识之前被“放弃”,人们不愿意“浪费”这样一个蒸汽实体上的ID。(我目前正在做一个项目,是Avovk的doppelganger。)读到这篇文章时,我想到的是“按合同设计”,你的新产品可能会抛出异常,你可以将其包装在产品或其他东西的外观后面。。。但这一切都取决于您试图构建的内容(保持简单)。尽管如此,我认为这是一个太多的不限成员名额的讨论,而不是这样做是为了。。。所以这个问题很可能很快就会结束。没有关系。